sysfs: use check_submounts_and_drop()
[platform/adaptation/renesas_rcar/renesas_kernel.git] / fs / sysfs / dir.c
index e068e74..4d83ced 100644 (file)
@@ -46,7 +46,7 @@ static unsigned int sysfs_name_hash(const void *ns, const char *name)
        unsigned int len = strlen(name);
        while (len--)
                hash = partial_name_hash(*name++, hash);
-       hash = ( end_name_hash(hash) ^ hash_ptr( (void *)ns, 31 ) );
+       hash = (end_name_hash(hash) ^ hash_ptr((void *)ns, 31));
        hash &= 0x7fffffffU;
        /* Reserve hash numbers 0, 1 and INT_MAX for magic directory entries */
        if (hash < 1)
@@ -258,7 +258,7 @@ static void sysfs_free_ino(unsigned int ino)
        spin_unlock(&sysfs_ino_lock);
 }
 
-void release_sysfs_dirent(struct sysfs_dirent * sd)
+void release_sysfs_dirent(struct sysfs_dirent *sd)
 {
        struct sysfs_dirent *parent_sd;
 
@@ -297,7 +297,6 @@ static int sysfs_dentry_delete(const struct dentry *dentry)
 static int sysfs_dentry_revalidate(struct dentry *dentry, unsigned int flags)
 {
        struct sysfs_dirent *sd;
-       int is_dir;
        int type;
 
        if (flags & LOOKUP_RCU)
@@ -341,18 +340,15 @@ out_bad:
         * is performed at its new name the dentry will be readded
         * to the dcache hashes.
         */
-       is_dir = (sysfs_type(sd) == SYSFS_DIR);
        mutex_unlock(&sysfs_mutex);
-       if (is_dir) {
-               /* If we have submounts we must allow the vfs caches
-                * to lie about the state of the filesystem to prevent
-                * leaks and other nasty things.
-                */
-               if (have_submounts(dentry))
-                       goto out_valid;
-               shrink_dcache_parent(dentry);
-       }
-       d_drop(dentry);
+
+       /* If we have submounts we must allow the vfs caches
+        * to lie about the state of the filesystem to prevent
+        * leaks and other nasty things.
+        */
+       if (check_submounts_and_drop(dentry) != 0)
+               goto out_valid;
+
        return 0;
 }
 
@@ -451,7 +447,7 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
 
        if (!!sysfs_ns_type(acxt->parent_sd) != !!sd->s_ns) {
                WARN(1, KERN_WARNING "sysfs: ns %s in '%s' for '%s'\n",
-                       sysfs_ns_type(acxt->parent_sd)? "required": "invalid",
+                       sysfs_ns_type(acxt->parent_sd) ? "required" : "invalid",
                        acxt->parent_sd->s_name, sd->s_name);
                return -EINVAL;
        }
@@ -619,7 +615,7 @@ struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd,
 
        if (!!sysfs_ns_type(parent_sd) != !!ns) {
                WARN(1, KERN_WARNING "sysfs: ns %s in '%s' for '%s'\n",
-                       sysfs_ns_type(parent_sd)? "required": "invalid",
+                       sysfs_ns_type(parent_sd) ? "required" : "invalid",
                        parent_sd->s_name, name);
                return NULL;
        }
@@ -674,7 +670,7 @@ static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
        enum kobj_ns_type type, const void *ns, const char *name,
        struct sysfs_dirent **p_sd)
 {
-       umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
+       umode_t mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
        struct sysfs_addrm_cxt acxt;
        struct sysfs_dirent *sd;
        int rc;
@@ -735,9 +731,9 @@ static enum kobj_ns_type sysfs_read_ns_type(struct kobject *kobj)
 
 /**
  *     sysfs_create_dir - create a directory for an object.
- *     @kobj:          object we're creating directory for. 
+ *     @kobj:          object we're creating directory for.
  */
-int sysfs_create_dir(struct kobject * kobj)
+int sysfs_create_dir(struct kobject *kobj)
 {
        enum kobj_ns_type type;
        struct sysfs_dirent *parent_sd, *sd;
@@ -764,8 +760,8 @@ int sysfs_create_dir(struct kobject * kobj)
        return error;
 }
 
-static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
-                               unsigned int flags)
+static struct dentry *sysfs_lookup(struct inode *dir, struct dentry *dentry,
+                                  unsigned int flags)
 {
        struct dentry *ret = NULL;
        struct dentry *parent = dentry->d_parent;
@@ -857,7 +853,7 @@ static void __sysfs_remove_dir(struct sysfs_dirent *dir_sd)
  *     what used to be sysfs_rmdir() below, instead of calling separately.
  */
 
-void sysfs_remove_dir(struct kobject * kobj)
+void sysfs_remove_dir(struct kobject *kobj)
 {
        struct sysfs_dirent *sd = kobj->sd;
 
@@ -896,7 +892,9 @@ int sysfs_rename(struct sysfs_dirent *sd,
                sd->s_name = new_name;
        }
 
-       /* Move to the appropriate place in the appropriate directories rbtree. */
+       /*
+        * Move to the appropriate place in the appropriate directories rbtree.
+        */
        sysfs_unlink_sibling(sd);
        sysfs_get(new_parent_sd);
        sysfs_put(sd->s_parent);
@@ -988,20 +986,21 @@ static struct sysfs_dirent *sysfs_dir_next_pos(const void *ns,
        struct sysfs_dirent *parent_sd, ino_t ino, struct sysfs_dirent *pos)
 {
        pos = sysfs_dir_pos(ns, parent_sd, ino, pos);
-       if (pos) do {
-               struct rb_node *node = rb_next(&pos->s_rb);
-               if (!node)
-                       pos = NULL;
-               else
-                       pos = to_sysfs_dirent(node);
-       } while (pos && pos->s_ns != ns);
+       if (pos)
+               do {
+                       struct rb_node *node = rb_next(&pos->s_rb);
+                       if (!node)
+                               pos = NULL;
+                       else
+                               pos = to_sysfs_dirent(node);
+               } while (pos && pos->s_ns != ns);
        return pos;
 }
 
 static int sysfs_readdir(struct file *file, struct dir_context *ctx)
 {
        struct dentry *dentry = file->f_path.dentry;
-       struct sysfs_dirent * parent_sd = dentry->d_fsdata;
+       struct sysfs_dirent *parent_sd = dentry->d_fsdata;
        struct sysfs_dirent *pos = file->private_data;
        enum kobj_ns_type type;
        const void *ns;