Skip to content

Commit d530d5d

Browse files
committed
Linux 6.5 compat: check BLK_OPEN_EXCL is defined
On some systems we already have blkdev_get_by_path() with 4 args but still the old FMODE_EXCL and not BLK_OPEN_EXCL defined. The vdev_bdev_mode() function was added to handle this case but there was no generic way to specify exclusive access. Reviewed-by: Brian Atkinson <[email protected]> Signed-off-by: Brian Behlendorf <[email protected]> Closes #15692
1 parent 3c502e3 commit d530d5d

File tree

1 file changed

+12
-6
lines changed

1 file changed

+12
-6
lines changed

module/os/linux/zfs/vdev_disk.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ static blk_mode_t
8585
#else
8686
static fmode_t
8787
#endif
88-
vdev_bdev_mode(spa_mode_t spa_mode)
88+
vdev_bdev_mode(spa_mode_t spa_mode, boolean_t exclusive)
8989
{
9090
#ifdef HAVE_BLK_MODE_T
9191
blk_mode_t mode = 0;
@@ -95,6 +95,9 @@ vdev_bdev_mode(spa_mode_t spa_mode)
9595

9696
if (spa_mode & SPA_MODE_WRITE)
9797
mode |= BLK_OPEN_WRITE;
98+
99+
if (exclusive)
100+
mode |= BLK_OPEN_EXCL;
98101
#else
99102
fmode_t mode = 0;
100103

@@ -103,6 +106,9 @@ vdev_bdev_mode(spa_mode_t spa_mode)
103106

104107
if (spa_mode & SPA_MODE_WRITE)
105108
mode |= FMODE_WRITE;
109+
110+
if (exclusive)
111+
mode |= FMODE_EXCL;
106112
#endif
107113

108114
return (mode);
@@ -225,10 +231,10 @@ vdev_blkdev_get_by_path(const char *path, spa_mode_t mode, void *holder,
225231
{
226232
#ifdef HAVE_BLKDEV_GET_BY_PATH_4ARG
227233
return (blkdev_get_by_path(path,
228-
vdev_bdev_mode(mode) | BLK_OPEN_EXCL, holder, hops));
234+
vdev_bdev_mode(mode, B_TRUE), holder, hops));
229235
#else
230236
return (blkdev_get_by_path(path,
231-
vdev_bdev_mode(mode) | FMODE_EXCL, holder));
237+
vdev_bdev_mode(mode, B_TRUE), holder));
232238
#endif
233239
}
234240

@@ -238,7 +244,7 @@ vdev_blkdev_put(struct block_device *bdev, spa_mode_t mode, void *holder)
238244
#ifdef HAVE_BLKDEV_PUT_HOLDER
239245
return (blkdev_put(bdev, holder));
240246
#else
241-
return (blkdev_put(bdev, vdev_bdev_mode(mode) | FMODE_EXCL));
247+
return (blkdev_put(bdev, vdev_bdev_mode(mode, B_TRUE)));
242248
#endif
243249
}
244250

@@ -248,9 +254,9 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
248254
{
249255
struct block_device *bdev;
250256
#ifdef HAVE_BLK_MODE_T
251-
blk_mode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa));
257+
blk_mode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa), B_FALSE);
252258
#else
253-
fmode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa));
259+
fmode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa), B_FALSE);
254260
#endif
255261
hrtime_t timeout = MSEC2NSEC(zfs_vdev_open_timeout_ms);
256262
vdev_disk_t *vd;

0 commit comments

Comments
 (0)