diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2018-07-19 17:35:51 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2018-07-19 17:35:51 -0400 |
commit | f2df5da66262f429cbb0d5da0e72ada6a6345f28 (patch) | |
tree | fc8fd9d0e8d1ff054167bb147ab4734659a58271 | |
parent | 69448867abcb231afaa7891ff9d9fd04b2b94a0d (diff) |
fold generic_readlink() into its only caller
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/namei.c | 36 |
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 | */ | ||
4720 | static 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, | |||
4748 | int vfs_readlink(struct dentry *dentry, char __user *buffer, int buflen) | 4725 | int 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 | } |
4766 | EXPORT_SYMBOL(vfs_readlink); | 4754 | EXPORT_SYMBOL(vfs_readlink); |
4767 | 4755 | ||