lkml.org 
[lkml]   [2016]   [Apr]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 13/16] staging: lustre: lov: return minimal FIEMAP for released files
    Date
    From: Bruno Faccini <bruno.faccini@intel.com>

    Since st_blocks = NULL is returned for released files, FIEMAP
    should at least return a minimal mapping to make users aware
    that file contains data but it is not immediately available.
    This will make coreutils and tools such tar happy and have
    them presume file is sparse.

    Also, add a new test_228 in sanity-hsm to verify it works
    for "[cp,tar] --sparse" commands.

    Also fix a LBUG ("lov_fiemap()) ASSERTION( fm_local ) failed")
    likely to occur when no-object/ENOMEM conditions and also now
    when released.

    Signed-off-by: Bruno Faccini <bruno.faccini@intel.com>
    Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-3864
    Reviewed-on: http://review.whamcloud.com/7584
    Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
    Reviewed-by: Aurelien Degremont <aurelien.degremont@cea.fr>
    Signed-off-by: James Simmons <jsimmons@infradead.org>
    ---
    drivers/staging/lustre/lustre/lov/lov_obd.c | 21 +++++++++++++++++++++
    1 files changed, 21 insertions(+), 0 deletions(-)

    diff --git a/drivers/staging/lustre/lustre/lov/lov_obd.c b/drivers/staging/lustre/lustre/lov/lov_obd.c
    index 1a9e3e8..9b72671 100644
    --- a/drivers/staging/lustre/lustre/lov/lov_obd.c
    +++ b/drivers/staging/lustre/lustre/lov/lov_obd.c
    @@ -1733,6 +1733,27 @@ static int lov_fiemap(struct lov_obd *lov, __u32 keylen, void *key,
    unsigned int buffer_size = FIEMAP_BUFFER_SIZE;

    if (!lsm_has_objects(lsm)) {
    + if (lsm && lsm_is_released(lsm) && (fm_key->fiemap.fm_start <
    + fm_key->oa.o_size)) {
    + /*
    + * released file, return a minimal FIEMAP if
    + * request fits in file-size.
    + */
    + fiemap->fm_mapped_extents = 1;
    + fiemap->fm_extents[0].fe_logical =
    + fm_key->fiemap.fm_start;
    + if (fm_key->fiemap.fm_start + fm_key->fiemap.fm_length <
    + fm_key->oa.o_size) {
    + fiemap->fm_extents[0].fe_length =
    + fm_key->fiemap.fm_length;
    + } else {
    + fiemap->fm_extents[0].fe_length =
    + fm_key->oa.o_size - fm_key->fiemap.fm_start;
    + fiemap->fm_extents[0].fe_flags |=
    + (FIEMAP_EXTENT_UNKNOWN |
    + FIEMAP_EXTENT_LAST);
    + }
    + }
    rc = 0;
    goto out;
    }
    --
    1.7.1
    \
     
     \ /
      Last update: 2016-04-12 22:21    [W:3.814 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site