return 0;
}
+/**
+ * The MDT returns st_blocks=1 for the HSM released file (See LU-3864).
+ * The LOV layouer should also return st_blocks=1 for the HSM released file
+ * in the call ->coo_attr_get().
+ * Otherwise, the client may get 0 block count. This caused tools like tar
+ * then to consider the file as fully sparse and to archive it as is without
+ * attempting to access/restore its content.
+ */
+static int lov_attr_get_released(const struct lu_env *env,
+ struct cl_object *obj, struct cl_attr *attr)
+{
+ if (attr->cat_size == 0)
+ attr->cat_blocks = 0;
+ else
+ attr->cat_blocks = 1;
+
+ return 0;
+}
+
static int lov_attr_get_composite(const struct lu_env *env,
struct cl_object *obj,
struct cl_attr *attr)
.llo_page_init = lov_page_init_empty,
.llo_lock_init = lov_lock_init_empty,
.llo_io_init = lov_io_init_released,
- .llo_getattr = lov_attr_get_empty,
+ .llo_getattr = lov_attr_get_released,
.llo_flush = lov_flush_empty,
},
[LLT_COMP] = {
}
run_test 261 "Report 0 bytes size after HSM release"
+test_262() {
+ local file=$DIR/$tdir/$tfile
+ local blocks
+ local fid
+
+ copytool setup
+ mkdir_on_mdt0 $DIR/$tdir || error "mkdir $DIR/$tdir failed"
+
+ dd if=/dev/zero of=$file bs=4k count=2 || error "Write $file failed"
+ fid=$(path2fid $file)
+ $LFS hsm_archive --archive $HSM_ARCHIVE_NUMBER $file
+ wait_request_state $fid ARCHIVE SUCCEED
+
+ $LFS hsm_release $file || error "HSM release $file failed"
+ $LFS hsm_restore $file || error "HSM restore $file failed"
+ $LFS hsm_release $file || error "HSM release $file failed"
+ $LFS hsm_release $file || error "HSM release $file failed"
+ blocks=$(stat -c "%b" $file)
+ [ $blocks -eq "1" ] || error "wrong block number is $blocks, not 1"
+}
+run_test 262 "The client should return 1 block for HSM released files"
+
test_300() {
[ "$CLIENTONLY" ] && skip "CLIENTONLY mode" && return