184 lines
6.4 KiB
Diff
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
|
||
|
|