The only thing any ->put_link() function did with the nameidata was to call nd_get_link() to get the link name. So now just pass the link name directly. This allows us to make nd_get_link() completely local to namei.c. Suggested-by: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Signed-off-by: NeilBrown <neilb@xxxxxxx> --- Documentation/filesystems/Locking | 2 +- Documentation/filesystems/porting | 5 +++++ Documentation/filesystems/vfs.txt | 4 ++-- drivers/staging/lustre/lustre/llite/symlink.c | 2 +- fs/9p/v9fs.h | 2 +- fs/9p/vfs_inode.c | 4 +--- fs/configfs/symlink.c | 2 +- fs/fuse/dir.c | 4 ++-- fs/hostfs/hostfs_kern.c | 3 +-- fs/hppfs/hppfs.c | 4 ++-- fs/kernfs/symlink.c | 3 +-- fs/libfs.c | 4 +--- fs/namei.c | 13 +++++++------ fs/overlayfs/inode.c | 4 ++-- fs/proc/inode.c | 2 +- include/linux/fs.h | 6 +++--- include/linux/namei.h | 1 - mm/shmem.c | 4 ++-- 18 files changed, 34 insertions(+), 35 deletions(-) diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index f91926f2f482..2e19f5f543b3 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking @@ -51,7 +51,7 @@ prototypes: struct inode *, struct dentry *, unsigned int); int (*readlink) (struct dentry *, char __user *,int); void * (*follow_link) (struct dentry *, struct nameidata *); - void (*put_link) (struct dentry *, struct nameidata *, void *); + void (*put_link) (struct dentry *, char *, void *); void (*truncate) (struct inode *); int (*permission) (struct inode *, int, unsigned int); int (*get_acl)(struct inode *, int); diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index fa2db081505e..088dd1fbba90 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting @@ -471,3 +471,8 @@ in your dentry operations instead. [mandatory] f_dentry is gone; use f_path.dentry, or, better yet, see if you can avoid it entirely. +-- +[mandatory] + ->put_link now takes a 'char *' rather than a 'struct nameidata*'. + Instead of calling nd_get_link() on the later, just use the former + directly. diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 966b22829f3b..cb8f31bc2fec 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt @@ -350,8 +350,8 @@ struct inode_operations { int (*rename2) (struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); int (*readlink) (struct dentry *, char __user *,int); - void * (*follow_link) (struct dentry *, struct nameidata *); - void (*put_link) (struct dentry *, struct nameidata *, void *); + void * (*follow_link) (struct dentry *, struct nameidata *); + void (*put_link) (struct dentry *, char *, void *); int (*permission) (struct inode *, int); int (*get_acl)(struct inode *, int); int (*setattr) (struct dentry *, struct iattr *); diff --git a/drivers/staging/lustre/lustre/llite/symlink.c b/drivers/staging/lustre/lustre/llite/symlink.c index ba37eb6b29dc..d2b4cd1399c3 100644 --- a/drivers/staging/lustre/lustre/llite/symlink.c +++ b/drivers/staging/lustre/lustre/llite/symlink.c @@ -158,7 +158,7 @@ static void *ll_follow_link(struct dentry *dentry, struct nameidata *nd) return request; } -static void ll_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) +static void ll_put_link(struct dentry *dentry, char *link, void *cookie) { ptlrpc_req_finished(cookie); } diff --git a/fs/9p/v9fs.h b/fs/9p/v9fs.h index 099c7712631c..239307689a64 100644 --- a/fs/9p/v9fs.h +++ b/fs/9p/v9fs.h @@ -150,7 +150,7 @@ extern int v9fs_vfs_unlink(struct inode *i, struct dentry *d); extern int v9fs_vfs_rmdir(struct inode *i, struct dentry *d); extern int v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry); -extern void v9fs_vfs_put_link(struct dentry *dentry, struct nameidata *nd, +extern void v9fs_vfs_put_link(struct dentry *dentry, char *link, void *p); extern struct inode *v9fs_inode_from_fid(struct v9fs_session_info *v9ses, struct p9_fid *fid, diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 3662f1d1d9cf..f39075956cdc 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -1310,10 +1310,8 @@ static void *v9fs_vfs_follow_link(struct dentry *dentry, struct nameidata *nd) */ void -v9fs_vfs_put_link(struct dentry *dentry, struct nameidata *nd, void *p) +v9fs_vfs_put_link(struct dentry *dentry, char *s, void *p) { - char *s = nd_get_link(nd); - p9_debug(P9_DEBUG_VFS, " %pd %s\n", dentry, IS_ERR(s) ? "<error>" : s); if (!IS_ERR(s)) diff --git a/fs/configfs/symlink.c b/fs/configfs/symlink.c index cc9f2546ea4a..e860ddb2bd61 100644 --- a/fs/configfs/symlink.c +++ b/fs/configfs/symlink.c @@ -296,7 +296,7 @@ static void *configfs_follow_link(struct dentry *dentry, struct nameidata *nd) return NULL; } -static void configfs_put_link(struct dentry *dentry, struct nameidata *nd, +static void configfs_put_link(struct dentry *dentry, char *link, void *cookie) { if (cookie) { diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 1545b711ddcf..3fd76f1afd4e 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -1406,9 +1406,9 @@ static void *fuse_follow_link(struct dentry *dentry, struct nameidata *nd) return NULL; } -static void fuse_put_link(struct dentry *dentry, struct nameidata *nd, void *c) +static void fuse_put_link(struct dentry *dentry, char *link, void *c) { - free_link(nd_get_link(nd)); + free_link(link); } static int fuse_dir_open(struct inode *inode, struct file *file) diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c index fd62cae0fdcb..b59cdb8a25d4 100644 --- a/fs/hostfs/hostfs_kern.c +++ b/fs/hostfs/hostfs_kern.c @@ -906,9 +906,8 @@ static void *hostfs_follow_link(struct dentry *dentry, struct nameidata *nd) return NULL; } -static void hostfs_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) +static void hostfs_put_link(struct dentry *dentry, char *s, void *cookie) { - char *s = nd_get_link(nd); if (!IS_ERR(s)) __putname(s); } diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c index 043ac9d77262..bcf70e5331f6 100644 --- a/fs/hppfs/hppfs.c +++ b/fs/hppfs/hppfs.c @@ -649,13 +649,13 @@ static void *hppfs_follow_link(struct dentry *dentry, struct nameidata *nd) return proc_dentry->d_inode->i_op->follow_link(proc_dentry, nd); } -static void hppfs_put_link(struct dentry *dentry, struct nameidata *nd, +static void hppfs_put_link(struct dentry *dentry, char *link, void *cookie) { struct dentry *proc_dentry = HPPFS_I(dentry->d_inode)->proc_dentry; if (proc_dentry->d_inode->i_op->put_link) - proc_dentry->d_inode->i_op->put_link(proc_dentry, nd, cookie); + proc_dentry->d_inode->i_op->put_link(proc_dentry, link, cookie); } static const struct inode_operations hppfs_dir_iops = { diff --git a/fs/kernfs/symlink.c b/fs/kernfs/symlink.c index 8a198898e39a..2aa55cbce0c2 100644 --- a/fs/kernfs/symlink.c +++ b/fs/kernfs/symlink.c @@ -125,10 +125,9 @@ static void *kernfs_iop_follow_link(struct dentry *dentry, struct nameidata *nd) return NULL; } -static void kernfs_iop_put_link(struct dentry *dentry, struct nameidata *nd, +static void kernfs_iop_put_link(struct dentry *dentry, char *page, void *cookie) { - char *page = nd_get_link(nd); if (!IS_ERR(page)) free_page((unsigned long)page); } diff --git a/fs/libfs.c b/fs/libfs.c index 0ab65122ee45..88cae4d39bd1 100644 --- a/fs/libfs.c +++ b/fs/libfs.c @@ -1024,10 +1024,8 @@ int noop_fsync(struct file *file, loff_t start, loff_t end, int datasync) } EXPORT_SYMBOL(noop_fsync); -void kfree_put_link(struct dentry *dentry, struct nameidata *nd, - void *cookie) +void kfree_put_link(struct dentry *dentry, char *s, void *cookie) { - char *s = nd_get_link(nd); if (!IS_ERR(s)) kfree(s); } diff --git a/fs/namei.c b/fs/namei.c index 53bead4f5bdf..7ad88ea8c609 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -739,17 +739,16 @@ void nd_set_link(struct nameidata *nd, char *path) } EXPORT_SYMBOL(nd_set_link); -char *nd_get_link(struct nameidata *nd) +static inline char *nd_get_link(struct nameidata *nd) { return nd->saved_names[nd->depth]; } -EXPORT_SYMBOL(nd_get_link); static inline void put_link(struct nameidata *nd, struct path *link, void *cookie) { struct inode *inode = link->dentry->d_inode; if (inode->i_op->put_link) - inode->i_op->put_link(link->dentry, nd, cookie); + inode->i_op->put_link(link->dentry, nd_get_link(nd), cookie); path_put(link); } @@ -4465,9 +4464,11 @@ int generic_readlink(struct dentry *dentry, char __user *buffer, int buflen) if (IS_ERR(cookie)) res = PTR_ERR(cookie); else { - res = readlink_copy(buffer, buflen, nd_get_link(&nd)); + char *link = nd_get_link(&nd); + + res = readlink_copy(buffer, buflen, link); if (dentry->d_inode->i_op->put_link) - dentry->d_inode->i_op->put_link(dentry, &nd, cookie); + dentry->d_inode->i_op->put_link(dentry, link, cookie); } set_nameidata(saved); return res; @@ -4509,7 +4510,7 @@ void *page_follow_link_light(struct dentry *dentry, struct nameidata *nd) } EXPORT_SYMBOL(page_follow_link_light); -void page_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) +void page_put_link(struct dentry *dentry, char *link, void *cookie) { struct page *page = cookie; diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c index 1b4b9c5e51b7..f1abb51bf9ec 100644 --- a/fs/overlayfs/inode.c +++ b/fs/overlayfs/inode.c @@ -172,7 +172,7 @@ static void *ovl_follow_link(struct dentry *dentry, struct nameidata *nd) return data; } -static void ovl_put_link(struct dentry *dentry, struct nameidata *nd, void *c) +static void ovl_put_link(struct dentry *dentry, char *link, void *c) { struct inode *realinode; struct ovl_link_data *data = c; @@ -181,7 +181,7 @@ static void ovl_put_link(struct dentry *dentry, struct nameidata *nd, void *c) return; realinode = data->realdentry->d_inode; - realinode->i_op->put_link(data->realdentry, nd, data->cookie); + realinode->i_op->put_link(data->realdentry, link, data->cookie); kfree(data); } diff --git a/fs/proc/inode.c b/fs/proc/inode.c index 7697b6621cfd..a4a716e6d6b9 100644 --- a/fs/proc/inode.c +++ b/fs/proc/inode.c @@ -403,7 +403,7 @@ static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd) return pde; } -static void proc_put_link(struct dentry *dentry, struct nameidata *nd, void *p) +static void proc_put_link(struct dentry *dentry, char *link, void *p) { unuse_pde(p); } diff --git a/include/linux/fs.h b/include/linux/fs.h index b821fa32ba3f..510b749c4040 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1579,7 +1579,7 @@ struct inode_operations { struct posix_acl * (*get_acl)(struct inode *, int); int (*readlink) (struct dentry *, char __user *,int); - void (*put_link) (struct dentry *, struct nameidata *, void *); + void (*put_link) (struct dentry *, char *, void *); int (*create) (struct inode *,struct dentry *, umode_t, bool); int (*link) (struct dentry *,struct inode *,struct dentry *); @@ -2650,12 +2650,12 @@ extern const struct file_operations generic_ro_fops; extern int readlink_copy(char __user *, int, const char *); extern int page_readlink(struct dentry *, char __user *, int); extern void *page_follow_link_light(struct dentry *, struct nameidata *); -extern void page_put_link(struct dentry *, struct nameidata *, void *); +extern void page_put_link(struct dentry *, char *, void *); extern int __page_symlink(struct inode *inode, const char *symname, int len, int nofs); extern int page_symlink(struct inode *inode, const char *symname, int len); extern const struct inode_operations page_symlink_inode_operations; -extern void kfree_put_link(struct dentry *, struct nameidata *, void *); +extern void kfree_put_link(struct dentry *, char *, void *); extern int generic_readlink(struct dentry *, char __user *, int); extern void generic_fillattr(struct inode *, struct kstat *); int vfs_getattr_nosec(struct path *path, struct kstat *stat); diff --git a/include/linux/namei.h b/include/linux/namei.h index c8990779f0c3..2ec27f2457d6 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h @@ -72,7 +72,6 @@ extern void unlock_rename(struct dentry *, struct dentry *); extern void nd_jump_link(struct nameidata *nd, struct path *path); extern void nd_set_link(struct nameidata *nd, char *path); -extern char *nd_get_link(struct nameidata *nd); static inline void nd_terminate_link(void *name, size_t len, size_t maxlen) { diff --git a/mm/shmem.c b/mm/shmem.c index cf2d0ca010bc..53bf4d160e8b 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2490,9 +2490,9 @@ static void *shmem_follow_link(struct dentry *dentry, struct nameidata *nd) return page; } -static void shmem_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie) +static void shmem_put_link(struct dentry *dentry, char *link, void *cookie) { - if (!IS_ERR(nd_get_link(nd))) { + if (!IS_ERR(link)) { struct page *page = cookie; kunmap(page); mark_page_accessed(page); -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html