lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 023/879] fs/ntfs3: Fix fiemap + fix shrink file size (to remove preallocated space)
    Date
    From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>

    commit 3880f2b816a7e4ca889b7e8a42e6c62c5706ed36 upstream.

    Two problems:
    1. ntfs3_setattr can't truncate preallocated space;
    2. if allocated fragment "cross" valid size, then fragment splits into two parts:
    - normal part;
    - unwritten part (here we must return FIEMAP_EXTENT_LAST).
    Before this commit we returned FIEMAP_EXTENT_LAST for whole fragment.
    Fixes xfstest generic/092
    Fixes: 4342306f0f0d ("fs/ntfs3: Add file operations and implementation")

    Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    fs/ntfs3/file.c | 2 +-
    fs/ntfs3/frecord.c | 10 +++++++---
    2 files changed, 8 insertions(+), 4 deletions(-)

    --- a/fs/ntfs3/file.c
    +++ b/fs/ntfs3/file.c
    @@ -762,7 +762,7 @@ int ntfs3_setattr(struct user_namespace
    }
    inode_dio_wait(inode);

    - if (attr->ia_size < oldsize)
    + if (attr->ia_size <= oldsize)
    err = ntfs_truncate(inode, attr->ia_size);
    else if (attr->ia_size > oldsize)
    err = ntfs_extend(inode, attr->ia_size, 0, NULL);
    --- a/fs/ntfs3/frecord.c
    +++ b/fs/ntfs3/frecord.c
    @@ -1964,10 +1964,8 @@ int ni_fiemap(struct ntfs_inode *ni, str

    vcn += clen;

    - if (vbo + bytes >= end) {
    + if (vbo + bytes >= end)
    bytes = end - vbo;
    - flags |= FIEMAP_EXTENT_LAST;
    - }

    if (vbo + bytes <= valid) {
    ;
    @@ -1977,6 +1975,9 @@ int ni_fiemap(struct ntfs_inode *ni, str
    /* vbo < valid && valid < vbo + bytes */
    u64 dlen = valid - vbo;

    + if (vbo + dlen >= end)
    + flags |= FIEMAP_EXTENT_LAST;
    +
    err = fiemap_fill_next_extent(fieinfo, vbo, lbo, dlen,
    flags);
    if (err < 0)
    @@ -1995,6 +1996,9 @@ int ni_fiemap(struct ntfs_inode *ni, str
    flags |= FIEMAP_EXTENT_UNWRITTEN;
    }

    + if (vbo + bytes >= end)
    + flags |= FIEMAP_EXTENT_LAST;
    +
    err = fiemap_fill_next_extent(fieinfo, vbo, lbo, bytes, flags);
    if (err < 0)
    break;

    \
     
     \ /
      Last update: 2022-06-07 23:59    [W:5.085 / U:0.424 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site