[DRBD-cvs] drbd by phil; * Implemented writing of meta-data to ne...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Tue, 3 Feb 2004 14:02:39 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
* Implemented writing of meta-data to new location if a device with
  internal metadata is resized. [untested]

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.65
retrieving revision 1.1.2.66
diff -u -3 -r1.1.2.65 -r1.1.2.66
--- drbd_actlog.c	27 Jan 2004 15:51:36 -0000	1.1.2.65
+++ drbd_actlog.c	3 Feb 2004 13:02:34 -0000	1.1.2.66
@@ -431,6 +431,41 @@
 	}
 }
 
+static inline int _try_lc_del(struct Drbd_Conf *mdev,struct lc_element *al_ext)
+{
+	int rv;
+
+	spin_lock_irq(&mdev->al_lock);
+	rv = (al_ext->refcnt == 0);
+	if(likely(rv)) lc_del(mdev->act_log,al_ext);
+	spin_unlock_irq(&mdev->al_lock);
+
+	if(unlikely(!rv) INFO("Waiting for extent in drbd_al_shrink()\n");
+
+	return rv;
+}
+
+/**
+ * drbd_al_shrink: Removes all active extents form the AL. (but does not
+ * write any transactions)
+ * You need to lock mdev->act_log with lc_try_lock() / lc_unlock()
+ */
+void drbd_al_shrink(struct Drbd_Conf *mdev)
+{
+	struct lc_element *al_ext;
+	int i;
+
+	D_ASSERT( test_bit(__LC_DIRTY,&mdev->act_log->flags) );
+
+	for(i=0;i<mdev->act_log->nr_elements;i++) {
+		al_ext = lc_entry(mdev->act_log,i);
+		if(al_ext->lc_number == LC_FREE) continue;
+		wait_event(mdev->al_wait, _try_lc_del(mdev,al_ext));
+	}
+
+	wake_up(&mdev->al_wait);
+}
+
 /**
  * drbd_read_bm: Read the whole bitmap from its on disk location.
  */
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.60
retrieving revision 1.28.2.61
diff -u -3 -r1.28.2.60 -r1.28.2.61
--- drbd_fs.c	2 Feb 2004 12:44:00 -0000	1.28.2.60
+++ drbd_fs.c	3 Feb 2004 13:02:34 -0000	1.28.2.61
@@ -68,6 +68,26 @@
 }
 #endif
 
+STATIC int do_determin_dev_size(struct Drbd_Conf* mdev);
+int drbd_determin_dev_size(struct Drbd_Conf* mdev)
+{
+	sector_t long pmdss; // previous meta data start sector
+	int rv;
+
+	wait_event(mdev->al_wait, lc_try_lock(mdev->act_log));
+	pmdss = drbd_md_ss(mdev);
+	rv = do_determin_dev_size(mdev);
+	if ( pmdss != drbd_md_ss(mdev) && mdev->md_index == -1 ) {
+		WARN("Moving meta-data.\n");
+		drbd_al_shrink(mdev); // All extents inactive.
+		drbd_write_bm(mdev);  // 
+		drbd_md_write(mdev);  // Write mdev->la_size to disk.
+	}
+	lc_unlock(mdev->act_log);
+
+	return rv;
+}
+
 /* Returns 1 if there is a disk-less node, 0 if both nodes have a disk. */
 /*
  * THINK do we want the size to be KB or sectors ?
@@ -75,7 +95,7 @@
  *
  * currently *_size is in KB.
  */
-int drbd_determin_dev_size(struct Drbd_Conf* mdev)
+STATIC int do_determin_dev_size(struct Drbd_Conf* mdev)
 {
 	unsigned long p_size = mdev->p_size;  // partner's disk size.
 	unsigned long la_size = mdev->la_size; // last agreed size.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.112
retrieving revision 1.58.2.113
diff -u -3 -r1.58.2.112 -r1.58.2.113
--- drbd_int.h	3 Feb 2004 07:57:14 -0000	1.58.2.112
+++ drbd_int.h	3 Feb 2004 13:02:34 -0000	1.58.2.113
@@ -875,6 +875,7 @@
 extern void drbd_al_apply_to_bm(struct Drbd_Conf *mdev);
 extern void drbd_al_to_on_disk_bm(struct Drbd_Conf *mdev);
 extern void drbd_write_bm(struct Drbd_Conf *mdev);
+extern void drbd_al_shrink(struct Drbd_Conf *mdev);
 
 /*
  * event macros