[DRBD-cvs] svn commit by lars - r2638 - in trunk: drbd drbd/linux user - * remove bd_claim/bd_release of ourselves (the drbd dev

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Wed Dec 20 15:41:54 CET 2006


Author: lars
Date: 2006-12-20 15:41:51 +0100 (Wed, 20 Dec 2006)
New Revision: 2638

Modified:
   trunk/drbd/drbd_compat_wrappers.h
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_nl.c
   trunk/drbd/drbd_req.c
   trunk/drbd/linux/drbd.h
   trunk/user/drbdmeta.c
   trunk/user/drbdsetup.c
   trunk/user/drbdtool_common.c
   trunk/user/drbdtool_common.h
Log:
* remove bd_claim/bd_release of ourselves (the drbd device);
  since we now can fail in open(), we no longer need this to
  protect against bogus accesses

* changed error return code for unsucessful try to switch to Secondary
  from "FailedToClaimMyself" to "DeviceInUse"

* remove "disable_bd_claim" module parameter,
  added "allow_oos" (allow open on secondary) instead.
  comment stays as "don't use"; I'm tempted to remove this "feature".

* fix cleanup code in drbd_nl_disk_conf
  in some error goto branches, it did just "forget" to bd_release the
  previously claimed lower lever / meta data devices

* fix v07 style fixed size indexed external meta data

* fix drbd_fail_early disk state check: no good data when < UpToDate

* fix drbdsetup / drbdmeta to use the locking code again to avoid races with
  each other; make them properly recognize configured devices again.

* Known issues
  still no working storage size limit check,
  we might just overflow somewhere...

  race: someone might open a device that is about to be switched to Secondary
  after the check for "open_cnt == 0", but just before it actually changed state.
  we need some flag there to avoid this.


Modified: trunk/drbd/drbd_compat_wrappers.h
===================================================================
--- trunk/drbd/drbd_compat_wrappers.h	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_compat_wrappers.h	2006-12-20 14:41:51 UTC (rev 2638)
@@ -37,6 +37,7 @@
 /* Returns the number of 512 byte sectors of the device */
 static inline sector_t drbd_get_capacity(struct block_device *bdev)
 {
+	/* return bdev ? get_capacity(bdev->bd_disk) : 0; */
 	return bdev ? bdev->bd_inode->i_size >> 9 : 0;
 }
 
@@ -44,6 +45,7 @@
 static inline void drbd_set_my_capacity(drbd_dev *mdev,
 					sector_t size)
 {
+	/* set_capacity(mdev->this_bdev->bd_disk, size); */
 	set_capacity(mdev->vdisk,size);
 	mdev->this_bdev->bd_inode->i_size = (loff_t)size << 9;
 }

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_int.h	2006-12-20 14:41:51 UTC (rev 2638)
@@ -39,7 +39,7 @@
 
 // module parameter, defined in drbd_main.c
 extern int minor_count;
-extern int disable_bd_claim;
+extern int allow_oos;
 extern int major_nr;
 extern int use_nbd_major;
 
@@ -1267,7 +1267,7 @@
 
 
 // drbd_nl.c
-extern char* ppsize(char* buf, size_t size);
+extern char* ppsize(char* buf, unsigned long long size);
 extern sector_t drbd_new_dev_size(struct Drbd_Conf*, struct drbd_backing_dev*);
 extern int drbd_determin_dev_size(drbd_dev*);
 extern void drbd_setup_queue_param(drbd_dev *mdev, unsigned int);
@@ -1305,6 +1305,25 @@
 
 extern void resync_timer_fn(unsigned long data);
 
+#if 0
+#define BD_CLAIM(bdev,holder) ({					\
+	int r = bd_claim(bdev,holder);					\
+	printk(KERN_INFO "drbd: %u = bd_claim(%p,%p); [%p;%u]\n",	\
+		r, bdev, holder, bdev->bd_holder, bdev->bd_holders);	\
+	r; })
+
+#define BD_RELEASE(bdev) do {						\
+	printk(KERN_INFO "drbd: pre: bd_release(%p); [%p;%u]\n",	\
+		bdev, bdev->bd_holder, bdev->bd_holders);		\
+	bd_release(bdev);						\
+	printk(KERN_INFO "drbd: post: bd_release(%p); [%p;%u]\n",	\
+		bdev, bdev->bd_holder, bdev->bd_holders);		\
+	} while (0)
+#else
+#define BD_CLAIM(bdev,holder)	bd_claim(bdev,holder)
+#define BD_RELEASE(bdev)	bd_release(bdev)
+#endif
+
 // drbd_receiver.c
 extern int drbd_release_ee(drbd_dev* mdev,struct list_head* list);
 extern struct Tl_epoch_entry* drbd_alloc_ee(drbd_dev *mdev,

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_main.c	2006-12-20 14:41:51 UTC (rev 2638)
@@ -85,12 +85,12 @@
 MODULE_ALIAS_BLOCKDEV_MAJOR(LANANA_DRBD_MAJOR);
 
 #include <linux/moduleparam.h>
-MODULE_PARM_DESC(disable_bd_claim, "DONT USE! disables block device claiming" );
+/* allow_open_on_secondary */
+MODULE_PARM_DESC(allow_oos, "DONT USE!");
 /* thanks to these macros, if compiled into the kernel (not-module),
- * this becomes the boot parameter drbd.minor_count
- */
-module_param(minor_count,      int,0);
-module_param(disable_bd_claim,bool,0);
+ * this becomes the boot parameter drbd.minor_count */
+module_param(minor_count, int,0);
+module_param(allow_oos, bool,0);
 
 #ifdef DRBD_ENABLE_FAULTS
 int enable_faults = 0;
@@ -105,7 +105,7 @@
 int major_nr = LANANA_DRBD_MAJOR;
 int minor_count = 32;
 
-int disable_bd_claim = 0;
+int allow_oos = 0;
 
 #ifdef ENABLE_DYNAMIC_TRACE
 int trace_type = 0;	// Bitmap of trace types to enable
@@ -1839,16 +1839,21 @@
 	mdev = minor_to_mdev(MINOR(inode->i_rdev));
 	if(!mdev) return -ENODEV;
 
-	if( mdev->state.role == Secondary && !disable_bd_claim) {
+	/* we might allow read-only open on non-Primary */
+	if( mdev->state.role != Primary && !allow_oos) {
 		return -EMEDIUMTYPE;
 	}
+	/* but we cannot allow writes on non-Primary */
 	if (file->f_mode & FMODE_WRITE) {
-		if( mdev->state.role == Secondary) {
+		if( mdev->state.role != Primary) {
 			return -EROFS;
 		}
 		set_bit(WRITER_PRESENT, &mdev->flags);
 	}
 
+	/* FIXME race with Primary -> Secondary
+	 * state change */
+
 	mdev->open_cnt++;
 
 	return 0;
@@ -2196,10 +2201,7 @@
 			if (*q) blk_put_queue(*q);
 			*q = NULL;
 
-			if (mdev->this_bdev->bd_holder == drbd_sec_holder) {
-				mdev->this_bdev->bd_contains = mdev->this_bdev;
-				bd_release(mdev->this_bdev);
-			}
+			D_ASSERT(mdev->open_cnt == 0);
 			if (mdev->this_bdev) bdput(mdev->this_bdev);
 
 			tl_cleanup(mdev);
@@ -2299,16 +2301,10 @@
 	sprintf(disk->disk_name, DEVICE_NAME "%d", minor);
 	disk->private_data = mdev;
 	add_disk(disk);
-		
+
 	mdev->this_bdev = bdget(MKDEV(MAJOR_NR,minor));
 	// we have no partitions. we contain only ourselves.
 	mdev->this_bdev->bd_contains = mdev->this_bdev;
-	if (bd_claim(mdev->this_bdev,drbd_sec_holder)) {
-		// Initial we are Secondary -> should claim myself.
-		WARN("Could not bd_claim() myself.");
-	} else if (disable_bd_claim) {
-		bd_release(mdev->this_bdev);
-	}
 
 	blk_queue_make_request(q, drbd_make_request_26);
 	blk_queue_merge_bvec(q, drbd_merge_bvec);
@@ -2446,6 +2442,7 @@
 	       API_VERSION,PRO_VERSION);
 	printk(KERN_INFO DEVICE_NAME ": %s\n", drbd_buildtag());
 	printk(KERN_INFO DEVICE_NAME": registered as block device major %d\n", MAJOR_NR);
+	printk(KERN_INFO DEVICE_NAME": minor_table @ 0x%p\n", minor_table);
 
 	return 0; // Success!
 
@@ -2462,8 +2459,8 @@
 {
 	if(bc == NULL) return;
 
-	bd_release(bc->backing_bdev);
-	bd_release(bc->md_bdev);
+	BD_RELEASE(bc->backing_bdev);
+	BD_RELEASE(bc->md_bdev);
 
 	fput(bc->lo_file);
 	fput(bc->md_file);

Modified: trunk/drbd/drbd_nl.c
===================================================================
--- trunk/drbd/drbd_nl.c	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_nl.c	2006-12-20 14:41:51 UTC (rev 2638)
@@ -40,7 +40,7 @@
 #include <linux/drbd_limits.h>
 
 /* see get_sb_bdev and bd_claim */
-char *drbd_sec_holder = "Secondary DRBD cannot be bd_claimed ;)";
+char *drbd_d_holder = "Hands off! this is DRBD's data storage device.";
 char *drbd_m_holder = "Hands off! this is DRBD's meta data device.";
 
 
@@ -237,20 +237,18 @@
 	drbd_state_t mask, val;
 	drbd_disks_t nps;
 
-	if (mdev->this_bdev->bd_contains == 0) {
-		// FIXME this masks a bug somewhere else!
-		// I think this is a bug outside of DRBD
-		mdev->this_bdev->bd_contains = mdev->this_bdev;
-	}
-
 	if ( new_role == 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. */
-		if (bd_claim(mdev->this_bdev,drbd_sec_holder))
-			return FailedToClaimMyself;
-		if (disable_bd_claim)
-			bd_release(mdev->this_bdev);
+		/* If I got here, I am Primary.
+		 * I cannot become Secondary as long as someone has an open
+		 * file descriptor on me. */
+
+		/* FIXME Race here.  we need to lock out openers while we are
+		 * deciding whether we can become Secondary or not, so open_cnt
+		 * cannot increase while we are still Primary just before we
+		 * become Secondary below. */
+
+		if (mdev->open_cnt)
+			return DeviceInUse;
 	}
 
 	if ( new_role == Primary ) {
@@ -323,9 +321,9 @@
 			dec_net(mdev);
 		}
 		set_disk_ro(mdev->vdisk, FALSE );
-		D_ASSERT(mdev->this_bdev->bd_holder == drbd_sec_holder);
-		bd_release(mdev->this_bdev);
+		/* why?? what for??
 		mdev->this_bdev->bd_disk = mdev->vdisk;
+		 */
 
 		if ( ( ( mdev->state.conn < Connected ||
 			 mdev->state.pdsk <= Failed ) &&
@@ -350,11 +348,6 @@
 	return r;
 
  fail:
-	if ( new_role == Secondary ) {
-		D_ASSERT(mdev->this_bdev->bd_holder == drbd_sec_holder);
-		bd_release(mdev->this_bdev);
-	}
-
 	return r;
 }
 
@@ -391,6 +384,12 @@
 	sector_t md_size_sect = 0;
 	switch(bdev->dc.meta_dev_idx) {
 	default:
+		/* v07 style fixed size indexed meta data */
+		bdev->md.md_size_sect = MD_RESERVED_SECT;
+		bdev->md.md_offset = drbd_md_ss__(mdev,bdev);
+		bdev->md.al_offset = MD_AL_OFFSET;
+		bdev->md.bm_offset = MD_BM_OFFSET;
+		break;
 	case DRBD_MD_INDEX_FLEX_EXT:
 		/* just occupy the full device; unit: sectors */
 		bdev->md.md_size_sect = drbd_get_capacity(bdev->md_bdev);
@@ -421,7 +420,7 @@
 	}
 }
 
-char* ppsize(char* buf, size_t size)
+char* ppsize(char* buf, unsigned long long size)
 {
 	// Needs 9 bytes at max.
 	static char units[] = { 'K','M','G','T','P','E' };
@@ -430,7 +429,7 @@
 		size = size >> 10;
 		base++;
 	}
-	sprintf(buf,"%ld %cB",(long)size,units[base]);
+	sprintf(buf,"%lu %cB",(long)size,units[base]);
 
 	return buf;
 }
@@ -458,7 +457,7 @@
 
 	size = drbd_new_dev_size(mdev,mdev->bc);
 
-	if( drbd_get_capacity(mdev->this_bdev) != size || 
+	if( drbd_get_capacity(mdev->this_bdev) != size ||
 	    drbd_bm_capacity(mdev) != size ) {
 		int err;
 		err = drbd_bm_resize(mdev,size);
@@ -479,8 +478,8 @@
 		// racy, see comments above.
 		drbd_set_my_capacity(mdev,size);
 		mdev->bc->md.la_size_sect = size;
-		INFO("size = %s (%lu KB)\n",ppsize(ppb,size>>1),
-		     (unsigned long)size>>1);
+		INFO("size = %s (%llu KB)\n",ppsize(ppb,size>>1),
+		     (unsigned long long)size>>1);
 	}
 	if (rv < 0) goto out;
 
@@ -644,6 +643,8 @@
 	}
 }
 
+/* does always return 0;
+ * interesting return code is in reply->ret_code */
 STATIC int drbd_nl_disk_conf(drbd_dev *mdev, struct drbd_nl_cfg_req *nlp,
 			     struct drbd_nl_cfg_reply *reply)
 {
@@ -717,7 +718,7 @@
 	}
 
 	nbc->backing_bdev = inode->i_bdev;
-	if (bd_claim(nbc->backing_bdev, mdev)) {
+	if (BD_CLAIM(nbc->backing_bdev, mdev)) {
 		retcode=LDMounted;
 		goto fail;
 	}
@@ -729,7 +730,7 @@
 	}
 
 	nbc->md_bdev = inode2->i_bdev;
-	if (bd_claim(nbc->md_bdev,
+	if (BD_CLAIM(nbc->md_bdev,
 		     (nbc->dc.meta_dev_idx==DRBD_MD_INDEX_INTERNAL ||
 		      nbc->dc.meta_dev_idx==DRBD_MD_INDEX_FLEX_INT) ?
 		     (void *)mdev : (void*) drbd_m_holder )) {
@@ -737,7 +738,7 @@
 		goto release_bdev_fail;
 	}
 
-	if ( (nbc->backing_bdev==nbc->md_bdev) != 
+	if ( (nbc->backing_bdev==nbc->md_bdev) !=
 	     (nbc->dc.meta_dev_idx==DRBD_MD_INDEX_INTERNAL ||
 	      nbc->dc.meta_dev_idx==DRBD_MD_INDEX_FLEX_INT) ) {
 		retcode=LDMDInvalid;
@@ -779,7 +780,7 @@
 // -- up to here
 
 	// Make sure the new disk is big enough
-	if (drbd_get_capacity(nbc->backing_bdev) < 
+	if (drbd_get_capacity(nbc->backing_bdev) <
 	    drbd_get_capacity(mdev->this_bdev) ) {
 		retcode = LDDeviceTooSmall;
 		goto release_bdev2_fail;
@@ -793,39 +794,43 @@
 
 	retcode = drbd_md_read(mdev,nbc);
 	if ( retcode != NoError ) {
-		goto release_bdev3_fail;
+		goto force_diskless;
 	}
 
 	// Since we are diskless, fix the AL first...
 	if (drbd_check_al_size(mdev)) {
 		retcode = KMallocFailed;
-		goto release_bdev3_fail;
+		goto force_diskless;
 	}
 
 	// Prevent shrinking of consistent devices !
 	if(drbd_md_test_flag(nbc,MDF_Consistent) &&
 	   drbd_new_dev_size(mdev,nbc) < nbc->md.la_size_sect) {
 		retcode = LDDeviceTooSmall;
-		goto release_bdev3_fail;
+		goto force_diskless;
 	}
 
 	if(!drbd_al_read_log(mdev,nbc)) {
 		retcode = MDIOError;
-		goto release_bdev3_fail;		
+		goto force_diskless;
 	}
 
-	// Point of no return reached.
+	/* Point of no return reached.
+	 * Devices and memory are no longer released by error cleanup below.
+	 * now mdev takes over responsibility, and the state engine should
+	 * clean it up somewhere.  */
+	D_ASSERT(mdev->bc == NULL);
+	mdev->bc = nbc;
+	mdev->resync = resync_lru;
+	nbc = NULL;
+	resync_lru = NULL;
 
-	if(drbd_md_test_flag(nbc,MDF_PrimaryInd)) {
+	if(drbd_md_test_flag(mdev->bc,MDF_PrimaryInd)) {
 		set_bit(CRASHED_PRIMARY, &mdev->flags);
-	} else {		
+	} else {
 		clear_bit(CRASHED_PRIMARY, &mdev->flags);
 	}
 
-	D_ASSERT(mdev->bc == NULL);
-	mdev->bc = nbc;
-	mdev->resync = resync_lru;
-
 	mdev->send_cnt = 0;
 	mdev->recv_cnt = 0;
 	mdev->read_cnt = 0;
@@ -866,13 +871,13 @@
 		drbd_bm_set_all(mdev);
 		if (unlikely(drbd_bm_write(mdev) < 0)) {
 			retcode = MDIOError;
-			goto release_bdev3_fail;		
+			goto unlock_bm;
 		}
 		drbd_md_clear_flag(mdev,MDF_FullSync);
 	} else {
 		if (unlikely(drbd_bm_read(mdev) < 0)) {
 			retcode = MDIOError;
-			goto release_bdev3_fail;		
+			goto unlock_bm;
 		}
 	}
 
@@ -887,9 +892,9 @@
 	spin_lock_irq(&mdev->req_lock);
 	os = mdev->state;
 	ns.i = os.i;
-	/* If MDF_Consistent is not set go into inconsistent state, 
+	/* If MDF_Consistent is not set go into inconsistent state,
 	   otherwise investige MDF_WasUpToDate...
-	   If MDF_WasUpToDate is not set go into Outdated disk state, 
+	   If MDF_WasUpToDate is not set go into Outdated disk state,
 	   otherwise into Consistent state.
 	*/
 	if(drbd_md_test_flag(mdev->bc,MDF_Consistent)) {
@@ -901,18 +906,18 @@
 	} else {
 		ns.disk = Inconsistent;
 	}
-	
+
 	if(drbd_md_test_flag(mdev->bc,MDF_PeerOutDated)) {
 		ns.pdsk = Outdated;
 	}
-	
-	if( ns.disk == Consistent && 
-	    ( ns.pdsk == Outdated || nbc->dc.fencing == DontCare ) ) {
+
+	if( ns.disk == Consistent &&
+	    ( ns.pdsk == Outdated || mdev->bc->dc.fencing == DontCare ) ) {
 		ns.disk = UpToDate;
 	}
 
-	/* All tests on MDF_PrimaryInd, MDF_ConnectedInd, 
-	   MDF_Consistent and MDF_WasUpToDate must happen before 
+	/* All tests on MDF_PrimaryInd, MDF_ConnectedInd,
+	   MDF_Consistent and MDF_WasUpToDate must happen before
 	   this point, because drbd_request_state() modifies these
 	   flags. */
 
@@ -929,9 +934,8 @@
 	spin_unlock_irq(&mdev->req_lock);
 	if (rv==SS_Success) after_state_ch(mdev,os,ns,ChgStateVerbose);
 
-	if(rv < SS_Success ) {
-		drbd_bm_unlock(mdev);
-		goto  release_bdev3_fail;
+	if (rv < SS_Success) {
+		goto unlock_bm;
 	}
 
 	drbd_bm_unlock(mdev);
@@ -940,20 +944,15 @@
 	reply->ret_code = retcode;
 	return 0;
 
- release_bdev3_fail:
+ unlock_bm:
 	drbd_bm_unlock(mdev);
-
-	/* The following will be freed by state change below */
-	nbc = NULL; 
-	resync_lru = NULL;
-
+ force_diskless:
 	drbd_force_state(mdev,NS(disk,Diskless));
 	drbd_md_sync(mdev);
-	goto fail;
  release_bdev2_fail:
-	bd_release(nbc->md_bdev);
+	if (nbc) BD_RELEASE(nbc->md_bdev);
  release_bdev_fail:
-	bd_release(nbc->backing_bdev);
+	if (nbc) BD_RELEASE(nbc->backing_bdev);
  fail:
 	if (nbc) {
 		if (nbc->lo_file) fput(nbc->lo_file);

Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/drbd_req.c	2006-12-20 14:41:51 UTC (rev 2638)
@@ -1009,7 +1009,7 @@
 		return 1;
 
 	if (mdev->state.role != Primary &&
-		( !disable_bd_claim || is_write) ) {
+		( !allow_oos || is_write) ) {
 		if (DRBD_ratelimit(5*HZ,5)) {
 			ERR("Process %s[%u] tried to %s; since we are not in Primary state, we cannot allow this\n",
 			    current->comm, current->pid, is_write ? "WRITE" : "READ");
@@ -1026,7 +1026,7 @@
 	 * to serialize state changes, this is racy, since we may lose
 	 * the connection *after* we test for the cstate.
 	 */
-	if ( mdev->state.disk <= Inconsistent &&
+	if ( mdev->state.disk < UpToDate &&
 	     mdev->state.conn < Connected) {
 		if (DRBD_ratelimit(5*HZ,5)) {
 			ERR("Sorry, I have no access to good data anymore.\n");
@@ -1037,7 +1037,6 @@
 		return 1;
 	}
 
-
 	return 0;
 }
 

Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/drbd/linux/drbd.h	2006-12-20 14:41:51 UTC (rev 2638)
@@ -105,7 +105,7 @@
 	PauseFlagAlreadySet,
 	PauseFlagAlreadyClear,
 	DiskLowerThanOutdated,
-	FailedToClaimMyself,
+	DeviceInUse,
 	UnknownNetLinkPacket,
 	HaveNoDiskConfig,
 	ProtocolCRequired,
@@ -123,7 +123,6 @@
 	Primary=1,     // role
 	Secondary=2,   // role
 	role_mask=3,
-	DontBlameDrbd=4   // flag for set_state
 } drbd_role_t;
 
 /* The order of these constants is important.

Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/user/drbdmeta.c	2006-12-20 14:41:51 UTC (rev 2638)
@@ -260,7 +260,7 @@
 	char *md_device_name;	/* well, in 06 it is file name */
 	char *drbd_dev_name;
 	int lock_fd;
-	int drbd_fd;
+	int drbd_fd;		/* no longer used!   */
 	int ll_fd;		/* not yet used here */
 	int md_fd;
 
@@ -2503,14 +2503,18 @@
 	}
 	ai++;
 
-	cfg->drbd_fd = dt_lock_open_drbd(cfg->drbd_dev_name, &cfg->lock_fd, 1);
-	if (cfg->drbd_fd > -1) {
-		if (is_attached(dt_minor_of_dev(cfg->drbd_dev_name))) {
-			if (!(force && (command->function == meta_dump_md))) {
-				fprintf(stderr, "Device '%s' is configured!\n",
-					cfg->drbd_dev_name);
-				exit(20);
-			}
+	/* does exit() unless we aquired the lock.
+	 * unlock happens implicitly when the process dies,
+	 * but may be requested implicitly
+	 */
+	cfg->lock_fd = dt_lock_drbd(cfg->drbd_dev_name);
+
+	/* unconditionally check whether this is in use */
+	if (is_attached(dt_minor_of_dev(cfg->drbd_dev_name))) {
+		if (!(force && (command->function == meta_dump_md))) {
+			fprintf(stderr, "Device '%s' is configured!\n",
+				cfg->drbd_dev_name);
+			exit(20);
 		}
 	}
 

Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/user/drbdsetup.c	2006-12-20 14:41:51 UTC (rev 2638)
@@ -377,7 +377,7 @@
 	EM(PauseFlagAlreadySet) = "PauseFlagAlreadySet",
 	EM(PauseFlagAlreadyClear) = "PauseFlagAlreadyClear",
 	EM(DiskLowerThanOutdated) = "DiskLowerThanOutdated",
-	EM(FailedToClaimMyself) = "FailedToClaimMyself",
+	EM(DeviceInUse) = "DeviceInUse",
 	EM(HaveNoDiskConfig) = "HaveNoDiskConfig",
 	EM(ProtocolCRequired) = "ProtocolCRequired"
 };
@@ -1614,7 +1614,7 @@
 int main(int argc, char** argv)
 {
 	int minor;
-	// int drbd_fd,lock_fd;
+	int lock_fd;
 	struct drbd_cmd *cmd;
 	int rv=0;
 
@@ -1640,12 +1640,12 @@
 	cmd=find_cmd_by_name(argv[2]);
 
 	if(cmd) {
-		//drbd_fd = dt_lock_open_drbd(argv[1], &lock_fd, 1 );
+		lock_fd = dt_lock_drbd(argv[1]);
 		minor=dt_minor_of_dev(argv[1]);
-		rv = cmd->function(cmd,minor,argc-2,argv+2);
 		// by passing argc-2, argv+2 the function has the command name
 		// in argv[0], e.g. "syncer"
-		//dt_close_drbd_unlock(drbd_fd,lock_fd);
+		rv = cmd->function(cmd,minor,argc-2,argv+2);
+		dt_unlock_drbd(lock_fd);
 	} else {
 		print_usage("invalid command");
 	}

Modified: trunk/user/drbdtool_common.c
===================================================================
--- trunk/user/drbdtool_common.c	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/user/drbdtool_common.c	2006-12-20 14:41:51 UTC (rev 2638)
@@ -218,21 +218,14 @@
 }
 
 
-int dt_lock_open_drbd(const char* device, int *lock_fd, int open_may_fail)
+int dt_lock_drbd(const char* device)
 {
-	int drbd_fd, lfd;
+	int lfd;
 	struct stat drbd_stat;
 	char lfname[40];
 	int dev_major,dev_minor;
 
-	drbd_fd=open(device,O_RDONLY);
-	if(drbd_fd==-1 && !open_may_fail) {
-		PERROR("can not open %s", device);
-		exit(20);
-	}
-	
 	dev_major = 147; //LANANA_DRBD_MAJOR;
-
 	if( !stat(device, &drbd_stat) ) {
 
 		if(!S_ISBLK(drbd_stat.st_mode)) {
@@ -275,17 +268,13 @@
 	lfd = get_fd_lockfile_timeout(lfname,1);
 	if (lfd < 0)
 		exit(20);
-	if (lock_fd) *lock_fd = lfd;
-
-	return drbd_fd;
+	return lfd;
 }
 
-int dt_close_drbd_unlock(int drbd_fd, int lock_fd)
+/* ignore errors */
+void dt_unlock_drbd(int lock_fd)
 {
-	int err = 0;
-	if (drbd_fd >= 0) err = close(drbd_fd);
-	if (lock_fd >= 0) unlock_fd(lock_fd); /* ignore errors */
-	return err;
+	if (lock_fd >= 0) unlock_fd(lock_fd);
 }
 
 void dt_print_gc(const __u32* gen_cnt)

Modified: trunk/user/drbdtool_common.h
===================================================================
--- trunk/user/drbdtool_common.h	2006-12-20 11:49:02 UTC (rev 2637)
+++ trunk/user/drbdtool_common.h	2006-12-20 14:41:51 UTC (rev 2638)
@@ -25,8 +25,8 @@
 
 struct option;
 
-extern int dt_lock_open_drbd(const char* device, int *lock_fd, int open_may_fail);
-extern int dt_close_drbd_unlock(int drbd_fd, int lock_fd);
+extern int dt_lock_drbd(const char* device);
+extern void dt_unlock_drbd(int lock_fd);
 extern void dt_release_lockfile(int drbd_fd);
 extern int dt_minor_of_dev(const char *device);
 extern unsigned long long m_strtoll(const char* s,const char def_unit);



More information about the drbd-cvs mailing list