diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2015-04-14 23:42:49 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2015-05-11 04:18:19 +0200 |
commit | 90e4fc8890daecea72ef73ac8047050e3e8d32db (patch) | |
tree | 41920d19c3f34c94218ba9910b783047b187cca2 /fs/9p/vfs_inode_dotl.c | |
parent | 9p: don't bother with 4K allocation for 24-byte local array... (diff) | |
download | linux-90e4fc8890daecea72ef73ac8047050e3e8d32db.tar.xz linux-90e4fc8890daecea72ef73ac8047050e3e8d32db.zip |
9p: don't bother with __getname() in ->follow_link()
We copy there a kmalloc'ed string and proceed to kfree that string immediately
after that. Easier to just feed that string to nd_set_link() and _not_
kfree it until ->put_link() (which becomes kfree_put_link() in that case).
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/9p/vfs_inode_dotl.c')
-rw-r--r-- | fs/9p/vfs_inode_dotl.c | 31 |
1 files changed, 8 insertions, 23 deletions
diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 9861c7c951a6..bc2a91f2b910 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -912,33 +912,18 @@ error: static void * v9fs_vfs_follow_link_dotl(struct dentry *dentry, struct nameidata *nd) { - int retval; - struct p9_fid *fid; - char *link = __getname(); + struct p9_fid *fid = v9fs_fid_lookup(dentry); char *target; + int retval; p9_debug(P9_DEBUG_VFS, "%pd\n", dentry); - if (!link) { - link = ERR_PTR(-ENOMEM); - goto ndset; - } - fid = v9fs_fid_lookup(dentry); - if (IS_ERR(fid)) { - __putname(link); - link = ERR_CAST(fid); - goto ndset; - } + if (IS_ERR(fid)) + return ERR_CAST(fid); retval = p9_client_readlink(fid, &target); - if (!retval) { - strcpy(link, target); - kfree(target); - goto ndset; - } - __putname(link); - link = ERR_PTR(retval); -ndset: - nd_set_link(nd, link); + if (retval) + return ERR_PTR(retval); + nd_set_link(nd, target); return NULL; } @@ -1006,7 +991,7 @@ const struct inode_operations v9fs_file_inode_operations_dotl = { const struct inode_operations v9fs_symlink_inode_operations_dotl = { .readlink = generic_readlink, .follow_link = v9fs_vfs_follow_link_dotl, - .put_link = v9fs_vfs_put_link, + .put_link = kfree_put_link, .getattr = v9fs_vfs_getattr_dotl, .setattr = v9fs_vfs_setattr_dotl, .setxattr = generic_setxattr, |