[DRBD-cvs] drbd by lars; set_disk for linux 2.6 should work now

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 27 Jan 2004 12:36:37 +0100 (CET)


DRBD CVS committal

Author  : lars
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_actlog.c drbd_compat_wrappers.h drbd_fs.c drbd_receiver.c 


Log Message:
set_disk for linux 2.6 should work now


===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.63
retrieving revision 1.1.2.64
diff -u -3 -r1.1.2.63 -r1.1.2.64
--- drbd_actlog.c	27 Jan 2004 09:22:13 -0000	1.1.2.63
+++ drbd_actlog.c	27 Jan 2004 11:36:32 -0000	1.1.2.64
@@ -107,7 +107,7 @@
 };
 
 STATIC void drbd_al_write_transaction(struct Drbd_Conf *,struct lc_element *);
-STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *,unsigned int ,int);
+STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *,unsigned int);
 
 #define SM (BM_EXTENT_SIZE / AL_EXTENT_SIZE)
 
@@ -156,7 +156,7 @@
 		al_ext->lc_number = enr;
 
 		if(mdev->cstate < Connected && evicted != LC_FREE ) {
-			drbd_update_on_disk_bm(mdev,evicted,1);
+			drbd_update_on_disk_bm(mdev,evicted);
 		}
 		drbd_al_write_transaction(mdev,al_ext);
 		mdev->al_writ_cnt++;
@@ -386,7 +386,7 @@
 	for(i=0;i<mdev->act_log->nr_elements;i++) {
 		enr = lc_entry(mdev->act_log,i)->lc_number;
 		if(enr == LC_FREE) continue;
-		drbd_update_on_disk_bm(mdev,enr,1);
+		drbd_update_on_disk_bm(mdev,enr);
 	}
 
 	lc_unlock(mdev->act_log);
@@ -429,7 +429,7 @@
 	exts = div_ceil(mdev->mbds_id->size,BM_EXTENT_SIZE);
 
 	for(i=0;i<exts;i++) {
-		drbd_update_on_disk_bm(mdev,i,1);
+		drbd_update_on_disk_bm(mdev,i);
 	}
 }
 
@@ -487,8 +487,7 @@
  *
  * @enr: The extent number of the bits we should write to disk.
  */
-STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *mdev,unsigned int enr,
-				       int sync)
+STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *mdev,unsigned int enr)
 {
 	unsigned long * buffer, * bm;
 	int want,buf_i,bm_words,bm_i;
@@ -524,7 +523,7 @@
 {
 	struct update_odbm_work *udw = (struct update_odbm_work*)w;
 
-	drbd_update_on_disk_bm(mdev,udw->enr,1);
+	drbd_update_on_disk_bm(mdev,udw->enr);
 
 	kfree(udw);
 
@@ -534,7 +533,7 @@
 		mdev->resync_work.cb = w_resync_finished;
 		drbd_queue_work(mdev,&mdev->data.work,&mdev->resync_work);
 	}
-	
+
 	return 1;
 }
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.12
retrieving revision 1.1.2.13
diff -u -3 -r1.1.2.12 -r1.1.2.13
--- drbd_compat_wrappers.h	27 Jan 2004 09:22:13 -0000	1.1.2.12
+++ drbd_compat_wrappers.h	27 Jan 2004 11:36:32 -0000	1.1.2.13
@@ -242,15 +242,6 @@
 }
 #endif
 
-static inline void
-drbd_bio_add_page(struct buffer_head *bh, struct page *page, unsigned int len,
-		  unsigned int offset)
-{
-	set_bh_page (bh,page,offset);
-	bh->b_size = len;
-	bh->b_this_page = bh;
-}
-
 static inline struct page* drbd_bio_get_page(struct buffer_head *bh)
 {
 	return bh->b_page;
@@ -375,6 +366,11 @@
 	return pr->d.master_bio->bi_sector;
 }
 
+/* this is valid, since the only place where it is used is in recv_both_read,
+ * on the untouched master_bio of the Pending_read.
+ * DO NOT use it for anything but an untouched bio,
+ * bi_size is mutable, see bio_endio()
+ */
 static inline short drbd_bio_get_size(struct bio *bio)
 {
 	return bio->bi_size;
@@ -383,7 +379,7 @@
 #ifdef CONFIG_HIGHMEM
 /*
  * I don't know why there is no bvec_kmap, only bvec_kmap_irq ...
- * If for some reason it is intentional, ans MUST be irq save,
+ * If for some reason it is intentional, and MUST be irq save,
  * I introduce a very bad bug right here and now.
  *
  * Most likely it is only due to performance:
@@ -514,13 +510,6 @@
 {
 }
 #endif
-
-static inline void
-drbd_bio_add_page(struct bio *bio, struct page *page, unsigned int len,
-		  unsigned int offset)
-{
-	bio_add_page(bio,page,len,offset);
-}
 
 static inline struct page* drbd_bio_get_page(struct bio *bio)
 {
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.54
retrieving revision 1.28.2.55
diff -u -3 -r1.28.2.54 -r1.28.2.55
--- drbd_fs.c	27 Jan 2004 09:22:13 -0000	1.28.2.54
+++ drbd_fs.c	27 Jan 2004 11:36:32 -0000	1.28.2.55
@@ -153,10 +153,13 @@
 	minor=(int)(mdev-drbd_conf);
 
 	/* if you want to reconfigure, please tear down first */
-ONLY_IN_26(
-	if (mdev->backing_bdev)
+	if (mdev->lo_file)
 		return -EBUSY;
-)
+
+	/* FIXME if this was "adding" a lo dev to a previously "diskless" node,
+	 * there still could be requests comming in right now. brrks.
+	 */
+	D_ASSERT(mdev->state == Secondary);
 
 	if (mdev->open_cnt > 1)
 		return -EBUSY;
@@ -164,6 +167,8 @@
 	if (copy_from_user(&new_conf, &arg->config,sizeof(struct disk_config)))
 		return -EFAULT;
 
+	/* TODO plausibility check for the provided values... */
+
 	filp = fget(new_conf.lower_device);
 	if (!filp) {
 		retcode=LDFDInvalid;
@@ -183,9 +188,29 @@
 		retcode=LDMounted;
 		goto fail_ioctl;
 	}
-#warning "FIXME check size"
-#warning "FIXME meta-device"
-	mdev->backing_bdev = bdev;
+
+#warning "XXX size check does not care about meta data on the same device??"
+	if ((drbd_get_lo_capacity(mdev)>>1) < new_conf.disk_size) {
+		retcode = LDDeviceTooSmall;
+		goto release_bdev_fail_ioctl;
+	}
+
+	filp2 = fget(new_conf.meta_device);
+	if (!filp2) {
+		retcode=LDFDInvalid;
+		goto release_bdev_fail_ioctl;
+	}
+
+	inode = filp2->f_dentry->d_inode;
+
+	if (!S_ISBLK(inode->i_mode)) {
+		retcode=LDNoBlockDev;
+		goto release_bdev_fail_ioctl;
+	}
+	if (bd_claim(inode->i_bdev, &mdev)) {
+		retcode=LDOpenFailed;
+		goto release_bdev_fail_ioctl;
+	}
 #else
 	for(i=0;i<minor_count;i++) {
 		if( i != minor &&
@@ -213,46 +238,44 @@
 
 	if ((drbd_get_lo_capacity(mdev)>>1) < new_conf.disk_size) {
 		retcode = LDDeviceTooSmall;
-		blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);
-		goto fail_ioctl;
+		goto release_bdev_fail_ioctl;
 	}
 
 	filp2 = fget(new_conf.meta_device);
 	if (!filp2) {
 		retcode=LDFDInvalid;
-		blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);
-		goto fail_ioctl;
+		goto release_bdev_fail_ioctl;
 	}
 
 	inode = filp2->f_dentry->d_inode;
 
 	if (!S_ISBLK(inode->i_mode)) {
 		retcode=LDNoBlockDev;
-		blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);
-		goto fail_ioctl;
+		goto release_bdev_fail_ioctl;
 	}
 
 	if ((err = blkdev_open(inode, filp2))) {
 		ERR("blkdev_open( %d:%d ,) returned %d\n",
 		    MAJOR(inode->i_rdev), MINOR(inode->i_rdev), err);
 		retcode=LDOpenFailed;
-		blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);
-		goto fail_ioctl;
+		goto release_bdev_fail_ioctl;
 	}
-
-	fsync_dev(MKDEV(MAJOR_NR, minor));
 #endif
 
+	drbd_sync_me(mdev); // XXX does this make sense?
+
 	drbd_thread_stop(&mdev->worker);
 	drbd_thread_stop(&mdev->asender);
 	drbd_thread_stop(&mdev->receiver);
 	drbd_free_resources(mdev);
 
 	NOT_IN_26( mdev->md_device = inode->i_rdev; )
+	ONLY_IN_26(mdev->md_bdev   = inode->i_bdev; )
 	mdev->md_file  = filp2;
 	mdev->md_index = new_conf.meta_index;
 
-	NOT_IN_26( mdev->lo_device = ll_dev; )
+	NOT_IN_26( mdev->lo_device    = ll_dev; )
+	ONLY_IN_26(mdev->backing_bdev = bdev; )
 	mdev->lo_file  = filp;
 	mdev->lo_usize = new_conf.disk_size;
 	mdev->do_panic = new_conf.do_panic;
@@ -292,6 +315,9 @@
 
 	return 0;
 
+ release_bdev_fail_ioctl:
+	NOT_IN_26(blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);)
+	ONLY_IN_26(bd_release(bdev);)
  fail_ioctl:
 	if (filp) fput(filp);
 	if (filp2) fput(filp2);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.97
retrieving revision 1.97.2.98
diff -u -3 -r1.97.2.97 -r1.97.2.98
--- drbd_receiver.c	27 Jan 2004 09:16:50 -0000	1.97.2.97
+++ drbd_receiver.c	27 Jan 2004 11:36:32 -0000	1.97.2.98
@@ -297,6 +297,7 @@
 
 	if((mdev->ee_vacant * 2 > mdev->ee_in_use ) &&
 	   ( mdev->ee_vacant + mdev->ee_in_use > EE_MININUM) ) {
+		// FIXME cleanup: never returns NULL anymore
 		page=drbd_free_ee(mdev,&mdev->free_ee);
 		if( page ) __free_page(page);
 	}