Greg KH wrote on 2018/12/22 19:25:
On Sat, Dec 22, 2018 at 04:45:36PM +0800, yangerkun wrote:
Remove inc_nlink in debugfs_create_automount, or this inode will never
be free.

Signed-off-by: yangerkun <yanger...@huawei.com>
---
  fs/debugfs/inode.c | 3 +--
  1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index 13b01351dd1c..9294238e364f 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -551,12 +551,11 @@ struct dentry *debugfs_create_automount(const char *name,
        if (unlikely(!inode))
                return failed_creating(dentry);
+ /* directory inodes start off with i_nlink == 2 (for "." entry) */
        make_empty_dir_inode(inode);
        inode->i_flags |= S_AUTOMOUNT;
        inode->i_private = data;
        dentry->d_fsdata = (void *)f;
-       /* directory inodes start off with i_nlink == 2 (for "." entry) */
-       inc_nlink(inode);

Again, have you tested this and how?  How did you find this issue?

thanks,

greg k-h

.

Thanks a lot for Al Viro's explain.

I was confusing about i_nlink and i_count before, so after insert and remove module show as below, i think the inode can still exist with nlink will be 1.

So the only problem is that the nlink should be 2 for a empty dir, and for debugfs,the influence is that the stat for the dir. Right?

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/debugfs.h>

static char *name = "test-dir";
module_param(name, charp, 0644);
MODULE_PARM_DESC(name, "Get an string(char *) value from user...\n");

struct inode *inode;

int init_module(void)
{
    struct dentry *dentry;

    dentry = debugfs_create_automount(name, NULL, NULL, NULL);
    inode = dentry->d_inode;
    debugfs_remove(dentry);
    return 0;
}

void cleanup_module(void)
{
    printk("%d\n", inode->i_nlink);
}

MODULE_LICENSE("GPL");

Thanks,
Kun.

Reply via email to