lkml.org 
[lkml]   [2018]   [Mar]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 45/63] ext4: inplace xattr block update fails to deduplicate blocks
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Tahsin Erdogan <tahsin@google.com>

    commit ec00022030da5761518476096626338bd67df57a upstream.

    When an xattr block has a single reference, block is updated inplace
    and it is reinserted to the cache. Later, a cache lookup is performed
    to see whether an existing block has the same contents. This cache
    lookup will most of the time return the just inserted entry so
    deduplication is not achieved.

    Running the following test script will produce two xattr blocks which
    can be observed in "File ACL: " line of debugfs output:

    mke2fs -b 1024 -I 128 -F -O extent /dev/sdb 1G
    mount /dev/sdb /mnt/sdb

    touch /mnt/sdb/{x,y}

    setfattr -n user.1 -v aaa /mnt/sdb/x
    setfattr -n user.2 -v bbb /mnt/sdb/x

    setfattr -n user.1 -v aaa /mnt/sdb/y
    setfattr -n user.2 -v bbb /mnt/sdb/y

    debugfs -R 'stat x' /dev/sdb | cat
    debugfs -R 'stat y' /dev/sdb | cat

    This patch defers the reinsertion to the cache so that we can locate
    other blocks with the same contents.

    Signed-off-by: Tahsin Erdogan <tahsin@google.com>
    Signed-off-by: Theodore Ts'o <tytso@mit.edu>
    Reviewed-by: Andreas Dilger <adilger@dilger.ca>
    Signed-off-by: Tommi Rantala <tommi.t.rantala@nokia.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/ext4/xattr.c | 3 +--
    1 file changed, 1 insertion(+), 2 deletions(-)

    --- a/fs/ext4/xattr.c
    +++ b/fs/ext4/xattr.c
    @@ -828,8 +828,6 @@ ext4_xattr_block_set(handle_t *handle, s
    if (!IS_LAST_ENTRY(s->first))
    ext4_xattr_rehash(header(s->base),
    s->here);
    - ext4_xattr_cache_insert(ext4_mb_cache,
    - bs->bh);
    }
    unlock_buffer(bs->bh);
    if (error == -EFSCORRUPTED)
    @@ -918,6 +916,7 @@ inserted:
    } else if (bs->bh && s->base == bs->bh->b_data) {
    /* We were modifying this block in-place. */
    ea_bdebug(bs->bh, "keeping this block");
    + ext4_xattr_cache_insert(ext4_mb_cache, bs->bh);
    new_bh = bs->bh;
    get_bh(new_bh);
    } else {

    \
     
     \ /
      Last update: 2018-03-16 18:22    [W:3.468 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site