X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Flov%2Flov_obd.c;h=8aed98224d083544caa2f73ce95aa05317546151;hb=ab19dad1d77ca25856815aadf2cf10d3cf20d4a3;hp=20b14e57092c9de5080b0dc13d305028a54220bf;hpb=ef2d36d905720ef8f632299f9806a9bfaa372b86;p=fs%2Flustre-release.git diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index 20b14e5..8aed982 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -2276,8 +2276,29 @@ static int lov_fiemap(struct lov_obd *lov, __u32 keylen, void *key, int cur_stripe = 0, cur_stripe_wrap = 0, stripe_count; unsigned int buffer_size = FIEMAP_BUFFER_SIZE; - if (!lsm_has_objects(lsm)) - GOTO(out, rc = 0); + 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); + } + GOTO(out, rc = 0); + } if (fiemap_count_to_size(fm_key->fiemap.fm_extent_count) < buffer_size) buffer_size = fiemap_count_to_size(fm_key->fiemap.fm_extent_count); @@ -2475,7 +2496,8 @@ skip_last_device_calc: fiemap->fm_mapped_extents = current_extent; out: - OBD_FREE_LARGE(fm_local, buffer_size); + if (fm_local) + OBD_FREE_LARGE(fm_local, buffer_size); return rc; }