diff options
author | Fabian Frederick <fabf@skynet.be> | 2017-04-15 08:54:36 +0200 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-04-26 23:54:05 -0400 |
commit | f1bf90724de652efdf493ea877ee050e7e6091c4 (patch) | |
tree | 7ffddf20bfec0950cf22cbfd9b1b7fd7512a5ccf /fs | |
parent | 4f7d029b9bf009fbee76bb10c0c4351a1870d2f3 (diff) | |
download | blackbird-obmc-linux-f1bf90724de652efdf493ea877ee050e7e6091c4.tar.gz blackbird-obmc-linux-f1bf90724de652efdf493ea877ee050e7e6091c4.zip |
fs/affs: bugfix: make symbolic links work again
AFFS symbolic links were broken since kernel 2.6.29
Problem was bisected to the following
commit ebd09abbd969 ("vfs: ensure page symlinks are NUL-terminated")
commit 035146851cfa ("vfs: introduce helper function to safely
NUL-terminate symlinks")
AFFS wasn't setting inode size when reading symbolic link from disk or
creating a new one. Result was zero allocation in pagecache.
ln -s file symlink
ls -lrt
file
symlink ->
This patch adds inode isize information on inode get and symbolic link
addition.
Signed-off-by: Fabian Frederick <fabf@skynet.be>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/affs/inode.c | 1 | ||||
-rw-r--r-- | fs/affs/namei.c | 1 |
2 files changed, 2 insertions, 0 deletions
diff --git a/fs/affs/inode.c b/fs/affs/inode.c index abcc59899229..fd4ef3c40e40 100644 --- a/fs/affs/inode.c +++ b/fs/affs/inode.c @@ -140,6 +140,7 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino) inode->i_fop = &affs_file_operations; break; case ST_SOFTLINK: + inode->i_size = strlen((char *)AFFS_HEAD(bh)->table); inode->i_mode |= S_IFLNK; inode_nohighmem(inode); inode->i_op = &affs_symlink_inode_operations; diff --git a/fs/affs/namei.c b/fs/affs/namei.c index 96dd1d09a273..b02da4d421cc 100644 --- a/fs/affs/namei.c +++ b/fs/affs/namei.c @@ -365,6 +365,7 @@ affs_symlink(struct inode *dir, struct dentry *dentry, const char *symname) symname++; } *p = 0; + inode->i_size = i + 1; mark_buffer_dirty_inode(bh, inode); affs_brelse(bh); mark_inode_dirty(inode); |