Skip to content

Commit 6efea26

Browse files
robntonyhutter
authored andcommitted
vdev_disk: clean up spa/bdev mode conversion
43e8f6e introduced a subtle API misuse, in that it passed the output from vdev_bdev_mode() back into itself. Fortunately, the SPA_MODE_(READ|WRITE) bit values exactly map to the FMODE_(READ|WRITE) & BLK_OPEN_(READ|WRITE) bit values, so it didn't result in a bug, but it was hard to read and understand, so I cleaned it up. In doing so, I noticed that the only call to vdev_bdev_mode() without the "exclusive" flag set was in that misuse, and actually, we never do a non-exclusive blkdev_get_by_path(). So I've just made exclusive be always-on. Sponsored-by: Klara, Inc. Sponsored-by: Wasabi Technology, Inc. Reviewed by: Brian Behlendorf <[email protected]> Reviewed-by: Allan Jude <[email protected]> Signed-off-by: Rob Norris <[email protected]> Closes #15995
1 parent fb6d532 commit 6efea26

File tree

1 file changed

+39
-42
lines changed

1 file changed

+39
-42
lines changed

module/os/linux/zfs/vdev_disk.c

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -94,38 +94,41 @@ typedef struct dio_request {
9494
struct bio *dr_bio[0]; /* Attached bio's */
9595
} dio_request_t;
9696

97+
/*
98+
* Convert SPA mode flags into bdev open mode flags.
99+
*/
97100
#ifdef HAVE_BLK_MODE_T
98-
static blk_mode_t
101+
typedef blk_mode_t vdev_bdev_mode_t;
102+
#define VDEV_BDEV_MODE_READ BLK_OPEN_READ
103+
#define VDEV_BDEV_MODE_WRITE BLK_OPEN_WRITE
104+
#define VDEV_BDEV_MODE_EXCL BLK_OPEN_EXCL
105+
#define VDEV_BDEV_MODE_MASK (BLK_OPEN_READ|BLK_OPEN_WRITE|BLK_OPEN_EXCL)
99106
#else
100-
static fmode_t
107+
typedef fmode_t vdev_bdev_mode_t;
108+
#define VDEV_BDEV_MODE_READ FMODE_READ
109+
#define VDEV_BDEV_MODE_WRITE FMODE_WRITE
110+
#define VDEV_BDEV_MODE_EXCL FMODE_EXCL
111+
#define VDEV_BDEV_MODE_MASK (FMODE_READ|FMODE_WRITE|FMODE_EXCL)
101112
#endif
102-
vdev_bdev_mode(spa_mode_t spa_mode, boolean_t exclusive)
103-
{
104-
#ifdef HAVE_BLK_MODE_T
105-
blk_mode_t mode = 0;
106-
107-
if (spa_mode & SPA_MODE_READ)
108-
mode |= BLK_OPEN_READ;
109113

110-
if (spa_mode & SPA_MODE_WRITE)
111-
mode |= BLK_OPEN_WRITE;
114+
static vdev_bdev_mode_t
115+
vdev_bdev_mode(spa_mode_t smode)
116+
{
117+
ASSERT3U(smode, !=, SPA_MODE_UNINIT);
118+
ASSERT0(smode & ~(SPA_MODE_READ|SPA_MODE_WRITE));
112119

113-
if (exclusive)
114-
mode |= BLK_OPEN_EXCL;
115-
#else
116-
fmode_t mode = 0;
120+
vdev_bdev_mode_t bmode = VDEV_BDEV_MODE_EXCL;
117121

118-
if (spa_mode & SPA_MODE_READ)
119-
mode |= FMODE_READ;
122+
if (smode & SPA_MODE_READ)
123+
bmode |= VDEV_BDEV_MODE_READ;
120124

121-
if (spa_mode & SPA_MODE_WRITE)
122-
mode |= FMODE_WRITE;
125+
if (smode & SPA_MODE_WRITE)
126+
bmode |= VDEV_BDEV_MODE_WRITE;
123127

124-
if (exclusive)
125-
mode |= FMODE_EXCL;
126-
#endif
128+
ASSERT(bmode & VDEV_BDEV_MODE_MASK);
129+
ASSERT0(bmode & ~VDEV_BDEV_MODE_MASK);
127130

128-
return (mode);
131+
return (bmode);
129132
}
130133

131134
/*
@@ -232,30 +235,28 @@ vdev_disk_kobj_evt_post(vdev_t *v)
232235
}
233236

234237
static zfs_bdev_handle_t *
235-
vdev_blkdev_get_by_path(const char *path, spa_mode_t mode, void *holder)
238+
vdev_blkdev_get_by_path(const char *path, spa_mode_t smode, void *holder)
236239
{
240+
vdev_bdev_mode_t bmode = vdev_bdev_mode(smode);
241+
237242
#if defined(HAVE_BDEV_OPEN_BY_PATH)
238-
return (bdev_open_by_path(path,
239-
vdev_bdev_mode(mode, B_TRUE), holder, NULL));
243+
return (bdev_open_by_path(path, bmode, holder, NULL));
240244
#elif defined(HAVE_BLKDEV_GET_BY_PATH_4ARG)
241-
return (blkdev_get_by_path(path,
242-
vdev_bdev_mode(mode, B_TRUE), holder, NULL));
245+
return (blkdev_get_by_path(path, bmode, holder, NULL));
243246
#else
244-
return (blkdev_get_by_path(path,
245-
vdev_bdev_mode(mode, B_TRUE), holder));
247+
return (blkdev_get_by_path(path, bmode, holder));
246248
#endif
247249
}
248250

249251
static void
250-
vdev_blkdev_put(zfs_bdev_handle_t *bdh, spa_mode_t mode, void *holder)
252+
vdev_blkdev_put(zfs_bdev_handle_t *bdh, spa_mode_t smode, void *holder)
251253
{
252254
#if defined(HAVE_BDEV_RELEASE)
253255
return (bdev_release(bdh));
254256
#elif defined(HAVE_BLKDEV_PUT_HOLDER)
255257
return (blkdev_put(BDH_BDEV(bdh), holder));
256258
#else
257-
return (blkdev_put(BDH_BDEV(bdh),
258-
vdev_bdev_mode(mode, B_TRUE)));
259+
return (blkdev_put(BDH_BDEV(bdh), vdev_bdev_mode(smode)));
259260
#endif
260261
}
261262

@@ -264,11 +265,7 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
264265
uint64_t *logical_ashift, uint64_t *physical_ashift)
265266
{
266267
zfs_bdev_handle_t *bdh;
267-
#ifdef HAVE_BLK_MODE_T
268-
blk_mode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa), B_FALSE);
269-
#else
270-
fmode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa), B_FALSE);
271-
#endif
268+
spa_mode_t smode = spa_mode(v->vdev_spa);
272269
hrtime_t timeout = MSEC2NSEC(zfs_vdev_open_timeout_ms);
273270
vdev_disk_t *vd;
274271

@@ -319,16 +316,16 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
319316
reread_part = B_TRUE;
320317
}
321318

322-
vdev_blkdev_put(bdh, mode, zfs_vdev_holder);
319+
vdev_blkdev_put(bdh, smode, zfs_vdev_holder);
323320
}
324321

325322
if (reread_part) {
326-
bdh = vdev_blkdev_get_by_path(disk_name, mode,
323+
bdh = vdev_blkdev_get_by_path(disk_name, smode,
327324
zfs_vdev_holder);
328325
if (!BDH_IS_ERR(bdh)) {
329326
int error =
330327
vdev_bdev_reread_part(BDH_BDEV(bdh));
331-
vdev_blkdev_put(bdh, mode, zfs_vdev_holder);
328+
vdev_blkdev_put(bdh, smode, zfs_vdev_holder);
332329
if (error == 0) {
333330
timeout = MSEC2NSEC(
334331
zfs_vdev_open_timeout_ms * 2);
@@ -373,7 +370,7 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
373370
hrtime_t start = gethrtime();
374371
bdh = BDH_ERR_PTR(-ENXIO);
375372
while (BDH_IS_ERR(bdh) && ((gethrtime() - start) < timeout)) {
376-
bdh = vdev_blkdev_get_by_path(v->vdev_path, mode,
373+
bdh = vdev_blkdev_get_by_path(v->vdev_path, smode,
377374
zfs_vdev_holder);
378375
if (unlikely(BDH_PTR_ERR(bdh) == -ENOENT)) {
379376
/*

0 commit comments

Comments
 (0)