]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/configfs/dir.c
Merge tag 'v2.6.38' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
[mv-sheeva.git] / fs / configfs / dir.c
index 0b502f80c691796afc46cfcfb1e1cfdeaafbba5e..90ff3cb10de3123d1ca9095d511552eccb7188fe 100644 (file)
@@ -67,12 +67,12 @@ static void configfs_d_iput(struct dentry * dentry,
  * We _must_ delete our dentries on last dput, as the chain-to-parent
  * behavior is required to clear the parents of default_groups.
  */
-static int configfs_d_delete(struct dentry *dentry)
+static int configfs_d_delete(const struct dentry *dentry)
 {
        return 1;
 }
 
-static const struct dentry_operations configfs_dentry_ops = {
+const struct dentry_operations configfs_dentry_ops = {
        .d_iput         = configfs_d_iput,
        /* simple_delete_dentry() isn't exported */
        .d_delete       = configfs_d_delete,
@@ -232,10 +232,8 @@ int configfs_make_dirent(struct configfs_dirent * parent_sd,
 
        sd->s_mode = mode;
        sd->s_dentry = dentry;
-       if (dentry) {
+       if (dentry)
                dentry->d_fsdata = configfs_get(sd);
-               dentry->d_op = &configfs_dentry_ops;
-       }
 
        return 0;
 }
@@ -278,7 +276,6 @@ static int create_dir(struct config_item * k, struct dentry * p,
                error = configfs_create(d, mode, init_dir);
                if (!error) {
                        inc_nlink(p->d_inode);
-                       (d)->d_op = &configfs_dentry_ops;
                } else {
                        struct configfs_dirent *sd = d->d_fsdata;
                        if (sd) {
@@ -371,9 +368,7 @@ int configfs_create_link(struct configfs_symlink *sl,
                                   CONFIGFS_ITEM_LINK);
        if (!err) {
                err = configfs_create(dentry, mode, init_symlink);
-               if (!err)
-                       dentry->d_op = &configfs_dentry_ops;
-               else {
+               if (err) {
                        struct configfs_dirent *sd = dentry->d_fsdata;
                        if (sd) {
                                spin_lock(&configfs_dirent_lock);
@@ -399,8 +394,7 @@ static void remove_dir(struct dentry * d)
        if (d->d_inode)
                simple_rmdir(parent->d_inode,d);
 
-       pr_debug(" o %s removing done (%d)\n",d->d_name.name,
-                atomic_read(&d->d_count));
+       pr_debug(" o %s removing done (%d)\n",d->d_name.name, d->d_count);
 
        dput(parent);
 }
@@ -448,7 +442,6 @@ static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * den
                return error;
        }
 
-       dentry->d_op = &configfs_dentry_ops;
        d_rehash(dentry);
 
        return 0;
@@ -493,7 +486,10 @@ static struct dentry * configfs_lookup(struct inode *dir,
                 * If it doesn't exist and it isn't a NOT_PINNED item,
                 * it must be negative.
                 */
-               return simple_lookup(dir, dentry, nd);
+               if (dentry->d_name.len > NAME_MAX)
+                       return ERR_PTR(-ENAMETOOLONG);
+               d_add(dentry, NULL);
+               return NULL;
        }
 
 out: