summaryrefslogtreecommitdiffstats
path: root/fs/sysv
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2015-11-23 21:11:08 -0500
committerLuis Henriques <luis.henriques@canonical.com>2015-12-18 16:06:32 +0000
commit9d02cebddca50757e1f6adca49693a893d80b1ef (patch)
tree6a9e322dd728367dac42729d29554e9760fa6748 /fs/sysv
parent57256089f2819a74e1b499bc2b79af5d6b7974d7 (diff)
downloadlinux-stable-9d02cebddca50757e1f6adca49693a893d80b1ef.tar.gz
linux-stable-9d02cebddca50757e1f6adca49693a893d80b1ef.tar.bz2
linux-stable-9d02cebddca50757e1f6adca49693a893d80b1ef.zip
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> [ luis: backported to 3.16: adjusted context ] Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
Diffstat (limited to 'fs/sysv')
-rw-r--r--fs/sysv/inode.c10
1 files changed, 2 insertions, 8 deletions
diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c
index 88956309cc86..02fa1dcc5969 100644
--- a/fs/sysv/inode.c
+++ b/fs/sysv/inode.c
@@ -162,14 +162,8 @@ void sysv_set_inode(struct inode *inode, dev_t rdev)
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);
}