From 2d3c3fd6546174a0452c9bbd64d4f4193c0c39e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Moritz=20WanzenBug=20Wanzenb=C3=B6ck?= Date: Wed, 13 Sep 2023 11:26:35 +0200 Subject: [PATCH] compat: block: replace fmode_t with a block-specific type for block open flags See also upstream Linux kernel commit 05bdb9965305 ("block: replace fmode_t with a block-specific type for block open flags" Original message: The only overlap between the block open flags mapped into the fmode_t and other uses of fmode_t are FMODE_READ and FMODE_WRITE. Define a new blk_mode_t instead for use in blkdev_get_by_{dev,path}, ->open and ->ioctl and stop abusing fmode_t. --- .../cocci/blk_mode_t__no_present.cocci | 19 ++++++++++++++ drbd/drbd-kernel-compat/gen_patch_names.c | 3 +++ .../tests/have_blk_mode_t.c | 4 +++ drbd/drbd_main.c | 26 +++++++++---------- 4 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci create mode 100644 drbd/drbd-kernel-compat/tests/have_blk_mode_t.c diff --git a/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci b/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci new file mode 100644 index 000000000000..030723c817de --- /dev/null +++ b/drbd/drbd-kernel-compat/cocci/blk_mode_t__no_present.cocci @@ -0,0 +1,19 @@ +@@ +identifier fn; +identifier mode; +@@ + fn ( + ..., +- blk_mode_t mode ++ fmode_t mode + ) { + <... +( +- BLK_OPEN_WRITE ++ FMODE_WRITE +| +- BLK_OPEN_NDELAY ++ FMODE_NDELAY +) + ...> + } diff --git a/drbd/drbd-kernel-compat/gen_patch_names.c b/drbd/drbd-kernel-compat/gen_patch_names.c index 6a96c5b89f11..e4a65a3c451e 100644 --- a/drbd/drbd-kernel-compat/gen_patch_names.c +++ b/drbd/drbd-kernel-compat/gen_patch_names.c @@ -571,6 +571,9 @@ int main(int argc, char **argv) patch(1, "block_device_operations_release", true, false, COMPAT_BLOCK_DEVICE_OPERATIONS_RELEASE_TAKES_SINGLE_ARGUMENT, "takes_single_argument"); + patch(1, "blk_mode_t", true, false, + COMPAT_HAVE_BLK_MODE_T, "present"); + /* #define BLKDEV_ISSUE_ZEROOUT_EXPORTED */ /* #define BLKDEV_ZERO_NOUNMAP */ diff --git a/drbd/drbd-kernel-compat/tests/have_blk_mode_t.c b/drbd/drbd-kernel-compat/tests/have_blk_mode_t.c new file mode 100644 index 000000000000..e063bdc30f43 --- /dev/null +++ b/drbd/drbd-kernel-compat/tests/have_blk_mode_t.c @@ -0,0 +1,4 @@ +/* { "version": "v6.5-rc1", "commit": "05bdb9965305bbfdae79b31d22df03d1e2cfcb22", "comment": "block: replace fmode_t with a block-specific type for block open flags", "author": "Christoph Hellwig ", "date": "Thu Jun 8 13:02:55 2023 +0200" } */ +#include + +void foo(blk_mode_t mode) {} diff --git a/drbd/drbd_main.c b/drbd/drbd_main.c index 0719229f210e..f9560bdff63f 100644 --- a/drbd/drbd_main.c +++ b/drbd/drbd_main.c @@ -52,7 +52,7 @@ #include "drbd_meta_data.h" #include "drbd_dax_pmem.h" -static int drbd_open(struct gendisk *gd, fmode_t mode); +static int drbd_open(struct gendisk *gd, blk_mode_t mode); static void drbd_release(struct gendisk *gd); static void md_sync_timer_fn(struct timer_list *t); static int w_bitmap_io(struct drbd_work *w, int unused); @@ -2566,10 +2566,10 @@ enum ioc_rv { IOC_ABORT = 2, }; -static enum ioc_rv inc_open_count(struct drbd_device *device, fmode_t mode) +static enum ioc_rv inc_open_count(struct drbd_device *device, blk_mode_t mode) { struct drbd_resource *resource = device->resource; - enum ioc_rv r = mode & FMODE_NDELAY ? IOC_ABORT : IOC_SLEEP; + enum ioc_rv r = mode & BLK_OPEN_NDELAY ? IOC_ABORT : IOC_SLEEP; if (test_bit(DOWN_IN_PROGRESS, &resource->flags)) return IOC_ABORT; @@ -2580,7 +2580,7 @@ static enum ioc_rv inc_open_count(struct drbd_device *device, fmode_t mode) else if (!resource->remote_state_change) { r = IOC_OK; device->open_cnt++; - if (mode & FMODE_WRITE) + if (mode & BLK_OPEN_WRITE) device->writable = true; } read_unlock_irq(&resource->state_rwlock); @@ -2646,7 +2646,7 @@ out: spin_unlock(&device->openers_lock); } -static int drbd_open(struct gendisk *gd, fmode_t mode) +static int drbd_open(struct gendisk *gd, blk_mode_t mode) { struct drbd_device *device = gd->private_data; struct drbd_resource *resource = device->resource; @@ -2655,7 +2655,7 @@ static int drbd_open(struct gendisk *gd, fmode_t mode) int err = 0; /* Fail read-only open from systemd-udev (version <= 238) */ - if (!(mode & FMODE_WRITE) && !drbd_allow_oos) { + if (!(mode & BLK_OPEN_WRITE) && !drbd_allow_oos) { char comm[TASK_COMM_LEN]; get_task_comm(comm, current); if (!strcmp("systemd-udevd", comm)) @@ -2664,7 +2664,7 @@ static int drbd_open(struct gendisk *gd, fmode_t mode) /* Fail read-write open early, * in case someone explicitly set us read-only (blockdev --setro) */ - if (bdev_read_only(gd->part0) && (mode & FMODE_WRITE)) + if (bdev_read_only(gd->part0) && (mode & BLK_OPEN_WRITE)) return -EACCES; if (resource->fail_io[NOW]) @@ -2693,14 +2693,14 @@ static int drbd_open(struct gendisk *gd, fmode_t mode) This avoids split brain when the drbd volume gets opened temporarily by udev while it scans for PV signatures. */ - if (mode & FMODE_WRITE) { + if (mode & BLK_OPEN_WRITE) { if (resource->role[NOW] == R_SECONDARY) { - rv = try_to_promote(device, timeout, (mode & FMODE_NDELAY)); + rv = try_to_promote(device, timeout, (mode & BLK_OPEN_NDELAY)); if (rv < SS_SUCCESS) drbd_info(resource, "Auto-promote failed: %s (%d)\n", drbd_set_st_err_str(rv), rv); } - } else if ((mode & FMODE_NDELAY) == 0) { + } else if ((mode & BLK_OPEN_NDELAY) == 0) { /* Double check peers * * Some services may try to first open ro, and only if that @@ -2720,14 +2720,14 @@ static int drbd_open(struct gendisk *gd, fmode_t mode) } } } else if (resource->role[NOW] != R_PRIMARY && - !(mode & FMODE_WRITE) && !drbd_allow_oos) { + !(mode & BLK_OPEN_WRITE) && !drbd_allow_oos) { err = -EMEDIUMTYPE; goto out; } if (test_bit(UNREGISTERED, &device->flags)) { err = -ENODEV; - } else if (mode & FMODE_WRITE) { + } else if (mode & BLK_OPEN_WRITE) { if (resource->role[NOW] != R_PRIMARY) err = -EROFS; } else /* READ access only */ { @@ -2741,7 +2741,7 @@ out: mutex_unlock(&resource->open_release); if (err) { drbd_release(gd); - if (err == -EAGAIN && !(mode & FMODE_NDELAY)) + if (err == -EAGAIN && !(mode & BLK_OPEN_NDELAY)) err = -EMEDIUMTYPE; } -- 2.42.1