| From 0ebf7f10d67a70e120f365018f1c5fce9ddc567d Mon Sep 17 00:00:00 2001 |
| From: Al Viro <viro@zeniv.linux.org.uk> |
| Date: Mon, 23 Nov 2015 21:11:08 -0500 |
| Subject: fix sysvfs symlinks |
| |
| commit 0ebf7f10d67a70e120f365018f1c5fce9ddc567d upstream. |
| |
| The thing got broken back in 2002 - sysvfs does *not* have inline |
| symlinks; even short ones have bodies stored in the first block |
| of file. sysv_symlink() handles that correctly; unfortunately, |
| attempting to look an existing symlink up will end up confusing |
| them for inline symlinks, and interpret the block number containing |
| the body as the body itself. |
| |
| Nobody has noticed until now, which says something about the level |
| of testing sysvfs gets ;-/ |
| |
| Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> |
| [lizf: Backported to 3.4: adjust context] |
| Signed-off-by: Zefan Li <lizefan@huawei.com> |
| --- |
| fs/sysv/inode.c | 10 ++-------- |
| 1 file changed, 2 insertions(+), 8 deletions(-) |
| |
| --- a/fs/sysv/inode.c |
| +++ b/fs/sysv/inode.c |
| @@ -176,14 +176,8 @@ void sysv_set_inode(struct inode *inode, |
| inode->i_fop = &sysv_dir_operations; |
| inode->i_mapping->a_ops = &sysv_aops; |
| } else if (S_ISLNK(inode->i_mode)) { |
| - if (inode->i_blocks) { |
| - inode->i_op = &sysv_symlink_inode_operations; |
| - inode->i_mapping->a_ops = &sysv_aops; |
| - } else { |
| - inode->i_op = &sysv_fast_symlink_inode_operations; |
| - nd_terminate_link(SYSV_I(inode)->i_data, inode->i_size, |
| - sizeof(SYSV_I(inode)->i_data) - 1); |
| - } |
| + inode->i_op = &sysv_symlink_inode_operations; |
| + inode->i_mapping->a_ops = &sysv_aops; |
| } else |
| init_special_inode(inode, inode->i_mode, rdev); |
| } |