diff options
| author | David S. Miller <davem@davemloft.net> | 2018-04-21 16:31:52 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2018-04-21 16:32:48 -0400 |
| commit | e0ada51db907ed2db5d46ad7ff86a8b5df68e59b (patch) | |
| tree | 858966cee69ad8a50e59c4e02dcbde6ba2916151 /fs/proc/generic.c | |
| parent | 0638eb573cde5888c0886c7f35da604e5db209a6 (diff) | |
| parent | 83beed7b2b26f232d782127792dd0cd4362fdc41 (diff) | |
| download | talos-op-linux-e0ada51db907ed2db5d46ad7ff86a8b5df68e59b.tar.gz talos-op-linux-e0ada51db907ed2db5d46ad7ff86a8b5df68e59b.zip | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts were simple overlapping changes in microchip
driver.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs/proc/generic.c')
| -rw-r--r-- | fs/proc/generic.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/fs/proc/generic.c b/fs/proc/generic.c index 04c4804cbdef..2078e70e1595 100644 --- a/fs/proc/generic.c +++ b/fs/proc/generic.c @@ -15,6 +15,7 @@ #include <linux/stat.h> #include <linux/mm.h> #include <linux/module.h> +#include <linux/namei.h> #include <linux/slab.h> #include <linux/printk.h> #include <linux/mount.h> @@ -217,6 +218,26 @@ void proc_free_inum(unsigned int inum) ida_simple_remove(&proc_inum_ida, inum - PROC_DYNAMIC_FIRST); } +static int proc_misc_d_revalidate(struct dentry *dentry, unsigned int flags) +{ + if (flags & LOOKUP_RCU) + return -ECHILD; + + if (atomic_read(&PDE(d_inode(dentry))->in_use) < 0) + return 0; /* revalidate */ + return 1; +} + +static int proc_misc_d_delete(const struct dentry *dentry) +{ + return atomic_read(&PDE(d_inode(dentry))->in_use) < 0; +} + +static const struct dentry_operations proc_misc_dentry_ops = { + .d_revalidate = proc_misc_d_revalidate, + .d_delete = proc_misc_d_delete, +}; + /* * Don't create negative dentries here, return -ENOENT by hand * instead. @@ -234,7 +255,7 @@ struct dentry *proc_lookup_de(struct inode *dir, struct dentry *dentry, inode = proc_get_inode(dir->i_sb, de); if (!inode) return ERR_PTR(-ENOMEM); - d_set_d_op(dentry, &simple_dentry_operations); + d_set_d_op(dentry, &proc_misc_dentry_ops); d_add(dentry, inode); return NULL; } |

