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