[Drbd-dev] [PATCH] drbdmeta: Fix drbdmeta to support old kernels

Lars Ellenberg lars.ellenberg at linbit.com
Thu Aug 17 11:59:25 CEST 2017


On Thu, Aug 17, 2017 at 04:57:12AM +0300, Artem Pogartsev wrote:
> Hello,
> 
> RedHat 6.9
> kernel-2.6.32-431.11.2
> drbd-utils-9.0.0
> drbd-8.4.10
> 
> Problem:
> 
> drbdmeta 0 v08 /dev/sda internal create-md
> initializing activity log
> initializing bitmap (30524 KB) to all zero
> ioctl(/dev/sda) failed: Invalid argument

Thanks for pointing this out.

I'm about to commit this instead:

    drbdmeta compat: fixup fallback path for BLKZEROOUT for older kernels
    
    Based on a suggestion on drbd-dev by
     From: Artem Pogartsev <artem.pogartsev at activecloud.com>
     Date: Thu, 17 Aug 2017 04:57:12 +0300
     To: drbd-dev at lists.linbit.com
     Subject: [PATCH] drbdmeta: Fix drbdmeta to support old kernels
     Message-ID: <a1c1b596-8259-a2cf-3b1b-6461761bbca4 at activecloud.com>
    
    Though I chose to always execute the fallback code
    if the ioctl BLKZEROOUT fails, regardless of errno.
    
    As a side note,
    just because the define BLKZEROOUT is not in the (userland) headers
    (yet) does not necessarily mean the kernel does not know it.

diff --git a/user/shared/drbdmeta.c b/user/shared/drbdmeta.c
index 6ff877a..86f32ed 100644
--- a/user/shared/drbdmeta.c
+++ b/user/shared/drbdmeta.c
@@ -60,7 +60,12 @@
 
 #include "config.h"
 
-/* BLKZEROOUT, available on linux-3.6 and later. */
+/* BLKZEROOUT, available on linux-3.6 and later,
+ * and maybe backported to distribution kernels,
+ * even if they pretend to be older.
+ * Yes, we encountered a number of systems that already had it in their
+ * kernels, but not yet in the headers used to build userland stuff like this.
+ */
 #ifndef BLKZEROOUT
 # define BLKZEROOUT	_IO(0x12,127)
 #endif
@@ -1716,7 +1721,11 @@ static void zeroout_bitmap(struct format *cfg)
 	if (!err)
 		return;
 
-	if (errno == ENOTTY) {
+	PERROR("ioctl(%s, BLKZEROOUT, [%llu, %llu]) failed", cfg->md_device_name,
+			(unsigned long long)range[0], (unsigned long long)range[1]);
+	fprintf(stderr, "Using slow(er) fallback.\n");
+
+	{
 		/* need to sector-align this for O_DIRECT.
 		 * "sector" here means hard-sect size, which may be != 512.
 		 * Note that even though ALIGN does round up, for sector sizes
@@ -1744,9 +1753,6 @@ static void zeroout_bitmap(struct format *cfg)
 			}
 		}
 		fprintf(stderr,"\r100%%\n");
-	} else {
-		PERROR("ioctl(%s) failed", cfg->md_device_name);
-		exit(10);
 	}
 }
 


More information about the drbd-dev mailing list