[DRBD-cvs] drbd by phil; Lars' 02-bio.diff (minus one chunk in dr...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Wed, 21 Jan 2004 20:07:39 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_compat_types.h drbd_compat_wrappers.h drbd_fs.c 
	drbd_int.h drbd_main.c drbd_receiver.c 


Log Message:
Lars' 02-bio.diff (minus one chunk in drbd_ioctl()) 

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_types.h,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -3 -r1.1.2.1 -r1.1.2.2
--- drbd_compat_types.h	21 Jan 2004 15:40:09 -0000	1.1.2.1
+++ drbd_compat_types.h	21 Jan 2004 19:07:38 -0000	1.1.2.2
@@ -52,6 +52,8 @@
 #else // LINUX 2.6
 # warning "FIXME"
 
+#define SIGHAND_HACK
+
 typedef struct bio drbd_bio_t;
 
 #define NOT_IN_26(x...)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -3 -r1.1.2.1 -r1.1.2.2
--- drbd_compat_wrappers.h	21 Jan 2004 15:40:09 -0000	1.1.2.1
+++ drbd_compat_wrappers.h	21 Jan 2004 19:07:38 -0000	1.1.2.2
@@ -63,6 +63,17 @@
 	}
 }
 
+static inline void drbd_set_blocksize(drbd_dev *mdev, int blksize)
+{
+	set_blocksize(MKDEV(MAJOR_NR, (int)(mdev-drbd_conf)), blksize);
+	set_blocksize(mdev->lo_device, blksize);
+}
+
+static inline int drbd_sync_me(drbd_dev *mdev)
+{
+	return fsync_dev(MKDEV(MAJOR_NR, (int)(mdev-drbd_conf)));
+}
+
 static inline void drbd_bio_IO_error(struct buffer_head *bh)
 {
 	buffer_IO_error(bh);
@@ -238,7 +249,7 @@
 	D_ASSERT(buffer_launder(bh));
 	D_ASSERT(buffer_locked(bh));
 	D_ASSERT(buffer_mapped(bh));
-	D_ASSERT(buffer_dirty(bh));
+	// D_ASSERT(buffer_dirty(bh)); // It is not true ?!?
 
 	// FIXME should not be necessary
 	bh->b_state = (1 << BH_Dirty) | ( 1 << BH_Mapped) | (1 << BH_Lock);
@@ -294,6 +305,9 @@
 
 extern void FIXME_DONT_USE(void); // unresolved symbol ;)
 
+/* see get_sb_bdev and bd_claim */
+extern char* drbd_sec_holder;
+
 // bi_end_io handlers
 // int (bio_end_io_t) (struct bio *, unsigned int, int);
 extern int drbd_generic_end_io     (struct bio *bio, unsigned int ignored, int error);
@@ -330,6 +344,15 @@
 static inline sector_t drbd_md_ss(drbd_dev *mdev)
 {
 	return 0;
+}
+
+static inline void drbd_set_blocksize(drbd_dev *mdev, int blksize)
+{
+}
+
+static inline int drbd_sync_me(drbd_dev *mdev)
+{
+	return 0; // fsync_bdev(mdev->this_device);
 }
 
 static inline void drbd_bio_IO_error(struct bio *bio)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.48
retrieving revision 1.28.2.49
diff -u -3 -r1.28.2.48 -r1.28.2.49
--- drbd_fs.c	21 Jan 2004 15:40:09 -0000	1.28.2.48
+++ drbd_fs.c	21 Jan 2004 19:07:38 -0000	1.28.2.49
@@ -179,7 +179,7 @@
 	}
 #warning "FIXME sync ll-dev, check size"
 #warning "FIXME meta-device"
-	mdev->backing_device = bdev;
+	mdev->backing_bdev = bdev;
 #else
 	for(i=0;i<minor_count;i++) {
 		if( i != minor &&
@@ -280,9 +280,7 @@
 		drbd_al_to_on_disk_bm(mdev);
 	}
 
-#warning "FIXME introduce drbd_set_blocksize"
-	set_blocksize(MKDEV(MAJOR_NR, minor), INITIAL_BLOCK_SIZE);
-	set_blocksize(mdev->lo_device, INITIAL_BLOCK_SIZE);
+	drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
 
 	set_cstate(mdev,StandAlone);
 
@@ -360,7 +358,7 @@
 	   used already. E.g. some FS mounted on it.
 	*/
 
-	fsync_dev(MKDEV(MAJOR_NR, minor));
+	drbd_sync_me(mdev);
 	drbd_thread_stop(&mdev->worker);
 	drbd_thread_stop(&mdev->asender);
 	drbd_thread_stop(&mdev->receiver);
@@ -409,8 +407,14 @@
 
 int drbd_set_state(drbd_dev *mdev,Drbd_State newstate)
 {
+
+#warning "FIXME actually must hold device_mutex!"
+
 	int minor = mdev-drbd_conf;
-	if(newstate == mdev->state) return 0; /* nothing to do */
+	if ( (newstate & 0x3) == mdev->state ) return 0; /* nothing to do */
+
+	// exactly one of sec or pri. not both.
+	if ( !((newstate ^ (newstate >> 1)) & 1) ) return -EINVAL;
 
 	if(mdev->cstate == Unconfigured)
 		return -ENXIO;
@@ -418,10 +422,23 @@
 	if ( (newstate & Primary) && (mdev->o_state == Primary) )
 		return -EACCES;
 
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
 	if(newstate == Secondary &&
 	   (test_bit(WRITER_PRESENT,&mdev->flags) ||
 	    drbd_is_mounted(minor) == MountedRW))
 		return -EBUSY;
+#else
+	if ( newstate & Secondary ) {
+		/* If I got here, I am Primary. I claim me for myself. If that
+		 * does not succeed, someone other has claimed me, so I cannot
+		 * become Secondary. */
+#warning "FIXME"
+		/* if something fails beyond this point, we actually need to
+		 * bd_release again */
+		if (bd_claim(mdev->this_bdev,drbd_sec_holder))
+			return -EBUSY;
+	}
+#endif
 
 	if( (newstate & Primary) &&
 	    !(mdev->gen_cnt[Flags] & MDF_Consistent) &&
@@ -429,7 +446,7 @@
 	    !(newstate & DontBlameDrbd) )
 		return -EIO;
 
-	fsync_dev(MKDEV(MAJOR_NR, minor));
+	drbd_sync_me(mdev);
 
 	/* Wait until nothing is on the fly :) */
 	if ( wait_event_interruptible( mdev->state_wait,
@@ -439,7 +456,8 @@
 
 	mdev->state = (Drbd_State) newstate & 0x03;
 	if(newstate & Primary) {
-		set_device_ro(MKDEV(MAJOR_NR, minor), FALSE );
+		NOT_IN_26( set_device_ro(MKDEV(MAJOR_NR, minor), FALSE ); )
+		ONLY_IN_26( set_disk_ro(mdev->vdisk, FALSE ); )
 		if(newstate & Human) {
 			drbd_md_inc(mdev,HumanCnt);
 		} else if(newstate & TimeoutExpired ) {
@@ -450,7 +468,8 @@
 			    ConnectedCnt : ArbitraryCnt);
 		}
 	} else {
-		set_device_ro(MKDEV(MAJOR_NR, minor), TRUE );
+		NOT_IN_26( set_device_ro(MKDEV(MAJOR_NR, minor), TRUE ); )
+		ONLY_IN_26( set_disk_ro(mdev->vdisk, TRUE ); )
 	}
 
 	if(newstate & Secondary && mdev->rs_total) {
@@ -524,8 +543,11 @@
 
 	return 0;
 }
-	
 
+ONLY_IN_26(
+/* see get_sb_bdev and bd_claim */
+char *drbd_sec_holder = "Secondary DRBD cannot be bd_claimed ;)";
+)
 
 int drbd_ioctl(struct inode *inode, struct file *file,
 			   unsigned int cmd, unsigned long arg)
@@ -534,16 +556,28 @@
 	long time;
 	struct Drbd_Conf *mdev;
 	struct ioctl_wait* wp;
+	ONLY_IN_26(
+	struct block_device *bdev = inode->i_bdev;
+	struct gendisk *disk = bdev->bd_disk;
+	)
 
 	minor = MINOR(inode->i_rdev);
-	if(minor >= minor_count) return -ENODEV;
-	mdev = &drbd_conf[minor];
+	if (minor >= minor_count) return -ENODEV;
+	mdev = drbd_conf + minor;
+
+	D_ASSERT(MAJOR(inode->i_rdev) == MAJOR_NR);
 
 	if( (err=down_interruptible(&mdev->device_mutex)) ) return err;
 	/*
-	 * please no 'return', use 'err = -ERRNO; break;'
+	 * please no 'return', use 'err = -ERRNO; goto out;'
 	 * we hold the device_mutex
 	 */
+
+	ONLY_IN_26(
+	D_ASSERT(bdev == mdev->this_bdev);
+	D_ASSERT(disk == mdev->vdisk);
+	);
+
 	switch (cmd) {
 	case BLKGETSIZE:
 		err = put_user(drbd_get_my_capacity(mdev), (long *)arg);
@@ -555,14 +589,16 @@
 		break;
 #endif
 
-	case BLKROSET:
+	case BLKROSET:  // THINK do we want to intercept this one ?
 	case BLKROGET:
 	case BLKFLSBUF:
 	case BLKSSZGET:
 	case BLKBSZGET:
-	case BLKBSZSET:
+	case BLKBSZSET: // THINK do we want to intercept this one ?
 	case BLKPG:
-		err=blk_ioctl(inode->i_rdev, cmd, arg);
+		NOT_IN_26( err=blk_ioctl(inode->i_rdev, cmd, arg); )
+#warning "FIXME verify this does not create an infine recursion!"
+		ONLY_IN_26( err=blkdev_ioctl(inode, file, cmd, arg); )
 		break;
 	case DRBD_IOCTL_GET_VERSION:
 		err = put_user(API_VERSION, (int *) arg);
@@ -726,7 +762,7 @@
 	default:
 		err = -EINVAL;
 	}
-//out:
+ out:
 	up(&mdev->device_mutex);
  out_unlocked:
 	return err;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.101
retrieving revision 1.58.2.102
diff -u -3 -r1.58.2.101 -r1.58.2.102
--- drbd_int.h	21 Jan 2004 15:40:09 -0000	1.58.2.101
+++ drbd_int.h	21 Jan 2004 19:07:38 -0000	1.58.2.102
@@ -629,6 +629,7 @@
 	kdev_t md_device;         // device for meta-data.
 #else
 	struct block_device *backing_bdev;
+	struct block_device *this_bdev;
 	struct block_device *md_bdev;
 	struct gendisk      *vdisk;
 	request_queue_t     *rq_queue;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.103
retrieving revision 1.73.2.104
diff -u -3 -r1.73.2.103 -r1.73.2.104
--- drbd_main.c	21 Jan 2004 15:40:09 -0000	1.73.2.103
+++ drbd_main.c	21 Jan 2004 19:07:38 -0000	1.73.2.104
@@ -89,6 +89,7 @@
 #endif
 #define DEVICE_REQUEST drbd_do_request
 
+#warning "FIXME review the MODULE_* macros below"
 MODULE_AUTHOR("Philipp Reisner <philipp.reisner@gmx.at>");
 MODULE_DESCRIPTION("drbd - Distributed Replicated Block Device v" REL_VERSION);
 MODULE_LICENSE("GPL");
@@ -105,7 +106,7 @@
 volatile int drbd_did_panic = 0;
 
 /* in 2.6.x, our device mapping and config info contains our virtual gendisks
- * as member struct gendisk vdisk;
+ * as member "struct gendisk *vdisk;"
  */
 NOT_IN_26(
 STATIC int *drbd_blocksizes;
@@ -913,7 +914,7 @@
 
 	drbd_conf[minor].open_cnt++;
 
-	MOD_INC_USE_COUNT;
+	NOT_IN_26(MOD_INC_USE_COUNT;)
 
 	return 0;
 }
@@ -936,7 +937,7 @@
 		clear_bit(WRITER_PRESENT, &drbd_conf[minor].flags);
 	}
 
-	MOD_DEC_USE_COUNT;
+	NOT_IN_26(MOD_DEC_USE_COUNT;)
 
 	return 0;
 }
@@ -1226,11 +1227,18 @@
 		goto Enomem;
 #else
 	for (i = 0; i < minor_count; i++) {
-		drbd_conf[i].vdisk = alloc_disk(1);
-		if (!drbd_conf[i].vdisk) goto Enomem;
+		drbd_dev    *mdev = drbd_conf + i;
+		struct gendisk         **disk = &mdev->vdisk;
+		request_queue_t        **q    = &mdev->rq_queue;
+
+		*q = blk_alloc_queue(GFP_KERNEL);
+		if (!*q) goto Enomem;
+
+		*disk = alloc_disk(1);
+		if (!*disk) goto Enomem;
+
+		set_disk_ro( *disk, TRUE );
 	}
-	/* thanks to alloc_disk, we now have minor_count gendisks with
-	 * capacity == 0, waiting to be configured.  */
 #endif
 
 	if ((err = drbd_create_mempools()))
@@ -1239,21 +1247,11 @@
 	for (i = 0; i < minor_count; i++) {
 		drbd_dev    *mdev = &drbd_conf[i];
 		struct page *page = alloc_page(GFP_KERNEL);
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
-		struct gendisk         **disk = &mdev->vdisk;
-		request_queue_t        **q    = &mdev->rq_queue;
-
-		*disk = alloc_disk(1);
-		if (!*disk) goto Enomem;
 
-		*q = blk_alloc_queue(GFP_KERNEL);
-		if (!*q) goto Enomem;
-
-		set_disk_ro( mdev->this_bdev, TRUE );
-#else
+		NOT_IN_26(
 		drbd_blocksizes[i] = INITIAL_BLOCK_SIZE;
 		set_device_ro( MKDEV(MAJOR_NR, i), TRUE );
-#endif
+		)
 
 		if(!page) goto Enomem;
 		drbd_init_bio(&mdev->md_io_bio,512);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.90
retrieving revision 1.97.2.91
diff -u -3 -r1.97.2.90 -r1.97.2.91
--- drbd_receiver.c	21 Jan 2004 15:40:09 -0000	1.97.2.90
+++ drbd_receiver.c	21 Jan 2004 19:07:38 -0000	1.97.2.91
@@ -1361,7 +1361,7 @@
 			dec_ap_pending(mdev,HERE);
 		case Resync:
 			dec_rs_pending(mdev,HERE);
-		case Discard:
+		case Discard:;
 		}
 
 		INVALIDATE_MAGIC(pr);