sys/vfs/hammer: Don't let ioctl(HAMMERIOC_SET_PSEUDOFS) create PFS in PFS
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Sun, 13 Dec 2015 10:49:30 +0000 (19:49 +0900)
committerTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Sun, 13 Dec 2015 13:52:04 +0000 (22:52 +0900)
hammer pfs-master|slave have been preventing users from creating
a PFS in non-root PFS, but since kernel HAMMER code also assumes
the parent inode of (non-root)PFS root inode has 0 for ip localization,
ioctl(HAMMERIOC_SET_PSEUDOFS) itself should avoid that too.

This commit doesn't affect HAMMER userspace commands because
hammer pfs-master|slave prevent creating a PFS in PFS prior to
calling ioctl(HAMMERIOC_SET_PSEUDOFS). It just makes better sense
to have this check in kernel space as well since one could write
its own userspace program that directly calls ioctl without using
hammer userspace code.

Also see 5b4785a6.

sys/vfs/hammer/hammer_pfs.c

index 917a9c9..9903ee8 100644 (file)
@@ -113,6 +113,15 @@ hammer_ioc_set_pseudofs(hammer_transaction_t trans, hammer_inode_t ip,
        if (pfs->version != HAMMER_IOC_PSEUDOFS_VERSION)
                error = EINVAL;
 
+       /*
+        * Make sure a caller isn't creating a PFS from non-root PFS.
+        */
+       if (lo_to_pfs(ip->obj_localization) != 0) {
+               hmkprintf(trans->hmp,
+                       "Creating a PFS from non-root PFS is not allowed\n");
+               return(EINVAL);
+       }
+
        if (error == 0 && pfs->ondisk) {
                /*
                 * Load the PFS so we can modify our in-core copy.  Ignore