2014-08-21 22:01:27

by Theodore Ts'o

[permalink] [raw]
Subject: Potential bug in fs/ext4/inline.c?

In ext4_find_inline_entry(), there is the following:

if (ext4_get_inline_size(dir) == EXT4_MIN_INLINE_DATA_SIZE)
goto out;

Am I missing something, or shouldn't this be:

if (ext4_get_inline_size(dir) <= EXT4_MIN_INLINE_DATA_SIZE)
goto out;

?

Thanks,

- Ted






2014-08-22 04:02:51

by Darrick J. Wong

[permalink] [raw]
Subject: Re: Potential bug in fs/ext4/inline.c?

On Thu, Aug 21, 2014 at 06:01:26PM -0400, Theodore Ts'o wrote:
> In ext4_find_inline_entry(), there is the following:
>
> if (ext4_get_inline_size(dir) == EXT4_MIN_INLINE_DATA_SIZE)
> goto out;
>
> Am I missing something, or shouldn't this be:
>
> if (ext4_get_inline_size(dir) <= EXT4_MIN_INLINE_DATA_SIZE)
> goto out;
>
> ?

I'm not sure it matters, since I see:

EXT4_I(inode)->i_inline_size = len + EXT4_MIN_INLINE_DATA_SIZE

scattered all over the code. I'm not sure I like the idea that both ext4 and
e2fsprogs think that the inline data size is never <= 60, but afaict it doesn't
cause any problems.

--D

>
> Thanks,
>
> - Ted
>
>
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2014-08-22 07:19:56

by Zheng Liu

[permalink] [raw]
Subject: Re: Potential bug in fs/ext4/inline.c?

On Thu, Aug 21, 2014 at 06:01:26PM -0400, Theodore Ts'o wrote:
> In ext4_find_inline_entry(), there is the following:
>
> if (ext4_get_inline_size(dir) == EXT4_MIN_INLINE_DATA_SIZE)
> goto out;
>
> Am I missing something, or shouldn't this be:
>
> if (ext4_get_inline_size(dir) <= EXT4_MIN_INLINE_DATA_SIZE)
> goto out;

Hi Ted,

The original design idea is that the size of inline data shouldn't be
less than EXT4_MIN_INLINE_DATA_SIZE (60 bytes). That means that the
inline data will occupy the whole i_block[] space.

If we create a new dir with inline data feature, the disk layout will
looks like below (ext4_try_create_inline_dir()):

i_block[0]: parent ino (4 bytes)
i_block+4: dir entry (ino 0, rec_len 56 bytes)

Regards,
- Zheng