fix sysvfs symlinks
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 ;-/ Cc: stable@vger.kernel.org # all of them, not that anyone cared Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
1ec218373b
commit
0ebf7f10d6
|
@ -162,15 +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 = &simple_symlink_inode_operations;
|
||||
inode->i_link = (char *)SYSV_I(inode)->i_data;
|
||||
nd_terminate_link(inode->i_link, 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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue