[DRBD-cvs] drbd by phil; * First _naive_ implementaion of the det...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Fri, 6 Feb 2004 16:44:00 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd.h drbd_fs.c drbd_int.h drbd_main.c drbd_proc.c 
	drbd_receiver.c 


Log Message:
* First _naive_ implementaion of the detach command. 
* Some work on the disk-less-mode

Still a lot to do in this area...

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd.h,v
retrieving revision 1.34.2.19
retrieving revision 1.34.2.20
diff -u -3 -r1.34.2.19 -r1.34.2.20
--- drbd.h	5 Feb 2004 17:06:16 -0000	1.34.2.19
+++ drbd.h	6 Feb 2004 15:43:55 -0000	1.34.2.20
@@ -196,5 +196,7 @@
 #define DRBD_IOCTL_SET_DISK_SIZE  _IOW( 'D', 0x10, unsigned int)
 #define DRBD_IOCTL_WAIT_CONNECT  _IOR( 'D', 0x11, struct ioctl_wait)
 #define DRBD_IOCTL_WAIT_SYNC     _IOR( 'D', 0x12, struct ioctl_wait)
+#define DRBD_IOCTL_UNCONFIG_DISK _IO ( 'D', 0x13 )
+
 #endif
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.64
retrieving revision 1.28.2.65
diff -u -3 -r1.28.2.64 -r1.28.2.65
--- drbd_fs.c	5 Feb 2004 19:52:19 -0000	1.28.2.64
+++ drbd_fs.c	6 Feb 2004 15:43:55 -0000	1.28.2.65
@@ -110,6 +110,12 @@
 	unsigned long size=0;
 	int rv;
 
+ONLY_IN_26(
+	if (mdev->this_bdev->bd_disk == 0) { // strange...
+		mdev->this_bdev->bd_disk = mdev->vdisk; 
+	}
+)
+
 	m_size = drbd_get_capacity(mdev->backing_bdev)>>1;
 
 	if (mdev->md_index == -1 && m_size) {// internal metadata
@@ -776,6 +782,26 @@
 
 		set_cstate(mdev,Unconfigured);
 		mdev->state = Secondary;
+
+		break;
+
+	case DRBD_IOCTL_UNCONFIG_DISK:
+		if (mdev->cstate == Unconfigured) break;
+
+		if (mdev->cstate > Connected) {
+			err=-EBUSY;
+			break;
+		}
+		if (!mdev->lo_file || 
+		    test_bit(PARTNER_DISKLESS,&mdev->flags) ) {
+			err=-ENXIO;
+			break;
+		}
+		// TODO: Fix all this. Currently it is the 
+		// blissfully ignorant implementation.
+		drbd_free_ll_dev(mdev); 
+		if (mdev->cstate == Connected) drbd_send_param(mdev);
+		if (mdev->cstate == StandAlone) set_cstate(mdev,Unconfigured);
 
 		break;
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.115
retrieving revision 1.58.2.116
diff -u -3 -r1.58.2.115 -r1.58.2.116
--- drbd_int.h	5 Feb 2004 19:52:19 -0000	1.58.2.115
+++ drbd_int.h	6 Feb 2004 15:43:55 -0000	1.58.2.116
@@ -752,6 +752,8 @@
 extern int drbd_send_insync(drbd_dev *mdev,sector_t sector,
 			    u64 block_id);
 extern int drbd_send_bitmap(drbd_dev *mdev);
+extern void drbd_free_ll_dev(drbd_dev *mdev);
+
 
 // drbd_meta-data.c (still in drbd_main.c)
 extern void drbd_md_write(drbd_dev *mdev);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.122
retrieving revision 1.73.2.123
diff -u -3 -r1.73.2.122 -r1.73.2.123
--- drbd_main.c	5 Feb 2004 19:52:19 -0000	1.73.2.122
+++ drbd_main.c	6 Feb 2004 15:43:55 -0000	1.73.2.123
@@ -550,11 +550,10 @@
 	int ok,i;
 	unsigned long m_size; // sector_t ??
 
-	m_size = drbd_get_capacity(mdev->backing_bdev)>>1;
-	if (mdev->md_index == -1 ) {// internal metadata
-		D_ASSERT(m_size > MD_RESERVED_SIZE);
-		m_size = drbd_md_ss(mdev)>>1;
-	}
+	if(mdev->lo_file) {
+		if (mdev->md_index == -1 ) m_size = drbd_md_ss(mdev)>>1;
+		else m_size = drbd_get_capacity(mdev->backing_bdev)>>1;
+	} else m_size = 0;
 
 	p.u_size = cpu_to_be64(mdev->lo_usize);
 	p.p_size = cpu_to_be64(m_size);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_proc.c,v
retrieving revision 1.8.2.16
retrieving revision 1.8.2.17
diff -u -3 -r1.8.2.16 -r1.8.2.17
--- drbd_proc.c	21 Jan 2004 14:59:05 -0000	1.8.2.16
+++ drbd_proc.c	6 Feb 2004 15:43:55 -0000	1.8.2.17
@@ -120,6 +120,7 @@
 		       int len, int *unused, void *data)
 {
 	int rlen, i;
+	const char *sn;
 
 	static const char *cstate_names[] =
 	{
@@ -163,7 +164,14 @@
 	  ua .. unack'd (still need to send ack)
 	  al .. access log write count
 	*/
+
 	for (i = 0; i < minor_count; i++) {
+		sn = cstate_names[drbd_conf[i].cstate];
+		if(drbd_conf[i].cstate == Connected) {
+			if(!drbd_conf[i].lo_file) sn = "DiskLessClient";
+			if(test_bit(PARTNER_DISKLESS,&drbd_conf[i].flags))
+				sn = "ServerForDLess";
+		}
 		if ( drbd_conf[i].cstate == Unconfigured )
 			rlen += sprintf( buf + rlen,
 			   "%2d: cs:Unconfigured\n", i);
@@ -172,8 +180,7 @@
 			   "%2d: cs:%s st:%s/%s ld:%s\n"
 			   "    ns:%u nr:%u dw:%u dr:%u al:%u bm:%u "
 			   "pe:%u ua:%u\n",
-			   i,
-			   cstate_names[drbd_conf[i].cstate],
+			   i, sn,
 			   state_names[drbd_conf[i].state],
 			   state_names[drbd_conf[i].o_state],
 			   (drbd_conf[i].gen_cnt[Flags]
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.102
retrieving revision 1.97.2.103
diff -u -3 -r1.97.2.102 -r1.97.2.103
--- drbd_receiver.c	5 Feb 2004 15:17:36 -0000	1.97.2.102
+++ drbd_receiver.c	6 Feb 2004 15:43:55 -0000	1.97.2.103
@@ -1089,6 +1089,15 @@
 		return FALSE;
 	}
 
+	p_size=be64_to_cpu(p->p_size);
+
+	if(p_size == 0 && mdev->lo_file == 0) {
+		ERR("some backing storage is needed\n");
+		set_cstate(mdev,Unconfigured);
+		mdev->receiver.t_state = Exiting;
+		return FALSE;
+	}
+
 	// XXX harmless race with ioctl ...
 	mdev->sync_conf.rate  =
 		max_t(int,mdev->sync_conf.rate, be32_to_cpu(p->sync_rate));
@@ -1111,7 +1120,6 @@
 	}
 	*/
 
-	p_size=be64_to_cpu(p->p_size);
 	mdev->p_size=p_size;
 	if( mdev->lo_usize != be64_to_cpu(p->u_size) ) {
 		mdev->lo_usize = be64_to_cpu(p->u_size);