[DRBD-cvs] drbd by phil; Implemented (hopefully) all necessary ch...

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Thu, 5 Feb 2004 18:06:21 +0100 (CET)


DRBD CVS committal

Author  : phil
Module  : drbd

Dir     : drbd/drbd


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


Log Message:
Implemented (hopefully) all necessary checks in drbd_ioctl_set_disk()

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd.h,v
retrieving revision 1.34.2.18
retrieving revision 1.34.2.19
diff -u -3 -r1.34.2.18 -r1.34.2.19
--- drbd.h	5 Feb 2004 15:17:36 -0000	1.34.2.18
+++ drbd.h	5 Feb 2004 17:06:16 -0000	1.34.2.19
@@ -97,9 +97,11 @@
 	LDOpenFailed,
 	MDOpenFailed,
 	LDDeviceTooSmall,
+	MDDeviceTooSmall,
 	LDNoConfig,
 	LDMounted,
-	MDMounted
+	MDMounted,
+	LDMDInvalid
 };
 
 struct ioctl_disk_config {
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.62
retrieving revision 1.28.2.63
diff -u -3 -r1.28.2.62 -r1.28.2.63
--- drbd_fs.c	5 Feb 2004 15:17:36 -0000	1.28.2.62
+++ drbd_fs.c	5 Feb 2004 17:06:16 -0000	1.28.2.63
@@ -188,7 +188,10 @@
 	if (copy_from_user(&new_conf, &arg->config,sizeof(struct disk_config)))
 		return -EFAULT;
 
-	/* TODO plausibility check for the provided values... */
+	if ( new_conf.meta_index < -1) {
+		retcode=LDMDInvalid;
+		goto fail_ioctl;
+	}
 
 	filp = fget(new_conf.lower_device);
 	if (!filp) {
@@ -225,7 +228,8 @@
 	}
 
 	bdev2 = inode2->i_bdev;
-	if (bd_claim(bdev2,new_conf.meta_index==-1 ? mdev : drbd_m_holder )) {
+	if (bd_claim(bdev2, new_conf.meta_index== - 1 ? 
+		     (void *)mdev : (void*) drbd_m_holder )) {
 		retcode=MDMounted;
 		goto release_bdev_fail_ioctl;
 	}
@@ -262,13 +266,23 @@
 	bdev2 = inode2->i_rdev;
 #endif
 
-	if ((drbd_get_capacity(mdev->backing_bdev)>>1) < new_conf.disk_size) {
+	if ( (bdev == bdev2) != (new_conf.meta_index == -1) ) {
+		retcode=LDMDInvalid;
+		goto release_bdev2_fail_ioctl;
+	}
+
+	if ((drbd_get_capacity(bdev)>>1) < new_conf.disk_size) {
 		retcode = LDDeviceTooSmall;
 		goto release_bdev2_fail_ioctl;
 	}
-#warning "XXX size check does not care about meta data on the same device??"
 
-	
+	if ( new_conf.meta_index == -1 ) i = 1;
+	else i = new_conf.meta_index+1;
+
+	if( drbd_get_capacity(bdev2) < 2*MD_RESERVED_SIZE*i ) {
+		retcode = MDDeviceTooSmall;
+		goto release_bdev2_fail_ioctl;
+	}
 
 	drbd_sync_me(mdev); // XXX does this make sense?