[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