File 0022-compat-block-replace-fmode_t-with-a-block-specific-t.patch of Package drbd

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

openSUSE Build Service is sponsored by