Skip to content

Commit

Permalink
Linux 6.5 compat: check BLK_OPEN_EXCL is defined
Browse files Browse the repository at this point in the history
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 openzfs#15692
(cherry picked from commit d530d5d)
  • Loading branch information
behlendorf authored and robn committed Feb 7, 2024
1 parent e92ae1b commit d094732
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions module/os/linux/zfs/vdev_disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ static blk_mode_t
#else
static fmode_t
#endif
vdev_bdev_mode(spa_mode_t spa_mode)
vdev_bdev_mode(spa_mode_t spa_mode, boolean_t exclusive)
{
#ifdef HAVE_BLK_MODE_T
blk_mode_t mode = 0;
Expand All @@ -89,6 +89,9 @@ vdev_bdev_mode(spa_mode_t spa_mode)

if (spa_mode & SPA_MODE_WRITE)
mode |= BLK_OPEN_WRITE;

if (exclusive)
mode |= BLK_OPEN_EXCL;
#else
fmode_t mode = 0;

Expand All @@ -97,6 +100,9 @@ vdev_bdev_mode(spa_mode_t spa_mode)

if (spa_mode & SPA_MODE_WRITE)
mode |= FMODE_WRITE;

if (exclusive)
mode |= FMODE_EXCL;
#endif

return (mode);
Expand Down Expand Up @@ -219,10 +225,10 @@ vdev_blkdev_get_by_path(const char *path, spa_mode_t mode, void *holder,
{
#ifdef HAVE_BLKDEV_GET_BY_PATH_4ARG
return (blkdev_get_by_path(path,
vdev_bdev_mode(mode) | BLK_OPEN_EXCL, holder, hops));
vdev_bdev_mode(mode, B_TRUE), holder, hops));
#else
return (blkdev_get_by_path(path,
vdev_bdev_mode(mode) | FMODE_EXCL, holder));
vdev_bdev_mode(mode, B_TRUE), holder));
#endif
}

Expand All @@ -232,7 +238,7 @@ vdev_blkdev_put(struct block_device *bdev, spa_mode_t mode, void *holder)
#ifdef HAVE_BLKDEV_PUT_HOLDER
return (blkdev_put(bdev, holder));
#else
return (blkdev_put(bdev, vdev_bdev_mode(mode) | FMODE_EXCL));
return (blkdev_put(bdev, vdev_bdev_mode(mode, B_TRUE)));
#endif
}

Expand All @@ -242,9 +248,9 @@ vdev_disk_open(vdev_t *v, uint64_t *psize, uint64_t *max_psize,
{
struct block_device *bdev;
#ifdef HAVE_BLK_MODE_T
blk_mode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa));
blk_mode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa), B_FALSE);
#else
fmode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa));
fmode_t mode = vdev_bdev_mode(spa_mode(v->vdev_spa), B_FALSE);
#endif
hrtime_t timeout = MSEC2NSEC(zfs_vdev_open_timeout_ms);
vdev_disk_t *vd;
Expand Down

0 comments on commit d094732

Please sign in to comment.