ACK: [TRUSTY][SRU][PATCH 1/1] ext4: handle symlink properly with inline_data
Chris J Arges
chris.j.arges at canonical.com
Fri Aug 8 13:45:27 UTC 2014
On 08/08/2014 04:31 AM, Luis Henriques wrote:
> From: Zheng Liu <wenqing.lz at taobao.com>
>
> BugLink: http://bugs.launchpad.net/bugs/1349020
>
> This commit tries to fix a bug that we can't read symlink properly with
> inline data feature when the length of symlink is greater than 60 bytes
> but less than extra space.
>
> The key issue is in ext4_inode_is_fast_symlink() that it doesn't check
> whether or not an inode has inline data. When the user creates a new
> symlink, an inode will be allocated with MAY_INLINE_DATA flag. Then
> symlink will be stored in ->i_block and extended attribute space. In
> the mean time, this inode is with inline data flag. After remounting
> it, ext4_inode_is_fast_symlink() function thinks that this inode is a
> fast symlink so that the data in ->i_block is copied to the user, and
> the data in extra space is trimmed. In fact this inode should be as a
> normal symlink.
>
> The following script can hit this bug.
>
> #!/bin/bash
>
> cd ${MNT}
> filename=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
> rm -rf test
> mkdir test
> cd test
> echo "hello" >$filename
> ln -s $filename symlinkfile
> cd
> sudo umount /mnt/sda1
> sudo mount -t ext4 /dev/sda1 /mnt/sda1
> readlink /mnt/sda1/test/symlinkfile
>
> After applying this patch, it will break the assumption in e2fsck
> because the original implementation doesn't want to support symlink
> with inline data.
>
> Reported-by: "Darrick J. Wong" <darrick.wong at oracle.com>
> Reported-by: Ian Nartowicz <claws at nartowicz.co.uk>
> Cc: Ian Nartowicz <claws at nartowicz.co.uk>
> Cc: Tao Ma <tm at tao.ma>
> Cc: "Darrick J. Wong" <darrick.wong at oracle.com>
> Cc: Andreas Dilger <adilger.kernel at dilger.ca>
> Signed-off-by: Zheng Liu <wenqing.lz at taobao.com>
> Signed-off-by: Theodore Ts'o <tytso at mit.edu>
> (cherry picked from commit bd9db175dde14b606265e0d37e8319d96fe1a58f)
> Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
> ---
> fs/ext4/inode.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
> index 4fafd0949441..658f30361b82 100644
> --- a/fs/ext4/inode.c
> +++ b/fs/ext4/inode.c
> @@ -148,6 +148,9 @@ static int ext4_inode_is_fast_symlink(struct inode *inode)
> int ea_blocks = EXT4_I(inode)->i_file_acl ?
> (inode->i_sb->s_blocksize >> 9) : 0;
>
> + if (ext4_has_inline_data(inode))
> + return 0;
> +
> return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0);
> }
>
>
More information about the kernel-team
mailing list