aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/proc/generic.c12
-rw-r--r--fs/proc/inode.c21
-rw-r--r--fs/proc/internal.h1
3 files changed, 22 insertions, 12 deletions
diff --git a/fs/proc/generic.c b/fs/proc/generic.c
index 3309f59d421b..be65b2082135 100644
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -19,7 +19,6 @@
19#include <linux/mount.h> 19#include <linux/mount.h>
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/idr.h> 21#include <linux/idr.h>
22#include <linux/namei.h>
23#include <linux/bitops.h> 22#include <linux/bitops.h>
24#include <linux/spinlock.h> 23#include <linux/spinlock.h>
25#include <linux/completion.h> 24#include <linux/completion.h>
@@ -223,17 +222,6 @@ void proc_free_inum(unsigned int inum)
223 spin_unlock_irqrestore(&proc_inum_lock, flags); 222 spin_unlock_irqrestore(&proc_inum_lock, flags);
224} 223}
225 224
226static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
227{
228 nd_set_link(nd, __PDE_DATA(dentry->d_inode));
229 return NULL;
230}
231
232static const struct inode_operations proc_link_inode_operations = {
233 .readlink = generic_readlink,
234 .follow_link = proc_follow_link,
235};
236
237/* 225/*
238 * Don't create negative dentries here, return -ENOENT by hand 226 * Don't create negative dentries here, return -ENOENT by hand
239 * instead. 227 * instead.
diff --git a/fs/proc/inode.c b/fs/proc/inode.c
index 13a50a32652d..7697b6621cfd 100644
--- a/fs/proc/inode.c
+++ b/fs/proc/inode.c
@@ -23,6 +23,7 @@
23#include <linux/slab.h> 23#include <linux/slab.h>
24#include <linux/mount.h> 24#include <linux/mount.h>
25#include <linux/magic.h> 25#include <linux/magic.h>
26#include <linux/namei.h>
26 27
27#include <asm/uaccess.h> 28#include <asm/uaccess.h>
28 29
@@ -393,6 +394,26 @@ static const struct file_operations proc_reg_file_ops_no_compat = {
393}; 394};
394#endif 395#endif
395 396
397static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
398{
399 struct proc_dir_entry *pde = PDE(dentry->d_inode);
400 if (unlikely(!use_pde(pde)))
401 return ERR_PTR(-EINVAL);
402 nd_set_link(nd, pde->data);
403 return pde;
404}
405
406static void proc_put_link(struct dentry *dentry, struct nameidata *nd, void *p)
407{
408 unuse_pde(p);
409}
410
411const struct inode_operations proc_link_inode_operations = {
412 .readlink = generic_readlink,
413 .follow_link = proc_follow_link,
414 .put_link = proc_put_link,
415};
416
396struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de) 417struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)
397{ 418{
398 struct inode *inode = new_inode_pseudo(sb); 419 struct inode *inode = new_inode_pseudo(sb);
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
index 6fcdba573e0f..c835b94c0cd3 100644
--- a/fs/proc/internal.h
+++ b/fs/proc/internal.h
@@ -200,6 +200,7 @@ struct pde_opener {
200 int closing; 200 int closing;
201 struct completion *c; 201 struct completion *c;
202}; 202};
203extern const struct inode_operations proc_link_inode_operations;
203 204
204extern const struct inode_operations proc_pid_link_inode_operations; 205extern const struct inode_operations proc_pid_link_inode_operations;
205 206