Commit ad1daf47 authored by Bruno Faccini's avatar Bruno Faccini Committed by Greg Kroah-Hartman

staging: lustre: lov: return minimal FIEMAP for released files

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: default avatarBruno Faccini <bruno.faccini@intel.com>
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-3864
Reviewed-on: http://review.whamcloud.com/7584Reviewed-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Reviewed-by: default avatarAurelien Degremont <aurelien.degremont@cea.fr>
Signed-off-by: default avatarJames Simmons <jsimmons@infradead.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b3ffe666
...@@ -1732,6 +1732,27 @@ static int lov_fiemap(struct lov_obd *lov, __u32 keylen, void *key, ...@@ -1732,6 +1732,27 @@ static int lov_fiemap(struct lov_obd *lov, __u32 keylen, void *key,
unsigned int buffer_size = FIEMAP_BUFFER_SIZE; unsigned int buffer_size = FIEMAP_BUFFER_SIZE;
if (!lsm_has_objects(lsm)) { 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; rc = 0;
goto out; goto out;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment