mbox series

[f2fs-dev,RFC,0/5] Add inline tail support

Message ID cover.1720515215.git.bo.wu@vivo.com (mailing list archive)
Headers show
Series Add inline tail support | expand

Message

Wu Bo July 10, 2024, 1:33 a.m. UTC
The inode in F2FS occupies an entire 4k block. For many small files, this means
they consume much more space than their actual size. Therefore, there is
significant potential to better utilize the inode block space.

Currently, F2FS has two features to make use of the inode block space: inline
data and inline xattr.

Inline data stores file which size is smaller then 3.5k in inode block. However,
for slightly larger small files, there still have much waste.
For example, a 5k file requires 3 blocks, totaling 12k of space, which is
more than twice the size of the file itself!

Additionally, the end of a file often does not occupy an entire block. If we can
store the end of the file data within the inode block, we can save an entire
block for the file. This is particularly important for small files.

In fact, the current inline data is a special case of inline tail, and
inline tail is an extension of inline data.

To verify the benefits of inline tail, I have developed these preliminary codes.
To make it simple, inline tail only on small files(<64k). And the layout of
an inode block is following:

| inode block     | 4096 |     inline tail enable    |
| --------------- | ---- | --------------------------|
| inode info      | 360  |                           |
| --------------- | ---- | --------------------------|
|                 |      | extra info         | 0~36 |
|                 |      | **compact_addr[16] | 64   |
| addr table[923] | 3692 | reserved           | 4    |
|                 |      | **tail data        |      |
|                 |      | inline_xattr       | 200  |
| --------------- | ---- | --------------------------|
| nid table[5]    | 20   |
| node footer     | 24   |

I tested inline tail by copying the source code of Linux 6.9.7. The storage
space was reduced by approximately 8%. Additionally, due to the reduced IO, the
copy time also reduced by around 10%.

Wu Bo (5):
  f2fs: add inline tail mount option
  f2fs: add inline tail disk layout definition
  f2fs: implement inline tail write & truncate
  f2fs: implement inline tail read & fiemap
  f2fs: set inline tail flag when create inode

 fs/f2fs/data.c   | 61 ++++++++++++++++++++++++++++++++++++++++++++-
 fs/f2fs/f2fs.h   | 44 ++++++++++++++++++++++++++++++++-
 fs/f2fs/file.c   | 10 ++++++++
 fs/f2fs/inline.c | 64 ++++++++++++++++++++++++++++++++----------------
 fs/f2fs/inode.c  |  6 +++++
 fs/f2fs/namei.c  |  3 +++
 fs/f2fs/node.c   |  6 ++++-
 fs/f2fs/super.c  | 15 ++++++++++++
 8 files changed, 185 insertions(+), 24 deletions(-)

Comments

Chao Yu July 12, 2024, 7:12 a.m. UTC | #1
On 2024/7/10 9:33, Wu Bo wrote:
> The inode in F2FS occupies an entire 4k block. For many small files, this means
> they consume much more space than their actual size. Therefore, there is
> significant potential to better utilize the inode block space.
> 
> Currently, F2FS has two features to make use of the inode block space: inline
> data and inline xattr.
> 
> Inline data stores file which size is smaller then 3.5k in inode block. However,
> for slightly larger small files, there still have much waste.
> For example, a 5k file requires 3 blocks, totaling 12k of space, which is
> more than twice the size of the file itself!
> 
> Additionally, the end of a file often does not occupy an entire block. If we can
> store the end of the file data within the inode block, we can save an entire
> block for the file. This is particularly important for small files.
> 
> In fact, the current inline data is a special case of inline tail, and
> inline tail is an extension of inline data.
> 
> To verify the benefits of inline tail, I have developed these preliminary codes.
> To make it simple, inline tail only on small files(<64k). And the layout of
> an inode block is following:
> 
> | inode block     | 4096 |     inline tail enable    |
> | --------------- | ---- | --------------------------|
> | inode info      | 360  |                           |
> | --------------- | ---- | --------------------------|
> |                 |      | extra info         | 0~36 |
> |                 |      | **compact_addr[16] | 64   |
> | addr table[923] | 3692 | reserved           | 4    |
> |                 |      | **tail data        |      |
> |                 |      | inline_xattr       | 200  |
> | --------------- | ---- | --------------------------|
> | nid table[5]    | 20   |
> | node footer     | 24   |
> 
> I tested inline tail by copying the source code of Linux 6.9.7. The storage
> space was reduced by approximately 8%. Additionally, due to the reduced IO, the
> copy time also reduced by around 10%.

Wu Bo,

Thanks for the effort, but can you please change user-space tools as well?
since this patchset changes layout of inode.

Thanks,

> 
> Wu Bo (5):
>    f2fs: add inline tail mount option
>    f2fs: add inline tail disk layout definition
>    f2fs: implement inline tail write & truncate
>    f2fs: implement inline tail read & fiemap
>    f2fs: set inline tail flag when create inode
> 
>   fs/f2fs/data.c   | 61 ++++++++++++++++++++++++++++++++++++++++++++-
>   fs/f2fs/f2fs.h   | 44 ++++++++++++++++++++++++++++++++-
>   fs/f2fs/file.c   | 10 ++++++++
>   fs/f2fs/inline.c | 64 ++++++++++++++++++++++++++++++++----------------
>   fs/f2fs/inode.c  |  6 +++++
>   fs/f2fs/namei.c  |  3 +++
>   fs/f2fs/node.c   |  6 ++++-
>   fs/f2fs/super.c  | 15 ++++++++++++
>   8 files changed, 185 insertions(+), 24 deletions(-)
>