From: Alexey Dobriyan <adobriyan@xxxxxxxxx> Subject: proc: switch struct proc_dir_entry::count to refcount ->count is honest reference count unlike ->in_use. Link: http://lkml.kernel.org/r/20180313174550.GA4332@avx2 Signed-off-by: Alexey Dobriyan <adobriyan@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- fs/proc/generic.c | 4 ++-- fs/proc/internal.h | 5 +++-- fs/proc/root.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff -puN fs/proc/generic.c~proc-switch-struct-proc_dir_entry-count-to-refcount fs/proc/generic.c --- a/fs/proc/generic.c~proc-switch-struct-proc_dir_entry-count-to-refcount +++ a/fs/proc/generic.c @@ -402,7 +402,7 @@ static struct proc_dir_entry *__proc_cre ent->mode = mode; ent->nlink = nlink; ent->subdir = RB_ROOT_CACHED; - atomic_set(&ent->count, 1); + refcount_set(&ent->refcnt, 1); spin_lock_init(&ent->pde_unload_lock); INIT_LIST_HEAD(&ent->pde_openers); proc_set_user(ent, (*parent)->uid, (*parent)->gid); @@ -553,7 +553,7 @@ EXPORT_SYMBOL(proc_set_user); void pde_put(struct proc_dir_entry *pde) { - if (atomic_dec_and_test(&pde->count)) { + if (refcount_dec_and_test(&pde->refcnt)) { proc_free_inum(pde->low_ino); pde_free(pde); } diff -puN fs/proc/internal.h~proc-switch-struct-proc_dir_entry-count-to-refcount fs/proc/internal.h --- a/fs/proc/internal.h~proc-switch-struct-proc_dir_entry-count-to-refcount +++ a/fs/proc/internal.h @@ -11,6 +11,7 @@ #include <linux/proc_fs.h> #include <linux/proc_ns.h> +#include <linux/refcount.h> #include <linux/spinlock.h> #include <linux/atomic.h> #include <linux/binfmts.h> @@ -36,7 +37,7 @@ struct proc_dir_entry { * negative -> it's going away RSN */ atomic_t in_use; - atomic_t count; /* use count */ + refcount_t refcnt; struct list_head pde_openers; /* who did ->open, but not ->release */ /* protects ->pde_openers and all struct pde_opener instances */ spinlock_t pde_unload_lock; @@ -168,7 +169,7 @@ int proc_readdir_de(struct file *, struc static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde) { - atomic_inc(&pde->count); + refcount_inc(&pde->refcnt); return pde; } extern void pde_put(struct proc_dir_entry *); diff -puN fs/proc/root.c~proc-switch-struct-proc_dir_entry-count-to-refcount fs/proc/root.c --- a/fs/proc/root.c~proc-switch-struct-proc_dir_entry-count-to-refcount +++ a/fs/proc/root.c @@ -199,7 +199,7 @@ struct proc_dir_entry proc_root = { .namelen = 5, .mode = S_IFDIR | S_IRUGO | S_IXUGO, .nlink = 2, - .count = ATOMIC_INIT(1), + .refcnt = REFCOUNT_INIT(1), .proc_iops = &proc_root_inode_operations, .proc_fops = &proc_root_operations, .parent = &proc_root, _ -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html