[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)