aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2018-07-19 17:35:51 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2018-07-19 17:35:51 -0400
commitf2df5da66262f429cbb0d5da0e72ada6a6345f28 (patch)
treefc8fd9d0e8d1ff054167bb147ab4734659a58271
parent69448867abcb231afaa7891ff9d9fd04b2b94a0d (diff)
fold generic_readlink() into its only caller
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r--fs/namei.c36
1 files changed, 12 insertions, 24 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 734cef54fdf8..bb6c6e4f59e2 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -4712,29 +4712,6 @@ out:
4712 return len; 4712 return len;
4713} 4713}
4714 4714
4715/*
4716 * A helper for ->readlink(). This should be used *ONLY* for symlinks that
4717 * have ->get_link() not calling nd_jump_link(). Using (or not using) it
4718 * for any given inode is up to filesystem.
4719 */
4720static int generic_readlink(struct dentry *dentry, char __user *buffer,
4721 int buflen)
4722{
4723 DEFINE_DELAYED_CALL(done);
4724 struct inode *inode = d_inode(dentry);
4725 const char *link = inode->i_link;
4726 int res;
4727
4728 if (!link) {
4729 link = inode->i_op->get_link(dentry, inode, &done);
4730 if (IS_ERR(link))
4731 return PTR_ERR(link);
4732 }
4733 res = readlink_copy(buffer, buflen, link);
4734 do_delayed_call(&done);
4735 return res;
4736}
4737
4738/** 4715/**
4739 * vfs_readlink - copy symlink body into userspace buffer 4716 * vfs_readlink - copy symlink body into userspace buffer
4740 * @dentry: dentry on which to get symbolic link 4717 * @dentry: dentry on which to get symbolic link
@@ -4748,6 +4725,9 @@ static int generic_readlink(struct dentry *dentry, char __user *buffer,
4748int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen) 4725int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen)
4749{ 4726{
4750 struct inode *inode = d_inode(dentry); 4727 struct inode *inode = d_inode(dentry);
4728 DEFINE_DELAYED_CALL(done);
4729 const char *link;
4730 int res;
4751 4731
4752 if (unlikely(!(inode->i_opflags & IOP_DEFAULT_READLINK))) { 4732 if (unlikely(!(inode->i_opflags & IOP_DEFAULT_READLINK))) {
4753 if (unlikely(inode->i_op->readlink)) 4733 if (unlikely(inode->i_op->readlink))
@@ -4761,7 +4741,15 @@ int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen)
4761 spin_unlock(&inode->i_lock); 4741 spin_unlock(&inode->i_lock);
4762 } 4742 }
4763 4743
4764 return generic_readlink(dentry, buffer, buflen); 4744 link = inode->i_link;
4745 if (!link) {
4746 link = inode->i_op->get_link(dentry, inode, &done);
4747 if (IS_ERR(link))
4748 return PTR_ERR(link);
4749 }
4750 res = readlink_copy(buffer, buflen, link);
4751 do_delayed_call(&done);
4752 return res;
4765} 4753}
4766EXPORT_SYMBOL(vfs_readlink); 4754EXPORT_SYMBOL(vfs_readlink);
4767 4755