[DRBD-cvs] drbd by lars; module_get/put to avoid rmmod of drbd wh...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Sun, 16 May 2004 16:44:14 +0200 (CEST)


DRBD CVS committal

Author  : lars
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_fs.c drbd_main.c 


Log Message:
module_get/put to avoid rmmod of drbd when devices are configured
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.88
retrieving revision 1.28.2.89
diff -u -3 -r1.28.2.88 -r1.28.2.89
--- drbd_fs.c	13 May 2004 10:01:58 -0000	1.28.2.88
+++ drbd_fs.c	16 May 2004 14:44:08 -0000	1.28.2.89
@@ -172,6 +172,9 @@
 
 	minor=(int)(mdev-drbd_conf);
 
+	if (!try_module_get(THIS_MODULE))
+		return -EINVAL;
+
 	/* if you want to reconfigure, please tear down first */
 	smp_rmb();
 	if (!test_bit(DISKLESS,&mdev->flags))
@@ -384,6 +387,7 @@
 	NOT_IN_26(blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);)
 	ONLY_IN_26(bd_release(bdev);)
  fail_ioctl:
+	module_put(THIS_MODULE);
 	if (filp) fput(filp);
 	if (filp2) fput(filp2);
 	if (put_user(retcode, &arg->ret_code)) return -EFAULT;
@@ -434,6 +438,9 @@
 
 	minor=(int)(mdev-drbd_conf);
 
+	if (!try_module_get(THIS_MODULE))
+		return -EINVAL;
+
 	// FIXME plausibility check
 	if (copy_from_user(&new_conf, &arg->config,sizeof(struct net_config)))
 		return -EFAULT;
@@ -507,7 +514,8 @@
 
 	return 0;
 
-	fail_ioctl:
+  fail_ioctl:
+	module_put(THIS_MODULE);
 	if (put_user(retcode, &arg->ret_code)) return -EFAULT;
 	return -EINVAL;
 }
@@ -792,6 +800,7 @@
 			set_cstate(mdev,Unconfigured);
 			drbd_mdev_cleanup(mdev);
 		} else set_cstate(mdev,StandAlone);
+		module_put(THIS_MODULE);
 
 		break;
 
@@ -837,6 +846,7 @@
 			set_cstate(mdev,Unconfigured);
 			drbd_mdev_cleanup(mdev);
 		}
+		module_put(THIS_MODULE);
 
 		break;
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.172
retrieving revision 1.73.2.173
diff -u -3 -r1.73.2.172 -r1.73.2.173
--- drbd_main.c	13 May 2004 10:01:58 -0000	1.73.2.172
+++ drbd_main.c	16 May 2004 14:44:08 -0000	1.73.2.173
@@ -1148,14 +1148,8 @@
 }
 #endif
 
-void drbd_init_set_defaults(drbd_dev *mdev)
+void drbd_set_defaults(drbd_dev *mdev)
 {
-	// the implicit memset(,0,) of kcalloc did most of this
-	// note: only assignments, no allocation in here
-
-#ifdef PARANOIA
-	SET_MDEV_MAGIC(mdev);
-#endif
 	mdev->flags = 1<<DISKLESS;
 
 	/* If the WRITE_HINT_QUEUED flag is set but it is not
@@ -1163,11 +1157,24 @@
 	if (disable_io_hints) mdev->flags |= 1<<WRITE_HINT_QUEUED;
 
 	mdev->sync_conf.rate       = 250;
-	mdev->sync_conf.al_extents = 128; // 512 MB active set
+	mdev->sync_conf.al_extents = 127; // 512 MB active set
 	mdev->state                = Secondary;
 	mdev->o_state              = Unknown;
 	mdev->cstate               = Unconfigured;
 
+}
+
+void drbd_init_set_defaults(drbd_dev *mdev)
+{
+	// the implicit memset(,0,) of kcalloc did most of this
+	// note: only assignments, no allocation in here
+
+#ifdef PARANOIA
+	SET_MDEV_MAGIC(mdev);
+#endif
+
+	drbd_set_defaults(mdev);
+
 	atomic_set(&mdev->ap_pending_cnt,0);
 	atomic_set(&mdev->rs_pending_cnt,0);
 	atomic_set(&mdev->unacked_cnt,0);
@@ -1275,8 +1282,8 @@
 #define ZAP(x) memset(&x,0,sizeof(x))
 	ZAP(mdev->conf);
 	ZAP(mdev->sync_conf);
-	ZAP(mdev->data);
-	ZAP(mdev->meta);
+	// ZAP(mdev->data); Not yet!
+	// ZAP(mdev->meta); Not yet!
 	ZAP(mdev->gen_cnt);
 #undef ZAP
 	mdev->al_writ_cnt  =
@@ -1295,7 +1302,28 @@
 	mdev->rs_mark_time = 0;
 	mdev->send_task    = NULL;
 	drbd_set_my_capacity(mdev,0);
-	drbd_init_set_defaults(mdev);
+
+	/*
+	 * currently we drbd_init_ee only on module load, so
+	 * we may do drbd_release_ee only on module unload!
+	 * drbd_release_ee(&mdev->free_ee);
+	 * D_ASSERT(list_emptry(&mdev->free_ee));
+	 *
+	 */
+	D_ASSERT(list_empty(&mdev->active_ee));
+	D_ASSERT(list_empty(&mdev->sync_ee));
+	D_ASSERT(list_empty(&mdev->done_ee));
+	D_ASSERT(list_empty(&mdev->read_ee));
+	D_ASSERT(list_empty(&mdev->busy_blocks));
+	D_ASSERT(list_empty(&mdev->app_reads));
+	D_ASSERT(list_empty(&mdev->resync_reads));
+	D_ASSERT(list_empty(&mdev->data.work.q));
+	D_ASSERT(list_empty(&mdev->meta.work.q));
+	D_ASSERT(list_empty(&mdev->resync_work.list));
+	D_ASSERT(list_empty(&mdev->barrier_work.list));
+	D_ASSERT(list_empty(&mdev->unplug_work.list));
+
+	drbd_set_defaults(mdev);
 }
 
 
@@ -1403,21 +1431,30 @@
 			if (mdev->resync) lc_free(mdev->resync);
 
 			D_ASSERT(mdev->ee_in_use==0);
-			drbd_release_ee(mdev,&mdev->free_ee);
+
+			rr = drbd_release_ee(mdev,&mdev->free_ee);
+			// INFO("%d EEs in free list found.\n",rr);
+			// D_ASSERT(rr == 32);
+
 			rr = drbd_release_ee(mdev,&mdev->active_ee);
-			if(rr) ERR("%d: %d EEs in active list found!\n",i,rr);
+			if(rr) ERR("%d EEs in active list found!\n",rr);
 
 			rr = drbd_release_ee(mdev,&mdev->sync_ee);
-			if(rr) ERR("%d: %d EEs in sync list found!\n",i,rr);
-
-			rr = drbd_release_ee(mdev,&mdev->done_ee);
-			if(rr) ERR("%d: %d EEs in done list found!\n",i,rr);
+			if(rr) ERR("%d EEs in sync list found!\n",rr);
 
 			rr = drbd_release_ee(mdev,&mdev->read_ee);
-			if(rr) ERR("%d: %d EEs in read list found!\n",i,rr);
+			if(rr) ERR("%d EEs in read list found!\n",rr);
+
+			rr = drbd_release_ee(mdev,&mdev->done_ee);
+			if(rr) ERR("%d EEs in done list found!\n",rr);
 
-			D_ASSERT(mdev->ee_vacant==0);
-			D_ASSERT(list_empty(&mdev->data.work.q));
+			ERR_IF (!list_empty(&mdev->data.work.q)) {
+				struct list_head *lp;
+				list_for_each(lp,&mdev->data.work.q) {
+					DUMPP(lp);
+				}
+			};
+			D_ASSERT(mdev->ee_vacant == 0);
 
 			if (mdev->md_io_page)
 				__free_page(mdev->md_io_page);
@@ -1463,6 +1500,7 @@
 	if (unregister_blkdev(MAJOR_NR, DEVICE_NAME) != 0)
 		printk(KERN_ERR DEVICE_NAME": unregister of device failed\n");
 
+	printk(KERN_INFO DEVICE_NAME": module cleanup done.\n");
 }
 
 void * kcalloc(size_t size, int type)