drbd/0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch

184 lines
6.4 KiB
Diff

From 2d3c3fd6546174a0452c9bbd64d4f4193c0c39e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Moritz=20WanzenBug=20Wanzenb=C3=B6ck?=
<moritz.wanzenboeck@linbit.com>
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 <hch@lst.de>", "date": "Thu Jun 8 13:02:55 2023 +0200" } */
+#include <linux/blkdev.h>
+
+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