These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / fs / debugfs / inode.c
index 1275604..b7fcc0d 100644 (file)
@@ -44,11 +44,6 @@ static struct inode *debugfs_get_inode(struct super_block *sb)
        return inode;
 }
 
-static inline int debugfs_positive(struct dentry *dentry)
-{
-       return d_really_is_positive(dentry) && !d_unhashed(dentry);
-}
-
 struct debugfs_mount_opts {
        kuid_t uid;
        kgid_t gid;
@@ -174,7 +169,7 @@ static void debugfs_evict_inode(struct inode *inode)
        truncate_inode_pages_final(&inode->i_data);
        clear_inode(inode);
        if (S_ISLNK(inode->i_mode))
-               kfree(inode->i_private);
+               kfree(inode->i_link);
 }
 
 static const struct super_operations debugfs_super_operations = {
@@ -276,8 +271,12 @@ static struct dentry *start_creating(const char *name, struct dentry *parent)
                dput(dentry);
                dentry = ERR_PTR(-EEXIST);
        }
-       if (IS_ERR(dentry))
+
+       if (IS_ERR(dentry)) {
                mutex_unlock(&d_inode(parent)->i_mutex);
+               simple_release_fs(&debugfs_mount, &debugfs_mount_count);
+       }
+
        return dentry;
 }
 
@@ -511,8 +510,8 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
                return failed_creating(dentry);
        }
        inode->i_mode = S_IFLNK | S_IRWXUGO;
-       inode->i_op = &debugfs_link_operations;
-       inode->i_private = link;
+       inode->i_op = &simple_symlink_inode_operations;
+       inode->i_link = link;
        d_instantiate(dentry, inode);
        return end_creating(dentry);
 }
@@ -522,7 +521,7 @@ static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
 {
        int ret = 0;
 
-       if (debugfs_positive(dentry)) {
+       if (simple_positive(dentry)) {
                dget(dentry);
                if (d_is_dir(dentry))
                        ret = simple_rmdir(d_inode(parent), dentry);
@@ -538,7 +537,8 @@ static int __debugfs_remove(struct dentry *dentry, struct dentry *parent)
 /**
  * debugfs_remove - removes a file or directory from the debugfs filesystem
  * @dentry: a pointer to a the dentry of the file or directory to be
- *          removed.
+ *          removed.  If this parameter is NULL or an error value, nothing
+ *          will be done.
  *
  * This function removes a file or directory in debugfs that was previously
  * created with a call to another debugfs function (like
@@ -570,7 +570,8 @@ EXPORT_SYMBOL_GPL(debugfs_remove);
 
 /**
  * debugfs_remove_recursive - recursively removes a directory
- * @dentry: a pointer to a the dentry of the directory to be removed.
+ * @dentry: a pointer to a the dentry of the directory to be removed.  If this
+ *          parameter is NULL or an error value, nothing will be done.
  *
  * This function recursively removes a directory tree in debugfs that
  * was previously created with a call to another debugfs function
@@ -602,7 +603,7 @@ void debugfs_remove_recursive(struct dentry *dentry)
         */
        spin_lock(&parent->d_lock);
        list_for_each_entry(child, &parent->d_subdirs, d_child) {
-               if (!debugfs_positive(child))
+               if (!simple_positive(child))
                        continue;
 
                /* perhaps simple_empty(child) makes more sense */
@@ -623,7 +624,7 @@ void debugfs_remove_recursive(struct dentry *dentry)
                 * from d_subdirs. When releasing the parent->d_lock we can
                 * no longer trust that the next pointer is valid.
                 * Restart the loop. We'll skip this one with the
-                * debugfs_positive() check.
+                * simple_positive() check.
                 */
                goto loop;
        }