Skip to content

Commit b9c3040

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 5dbed50 commit b9c3040

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
@@ -97,38 +97,41 @@ static uint_t zfs_vdev_open_timeout_ms = 1000;
9797

9898
static unsigned int zfs_vdev_failfast_mask = 1;
9999

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

113-
if (spa_mode & SPA_MODE_WRITE)
114-
mode |= BLK_OPEN_WRITE;
117+
static vdev_bdev_mode_t
118+
vdev_bdev_mode(spa_mode_t smode)
119+
{
120+
ASSERT3U(smode, !=, SPA_MODE_UNINIT);
121+
ASSERT0(smode & ~(SPA_MODE_READ|SPA_MODE_WRITE));
115122

116-
if (exclusive)
117-
mode |= BLK_OPEN_EXCL;
118-
#else
119-
fmode_t mode = 0;
123+
vdev_bdev_mode_t bmode = VDEV_BDEV_MODE_EXCL;
120124

121-
if (spa_mode & SPA_MODE_READ)
122-
mode |= FMODE_READ;
125+
if (smode & SPA_MODE_READ)
126+
bmode |= VDEV_BDEV_MODE_READ;
123127

124-
if (spa_mode & SPA_MODE_WRITE)
125-
mode |= FMODE_WRITE;
128+
if (smode & SPA_MODE_WRITE)
129+
bmode |= VDEV_BDEV_MODE_WRITE;
126130

127-
if (exclusive)
128-
mode |= FMODE_EXCL;
129-
#endif
131+
ASSERT(bmode & VDEV_BDEV_MODE_MASK);
132+
ASSERT0(bmode & ~VDEV_BDEV_MODE_MASK);
130133

131-
return (mode);
134+
return (bmode);
132135
}
133136

134137
/*
@@ -235,30 +238,28 @@ vdev_disk_kobj_evt_post(vdev_t *v)
235238
}
236239

237240
static zfs_bdev_handle_t *
238-
vdev_blkdev_get_by_path(const char *path, spa_mode_t mode, void *holder)
241+
vdev_blkdev_get_by_path(const char *path, spa_mode_t smode, void *holder)
239242
{
243+
vdev_bdev_mode_t bmode = vdev_bdev_mode(smode);
244+
240245
#if defined(HAVE_BDEV_OPEN_BY_PATH)
241-
return (bdev_open_by_path(path,
242-
vdev_bdev_mode(mode, B_TRUE), holder, NULL));
246+
return (bdev_open_by_path(path, bmode, holder, NULL));
243247
#elif defined(HAVE_BLKDEV_GET_BY_PATH_4ARG)
244-
return (blkdev_get_by_path(path,
245-
vdev_bdev_mode(mode, B_TRUE), holder, NULL));
248+
return (blkdev_get_by_path(path, bmode, holder, NULL));
246249
#else
247-
return (blkdev_get_by_path(path,
248-
vdev_bdev_mode(mode, B_TRUE), holder));
250+
return (blkdev_get_by_path(path, bmode, holder));
249251
#endif
250252
}
251253

252254
static void
253-
vdev_blkdev_put(zfs_bdev_handle_t *bdh, spa_mode_t mode, void *holder)
255+
vdev_blkdev_put(zfs_bdev_handle_t *bdh, spa_mode_t smode, void *holder)
254256
{
255257
#if defined(HAVE_BDEV_RELEASE)
256258
return (bdev_release(bdh));
257259
#elif defined(HAVE_BLKDEV_PUT_HOLDER)
258260
return (blkdev_put(BDH_BDEV(bdh), holder));
259261
#else
260-
return (blkdev_put(BDH_BDEV(bdh),
261-
vdev_bdev_mode(mode, B_TRUE)));
262+
return (blkdev_put(BDH_BDEV(bdh), vdev_bdev_mode(smode)));
262263
#endif
263264
}
264265

@@ -267,11 +268,7 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
267268
uint64_t *logical_ashift, uint64_t *physical_ashift)
268269
{
269270
zfs_bdev_handle_t *bdh;
270-
#ifdef HAVE_BLK_MODE_T
271-
blk_mode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa), B_FALSE);
272-
#else
273-
fmode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa), B_FALSE);
274-
#endif
271+
spa_mode_t smode = spa_mode(v->vdev_spa);
275272
hrtime_t timeout = MSEC2NSEC(zfs_vdev_open_timeout_ms);
276273
vdev_disk_t *vd;
277274

@@ -322,16 +319,16 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
322319
reread_part = B_TRUE;
323320
}
324321

325-
vdev_blkdev_put(bdh, mode, zfs_vdev_holder);
322+
vdev_blkdev_put(bdh, smode, zfs_vdev_holder);
326323
}
327324

328325
if (reread_part) {
329-
bdh = vdev_blkdev_get_by_path(disk_name, mode,
326+
bdh = vdev_blkdev_get_by_path(disk_name, smode,
330327
zfs_vdev_holder);
331328
if (!BDH_IS_ERR(bdh)) {
332329
int error =
333330
vdev_bdev_reread_part(BDH_BDEV(bdh));
334-
vdev_blkdev_put(bdh, mode, zfs_vdev_holder);
331+
vdev_blkdev_put(bdh, smode, zfs_vdev_holder);
335332
if (error == 0) {
336333
timeout = MSEC2NSEC(
337334
zfs_vdev_open_timeout_ms * 2);
@@ -376,7 +373,7 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
376373
hrtime_t start = gethrtime();
377374
bdh = BDH_ERR_PTR(-ENXIO);
378375
while (BDH_IS_ERR(bdh) && ((gethrtime() - start) < timeout)) {
379-
bdh = vdev_blkdev_get_by_path(v->vdev_path, mode,
376+
bdh = vdev_blkdev_get_by_path(v->vdev_path, smode,
380377
zfs_vdev_holder);
381378
if (unlikely(BDH_PTR_ERR(bdh) == -ENOENT)) {
382379
/*

0 commit comments

Comments
 (0)