configfs: don't bother with checks for mkdir/rmdir/unlink/symlink in root
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 17 Mar 2012 20:13:25 +0000 (16:13 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 21 Mar 2012 01:29:46 +0000 (21:29 -0400)
just give root directory separate inode_operations without all those
methods...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/configfs/configfs_internal.h
fs/configfs/dir.c
fs/configfs/mount.c
fs/configfs/symlink.c

index ede857d20a049d426d2e836f4826803e4396e966..1b7fdc0a6a0912d74cf820145a3582180374a755 100644 (file)
@@ -89,6 +89,7 @@ extern const struct file_operations configfs_dir_operations;
 extern const struct file_operations configfs_file_operations;
 extern const struct file_operations bin_fops;
 extern const struct inode_operations configfs_dir_inode_operations;
+extern const struct inode_operations configfs_root_inode_operations;
 extern const struct inode_operations configfs_symlink_inode_operations;
 extern const struct dentry_operations configfs_dentry_ops;
 
index 5ddd7ebd9dcd2156ce6a206fc5ba24c47c1c308a..b0fbcbeb03ee6d09ac6ccef6dbedcd1b9e9874c1 100644 (file)
@@ -1183,11 +1183,6 @@ static int configfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode
        struct module *subsys_owner = NULL, *new_item_owner = NULL;
        char *name;
 
-       if (dentry->d_parent == configfs_sb->s_root) {
-               ret = -EPERM;
-               goto out;
-       }
-
        sd = dentry->d_parent->d_fsdata;
 
        /*
@@ -1359,9 +1354,6 @@ static int configfs_rmdir(struct inode *dir, struct dentry *dentry)
        struct module *subsys_owner = NULL, *dead_item_owner = NULL;
        int ret;
 
-       if (dentry->d_parent == configfs_sb->s_root)
-               return -EPERM;
-
        sd = dentry->d_fsdata;
        if (sd->s_type & CONFIGFS_USET_DEFAULT)
                return -EPERM;
@@ -1459,6 +1451,11 @@ const struct inode_operations configfs_dir_inode_operations = {
        .setattr        = configfs_setattr,
 };
 
+const struct inode_operations configfs_root_inode_operations = {
+       .lookup         = configfs_lookup,
+       .setattr        = configfs_setattr,
+};
+
 #if 0
 int configfs_rename_dir(struct config_item * item, const char *new_name)
 {
index 07f60455f1c1cac2108a876d1cdc490caa2a7c64..eb41adc28cfe69d8d5242a98609867d33f6e6b5a 100644 (file)
@@ -82,7 +82,7 @@ static int configfs_fill_super(struct super_block *sb, void *data, int silent)
        inode = configfs_new_inode(S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO,
                                   &configfs_root);
        if (inode) {
-               inode->i_op = &configfs_dir_inode_operations;
+               inode->i_op = &configfs_root_inode_operations;
                inode->i_fop = &configfs_dir_operations;
                /* directory inodes start off with i_nlink == 2 (for "." entry) */
                inc_nlink(inode);
index 0f3eb41d9201e6884db26cc8cedf6f3b8328dd25..2817153d33c21fd14572d46a5be32f59b0ec8d6f 100644 (file)
@@ -141,10 +141,6 @@ int configfs_symlink(struct inode *dir, struct dentry *dentry, const char *symna
        struct config_item *target_item = NULL;
        struct config_item_type *type;
 
-       ret = -EPERM;  /* What lack-of-symlink returns */
-       if (dentry->d_parent == configfs_sb->s_root)
-               goto out;
-
        sd = dentry->d_parent->d_fsdata;
        /*
         * Fake invisibility if dir belongs to a group/default groups hierarchy
@@ -198,8 +194,6 @@ int configfs_unlink(struct inode *dir, struct dentry *dentry)
        if (!(sd->s_type & CONFIGFS_ITEM_LINK))
                goto out;
 
-       BUG_ON(dentry->d_parent == configfs_sb->s_root);
-
        sl = sd->s_element;
 
        parent_item = configfs_get_config_item(dentry->d_parent);