The NBD driver seems to require CAP_SYSADMIN capabilities for 
innocent things like asking what the capacity is. 

Patch attached. 

        Roger. 


-- 
** [EMAIL PROTECTED] ** http://www.BitWizard.nl/ ** +31-15-2600998 **
*-- BitWizard writes Linux device drivers for any device you may have! --*
Q: It doesn't work. A: Look buddy, doesn't work is an ambiguous statement. 
Does it sit on the couch all day? Is it unemployed? Please be specific! 
Define 'it' and what it isn't doing. --------- Adapted from lxrbot FAQ
diff -ur linux-2.4.28.clean/drivers/block/nbd.c 
linux-2.4.28.nbd-fix/drivers/block/nbd.c
--- linux-2.4.28.clean/drivers/block/nbd.c      Wed Jan 19 18:14:01 2005
+++ linux-2.4.28.nbd-fix/drivers/block/nbd.c    Wed Jan 19 16:36:59 2005
@@ -408,10 +408,7 @@
        int dev, error, temp;
        struct request sreq ;
 
-       /* Anyone capable of this syscall can do *real bad* things */
 
-       if (!capable(CAP_SYS_ADMIN))
-               return -EPERM;
        if (!inode)
                return -EINVAL;
        dev = MINOR(inode->i_rdev);
@@ -419,6 +416,20 @@
                return -ENODEV;
 
        lo = &nbd_dev[dev];
+
+       /* these are innocent, but.... */
+       switch (cmd) {
+       case BLKGETSIZE:
+               return put_user(nbd_bytesizes[dev] >> 9, (unsigned long *) arg);
+       case BLKGETSIZE64:
+               return put_user((u64)nbd_bytesizes[dev], (u64 *) arg);
+       }
+
+       /* ... anyone capable of any of the below ioctls can do *real bad* 
+          things */
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+
        switch (cmd) {
        case NBD_DISCONNECT:
                printk("NBD_DISCONNECT\n");
@@ -524,10 +535,6 @@
                       dev, lo->queue_head.next, lo->queue_head.prev, 
requests_in, requests_out);
                return 0;
 #endif
-       case BLKGETSIZE:
-               return put_user(nbd_bytesizes[dev] >> 9, (unsigned long *) arg);
-       case BLKGETSIZE64:
-               return put_user((u64)nbd_bytesizes[dev], (u64 *) arg);
        }
        return -EINVAL;
 }

Reply via email to