[DRBD-user] PATCH. Fixing compilation problems of drbd-0.7.25 on linux v2.6.23.x and v2.6.24.x.

Igor Zhbanov izh1979 at gmail.com
Sun Feb 17 22:11:36 CET 2008

Note: "permalinks" may not be as permanent as we would like,
direct links of old sources may well be a few messages off.


Hello!

Few days ago I have realized that drbd-0.7.25 have compilation
problems on linux kernels newer than 2.6.22.x. I have posted a
question but there are still no answers So I have made a patch by
back-porting changes from drbd-8.x branch. Please test.

diff -ur drbd-0.7.25/drbd/drbd_compat_wrappers.h
drbd/drbd/drbd_compat_wrappers.h
--- drbd-0.7.25/drbd/drbd_compat_wrappers.h	2007-10-10 18:41:13.000000000 +0400
+++ drbd/drbd/drbd_compat_wrappers.h	2008-02-15 19:52:48.000000000 +0300
@@ -333,7 +333,6 @@

 // bi_end_io handlers
 // int (bio_end_io_t) (struct bio *, unsigned int, int);
-extern int drbd_md_io_complete     (struct bio *bio, unsigned int
bytes_done, int error);
 extern int enslaved_read_bi_end_io (struct bio *bio, unsigned int
bytes_done, int error);
 extern int drbd_dio_end_sec        (struct bio *bio, unsigned int
bytes_done, int error);
 extern int drbd_dio_end            (struct bio *bio, unsigned int
bytes_done, int error);
@@ -369,6 +368,41 @@
 	}
 }

+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+/* Before Linux-2.6.24 bie_endio() had the size of the bio as second argument.
+   See 6712ecf8f648118c3363c142196418f89a510b90 */
+#define bio_endio(B,E) bio_endio(B, (B)->bi_size, E)
+#define BIO_ENDIO_FN(name) int name(struct bio *bio, unsigned int
bytes_done, int error)
+#define BIO_ENDIO_FN_START if (bio->bi_size) return 1
+#define BIO_ENDIO_FN_RETURN return 0
+#else
+#define BIO_ENDIO_FN(name) void name(struct bio *bio, int error)
+#define BIO_ENDIO_FN_START while(0) {}
+#define BIO_ENDIO_FN_RETURN return
+#endif
+
+// bi_end_io handlers
+extern BIO_ENDIO_FN(drbd_md_io_complete);
+extern BIO_ENDIO_FN(drbd_endio_read_sec);
+extern BIO_ENDIO_FN(drbd_endio_write_sec);
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
+/* Before 2.6.23 (with 20c2df83d25c6a95affe6157a4c9cac4cf5ffaac)
kmem_cache_create had a
+   ctor and a dtor */
+#define kmem_cache_create(N,S,A,F,C) kmem_cache_create(N,S,A,F,C,NULL)
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,23)
+static inline void drbd_unregister_blkdev(unsigned int major, const char *name)
+{
+        int ret = unregister_blkdev(major,name);
+        if (ret)
+                printk(KERN_ERR "drbd: unregister of device failed\n");
+}
+#else
+#define drbd_unregister_blkdev unregister_blkdev
+#endif
+
 static inline int drbd_sync_me(drbd_dev *mdev)
 {
 	return fsync_bdev(mdev->this_bdev);
@@ -378,12 +412,12 @@

 static inline void drbd_bio_IO_error(struct bio *bio)
 {
-	bio_endio(bio,bio->bi_size,-EIO);
+	bio_endio(bio,-EIO);
 }

 static inline void drbd_bio_endio(struct bio *bio, int uptodate)
 {
-	bio_endio(bio,bio->bi_size,uptodate ? 0 : -EIO);
+	bio_endio(bio,uptodate ? 0 : -EIO);
 }

 static inline drbd_dev* drbd_req_get_mdev(struct drbd_request *req)
diff -ur drbd-0.7.25/drbd/drbd_main.c drbd/drbd/drbd_main.c
--- drbd-0.7.25/drbd/drbd_main.c	2007-10-10 18:41:14.000000000 +0400
+++ drbd/drbd/drbd_main.c	2008-02-15 19:33:56.000000000 +0300
@@ -1647,13 +1647,13 @@
 	// caches
 	drbd_request_cache = kmem_cache_create(
 		"drbd_req_cache", sizeof(drbd_request_t),
-		0, 0, NULL, NULL);
+		0, 0, NULL);
 	if (drbd_request_cache == NULL)
 		goto Enomem;

 	drbd_ee_cache = kmem_cache_create(
 		"drbd_ee_cache", sizeof(struct Tl_epoch_entry),
-		0, 0, NULL, NULL);
+		0, 0, NULL);
 	if (drbd_ee_cache == NULL)
 		goto Enomem;

@@ -1799,8 +1799,7 @@
 #endif
 #endif

-	if (unregister_blkdev(MAJOR_NR, DEVICE_NAME) != 0)
-		printk(KERN_ERR DEVICE_NAME": unregister of device failed\n");
+	drbd_unregister_blkdev(MAJOR_NR, DEVICE_NAME);

 	printk(KERN_INFO DEVICE_NAME": module cleanup done.\n");
 }
diff -ur drbd-0.7.25/drbd/drbd_req.c drbd/drbd/drbd_req.c
--- drbd-0.7.25/drbd/drbd_req.c	2007-10-10 18:41:14.000000000 +0400
+++ drbd/drbd/drbd_req.c	2008-02-15 19:29:23.000000000 +0300
@@ -172,7 +172,7 @@
 	ONLY_IN_26(
 	/* Currently our BARRIER code is disabled. */
 	if(unlikely(bio_barrier(bio))) {
-		bio_endio(bio, bio->bi_size, -EOPNOTSUPP);
+		bio_endio(bio, -EOPNOTSUPP);
 		return 0;
 	}
 	)
diff -ur drbd-0.7.25/drbd/drbd_worker.c drbd/drbd/drbd_worker.c
--- drbd-0.7.25/drbd/drbd_worker.c	2007-10-10 18:41:14.000000000 +0400
+++ drbd/drbd/drbd_worker.c	2008-02-15 19:45:08.000000000 +0300
@@ -195,7 +195,7 @@
 /* used for synchronous meta data and bitmap IO
  * submitted by drbd_md_sync_page_io()
  */
-int drbd_md_io_complete(struct bio *bio, unsigned int bytes_done, int error)
+BIO_ENDIO_FN(drbd_md_io_complete)
 {
 	if (bio->bi_size)
 		return 1;
@@ -323,7 +323,7 @@
 		drbd_queue_work(mdev,&mdev->data.work,&req->w);
 	} else {
 	pass_on:
-		bio_endio(req->master_bio,req->master_bio->bi_size,error);
+		bio_endio(req->master_bio,error);
 		dec_ap_bio(mdev);

 		INVALIDATE_MAGIC(req);
diff -ur drbd-0.7.25/drbd/Makefile drbd/drbd/Makefile
--- drbd-0.7.25/drbd/Makefile	2007-10-10 19:31:18.000000000 +0400
+++ drbd/drbd/Makefile	2008-02-08 19:07:54.000000000 +0300
@@ -41,7 +41,7 @@
     $(error "won't compile with this kernel version")
   endif

-  override CFLAGS += -I$(DRBDSRC)
+  EXTRA_CFLAGS = -I$(DRBDSRC)
   # remember KERNELRELEASE for install target
   # .kernelversion can be included in Makefile as well as
   # sourced from shell



More information about the drbd-user mailing list