[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?