From f7f6067595de2ab9eb8818483c7fc4c79244b0b7 Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Thu, 17 Feb 2022 14:56:36 -0600 Subject: [PATCH] EX-4015 lipe: add lma, filter_fid, and hsm json attributes Add "lma", "filter_fid", and "hsm" json attributes. Use struct lustre_mdt_attrs rather than broken out fields in loa. Add sanity-lipe-scan3 tests 111, 112, 113 to "verify". Combine init_lipe_scan3_env and init_lipe_scan3_env_file. Test-Parameters: trivial testlist=sanity-lipe-scan3 facet=mds1 Signed-off-by: John L. Hammond Change-Id: I1856a896d192d08f9e16b9ac764030907256f79c Reviewed-on: https://review.whamcloud.com/46547 Tested-by: jenkins Tested-by: Maloo --- lipe/src/lipe_scan3/ls3_main.c | 15 ++++- lipe/src/lipe_scan3/ls3_object_attrs.c | 100 ++++++++++++++++++++++++++-- lipe/src/lipe_scan3/ls3_object_attrs.h | 15 ++++- lipe/src/lipe_scan3/ls3_scan.c | 16 ++--- lustre/tests/sanity-lipe-scan3.sh | 115 ++++++++++++++++++++++++--------- 5 files changed, 212 insertions(+), 49 deletions(-) diff --git a/lipe/src/lipe_scan3/ls3_main.c b/lipe/src/lipe_scan3/ls3_main.c index e5fa5b3..27f7762 100644 --- a/lipe/src/lipe_scan3/ls3_main.c +++ b/lipe/src/lipe_scan3/ls3_main.c @@ -107,6 +107,8 @@ static struct attr_bit_name attr_bit_names[] = { X(LS3_OBJECT_ATTR_BASE, "ctime"), X(LS3_OBJECT_ATTR_SELF_FID, "self_fid"), X(LS3_OBJECT_ATTR_FILE_FID, "file_fid"), + X(LS3_OBJECT_ATTR_SELF_FID, "lma"), + X(LS3_OBJECT_ATTR_FILTER_FID, "filter_fid"), X(LS3_OBJECT_ATTR_LINKS, "links"), X(LS3_OBJECT_ATTR_HSM, "hsm"), X(LS3_OBJECT_ATTR_LOV, "lov"), @@ -528,7 +530,7 @@ SCM_DEFINE(ls3_scm_self_fid_ref, "self-fid", 0, 0, 0, { struct ls3_object_attrs *loa = ls3_attrs(LS3_OBJECT_ATTR_SELF_FID); - return ls3_scm_from_fid(&loa->loa_self_fid); + return ls3_scm_from_fid(loa_self_fid(loa)); } SCM_DEFINE(ls3_scm_links_list, "links", 0, 0, 0, @@ -782,7 +784,7 @@ SCM_DEFINE(ls3_scm_print_self_fid, LS3_PRINT_SELF_FID, 0, 0, 0, (), "print self FID of current file or OST object") { struct ls3_object_attrs *loa = ls3_attrs(LS3_OBJECT_ATTR_SELF_FID); - const struct lu_fid *fid = &loa->loa_self_fid; + const struct lu_fid *fid = loa_self_fid(loa); LS3_PRINT_DELIM(DFID, PFID(fid)); @@ -796,6 +798,13 @@ SCM_DEFINE(ls3_scm_print_json, LS3_PRINT_JSON, 0, 1, 0, unsigned long c_bits; struct json_object *obj; const char *str; + int json_c_to_string_flags = JSON_C_TO_STRING_PLAIN; + +#ifdef JSON_C_TO_STRING_NOSLASHESCAPE + /* This means "Don't slash escape forward slashes." But it's + * not available until json-c-0.13 */ + json_c_to_string_flags |= JSON_C_TO_STRING_NOSLASHESCAPE; +#endif if (SCM_UNBNDP(bits)) c_bits = print_json_attrs; @@ -803,7 +812,7 @@ SCM_DEFINE(ls3_scm_print_json, LS3_PRINT_JSON, 0, 1, 0, SCM_VALIDATE_ULONG_COPY(1, bits, c_bits); obj = ls3_object_attrs_to_json(lc->lc_instance, lc->lc_object, lc->lc_attrs, c_bits); - str = json_object_to_json_string_ext(obj, JSON_C_TO_STRING_PLAIN); + str = json_object_to_json_string_ext(obj, json_c_to_string_flags); LS3_PRINT_DELIM("%s", str); diff --git a/lipe/src/lipe_scan3/ls3_object_attrs.c b/lipe/src/lipe_scan3/ls3_object_attrs.c index 76dc162..ee8779b 100644 --- a/lipe/src/lipe_scan3/ls3_object_attrs.c +++ b/lipe/src/lipe_scan3/ls3_object_attrs.c @@ -145,6 +145,92 @@ static struct json_object *lipe_xattr_list_to_json(const struct lipe_list_head * return arr; } +static struct json_object *lipe_filter_fid_to_json(const struct filter_fid *ff, size_t size) +{ + struct json_object *obj = json_object_new_object(); + struct json_object *layout; + + json_object_object_add(obj, "parent", fid_to_json(&ff->ff_parent)); + + if (size < sizeof(*ff)) + return obj; + + layout = json_object_new_object(); + + json_object_object_add(layout, "stripe_size", json_object_new_int64(ff->ff_layout.ol_stripe_size)); + json_object_object_add(layout, "stripe_count", json_object_new_int64(ff->ff_layout.ol_stripe_count)); + json_object_object_add(layout, "comp_start", json_object_new_int64(ff->ff_layout.ol_comp_start)); + json_object_object_add(layout, "comp_end", json_object_new_int64(ff->ff_layout.ol_comp_end)); + json_object_object_add(layout, "comp_id", json_object_new_int64(ff->ff_layout.ol_comp_id)); + + json_object_object_add(obj, "layout", layout); + json_object_object_add(obj, "layout_version", json_object_new_int64(ff->ff_layout_version)); + json_object_object_add(obj, "range", json_object_new_int64(ff->ff_range)); + + return obj; +} + +static struct json_object *lipe_lma_to_json(const struct lustre_mdt_attrs *lma) +{ + struct json_object *obj = json_object_new_object(); + struct json_object *compat = json_object_new_array(); + struct json_object *incompat = json_object_new_array(); + +#define X(f, n) \ + if (lma->lma_compat & (f)) \ + json_object_array_add(compat, json_object_new_string(n)) + X(LMAC_NOT_IN_OI, "not_in_oi"); + X(LMAC_FID_ON_OST, "fid_on_ost"); + X(LMAC_STRIPE_INFO, "stripe_info"); + X(LMAC_COMP_INFO, "comp_info"); + X(LMAC_IDX_BACKUP, "idx_backup"); +#undef X + +#define X(f, n) \ + if (lma->lma_compat & (f)) \ + json_object_array_add(incompat, json_object_new_string(n)) + X(LMAI_AGENT, "agent"); + X(LMAI_REMOTE_PARENT, "remote_parent"); + X(LMAI_STRIPED, "striped_directory"); + X(LMAI_ORPHAN, "orphan"); + X(LMAI_ENCRYPT, "encrypt"); +#undef X + + json_object_object_add(obj, "self_fid", fid_to_json(&lma->lma_self_fid)); + json_object_object_add(obj, "compat", compat); + json_object_object_add(obj, "_compat", json_object_new_int64(lma->lma_compat)); + json_object_object_add(obj, "incompat", incompat); + json_object_object_add(obj, "_incompat", json_object_new_int64(lma->lma_incompat)); + + return obj; +} + +static struct json_object *lipe_hsm_to_json(const struct hsm_user_state *hus) +{ + struct json_object *obj = json_object_new_object(); + struct json_object *states = json_object_new_array(); + +#define X(f, n) \ + if (hus->hus_states & (f)) \ + json_object_array_add(states, json_object_new_string(n)) + X(HS_EXISTS, "exists"); + X(HS_DIRTY, "dirty"); + X(HS_RELEASED, "released"); + X(HS_ARCHIVED, "archived"); + X(HS_NORELEASE, "norelease"); + X(HS_NOARCHIVE, "noarchive"); + X(HS_LOST, "lost"); /* Such a great show. */ + X(HS_PCCRW, "pccrw"); + X(HS_PCCRO, "pccro"); +#undef X + + json_object_object_add(obj, "states", states); + json_object_object_add(obj, "_states", json_object_new_int64(hus->hus_states)); + json_object_object_add(obj, "archive_id", json_object_new_int64(hus->hus_archive_id)); + + return obj; +} + static struct json_object *lipe_som_attrs_to_json(const struct lustre_som_attrs *lsa) { struct json_object *obj; @@ -216,10 +302,13 @@ LS3_JSON_ENCODE_I(blocks); LS3_JSON_ENCODE_I(projid); LS3_JSON_ENCODE_I(flags); -/* TODO HSM, LOV, LMV FILTER_FID */ +/* TODO LOV, LMV */ LS3_JSON_ENCODE_J(file_fid, fid_to_json(&loa->loa_file_fid)); -LS3_JSON_ENCODE_J(self_fid, fid_to_json(&loa->loa_self_fid)); +LS3_JSON_ENCODE_J(self_fid, fid_to_json(loa_self_fid(loa))); +LS3_JSON_ENCODE_J(filter_fid, lipe_filter_fid_to_json(&loa->loa_filter_fid, loa->loa_filter_fid_size)); +LS3_JSON_ENCODE_J(lma, lipe_lma_to_json(&loa->loa_lma)); +LS3_JSON_ENCODE_J(hsm, lipe_hsm_to_json(&loa->loa_hsm_state)); LS3_JSON_ENCODE_J(links, lipe_link_entry_list_to_json(&loa->loa_links)); LS3_JSON_ENCODE_J(paths, lipe_path_entry_list_to_json(&loa->loa_paths)); LS3_JSON_ENCODE_J(som, lipe_som_attrs_to_json(&loa->loa_som)); @@ -242,7 +331,10 @@ static const struct ls3_json_attr_desc ls3_json_attr_descs[] = { [LS3_JSON_BIT_SIZE] = { "size", &ls3_json_encode_size, LS3_OBJECT_ATTR_SIZE }, [LS3_JSON_BIT_BLOCKS] = { "blocks", &ls3_json_encode_blocks, LS3_OBJECT_ATTR_SIZE }, [LS3_JSON_BIT_FILE_FID] = { "file_fid", &ls3_json_encode_file_fid, LS3_OBJECT_ATTR_FILE_FID }, - [LS3_JSON_BIT_SELF_FID] = { "self_fid",&ls3_json_encode_self_fid, LS3_OBJECT_ATTR_SELF_FID }, + [LS3_JSON_BIT_SELF_FID] = { "self_fid", &ls3_json_encode_self_fid, LS3_OBJECT_ATTR_SELF_FID }, + [LS3_JSON_BIT_FILTER_FID] = { "filter_fid", &ls3_json_encode_filter_fid, LS3_OBJECT_ATTR_FILTER_FID }, + [LS3_JSON_BIT_LMA] = { "lma", &ls3_json_encode_lma, LS3_OBJECT_ATTR_SELF_FID }, + [LS3_JSON_BIT_HSM] = { "hsm", &ls3_json_encode_hsm, LS3_OBJECT_ATTR_HSM }, /* [LS3_JSON_BIT_LOV] = { "lov", &ls3_json_encode_lov, LS3_OBJECT_ATTR_LOV }, */ /* [LS3_JSON_BIT_LMV] = { "lmv", &ls3_json_encode_lmv, LS3_OBJECT_ATTR_LMV }, */ [LS3_JSON_BIT_LINKS] = { "links", &ls3_json_encode_links, LS3_OBJECT_ATTR_LINKS }, @@ -401,7 +493,7 @@ void lipe_object_attrs_reset(struct ls3_object_attrs *loa) loa->loa_attr_bits = 0; loa->loa_ino = 0; memset(&loa->loa_file_fid, 0, sizeof(loa->loa_file_fid)); - memset(&loa->loa_self_fid, 0, sizeof(loa->loa_self_fid)); + memset(&loa->loa_lma, 0, sizeof(loa->loa_lma)); lipe_object_attrs_links_fini(loa); lipe_object_attrs_paths_fini(loa); lipe_object_attrs_xattrs_fini(loa); diff --git a/lipe/src/lipe_scan3/ls3_object_attrs.h b/lipe/src/lipe_scan3/ls3_object_attrs.h index 76a0feb..7b81ff0 100644 --- a/lipe/src/lipe_scan3/ls3_object_attrs.h +++ b/lipe/src/lipe_scan3/ls3_object_attrs.h @@ -68,6 +68,9 @@ enum { LS3_JSON_BIT_BLOCKS, LS3_JSON_BIT_FILE_FID, LS3_JSON_BIT_SELF_FID, + LS3_JSON_BIT_FILTER_FID, + LS3_JSON_BIT_LMA, + LS3_JSON_BIT_HSM, LS3_JSON_BIT_LOV, LS3_JSON_BIT_LMV, LS3_JSON_BIT_POOLS, @@ -94,6 +97,9 @@ enum ls3_json_attr { LS3_JSON_ATTR_BLOCKS = 1U << LS3_JSON_BIT_BLOCKS, LS3_JSON_ATTR_FILE_FID = 1U << LS3_JSON_BIT_FILE_FID, LS3_JSON_ATTR_SELF_FID = 1U << LS3_JSON_BIT_SELF_FID, + LS3_JSON_ATTR_FILTER_FID = 1U << LS3_JSON_BIT_FILTER_FID, + LS3_JSON_ATTR_LMA = 1U << LS3_JSON_BIT_LMA, + LS3_JSON_ATTR_HSM = 1U << LS3_JSON_BIT_HSM, LS3_JSON_ATTR_LOV = 1U << LS3_JSON_BIT_LOV, LS3_JSON_ATTR_LMV = 1U << LS3_JSON_BIT_LMV, LS3_JSON_ATTR_POOLS = 1U << LS3_JSON_BIT_POOLS, @@ -160,9 +166,7 @@ struct ls3_object_attrs { gid_t loa_gid; int64_t loa_projid; struct lu_fid loa_file_fid; - struct lu_fid loa_self_fid; - uint32_t loa_lma_compat; - uint32_t loa_lma_incompat; + struct lustre_mdt_attrs loa_lma; void *loa_link_buf; size_t loa_link_buf_size; void *loa_lmv_buf; @@ -199,6 +203,11 @@ struct ls3_object_attrs { struct lipe_list_head loa_xattrs; }; +static inline const struct lu_fid *loa_self_fid(const struct ls3_object_attrs *loa) +{ + return &loa->loa_lma.lma_self_fid; +} + void ls3_list_json_attrs(void); int ls3_json_attrs_parse(const char *str, enum ls3_json_attr *attrs); diff --git a/lipe/src/lipe_scan3/ls3_scan.c b/lipe/src/lipe_scan3/ls3_scan.c index 808fabc1..520d858 100644 --- a/lipe/src/lipe_scan3/ls3_scan.c +++ b/lipe/src/lipe_scan3/ls3_scan.c @@ -123,7 +123,7 @@ ldiskfs_read_attr_self_fid(struct ls3_instance *li, struct lipe_object *lo, struct ls3_object_attrs *loa) { - struct lustre_mdt_attrs *lma; + const struct lustre_mdt_attrs *lma; char buf[XATTR_SIZE_MAX]; int size; int rc; @@ -135,10 +135,10 @@ ldiskfs_read_attr_self_fid(struct ls3_instance *li, if (rc < 0) return rc; - lma = (struct lustre_mdt_attrs *)buf; - fid_le_to_cpu(&loa->loa_self_fid, &lma->lma_self_fid); - loa->loa_lma_compat = ext2fs_le32_to_cpu(lma->lma_compat); - loa->loa_lma_incompat = ext2fs_le32_to_cpu(lma->lma_incompat); + lma = (const struct lustre_mdt_attrs *)buf; + fid_le_to_cpu(&loa->loa_lma.lma_self_fid, &lma->lma_self_fid); + loa->loa_lma.lma_compat = ext2fs_le32_to_cpu(lma->lma_compat); + loa->loa_lma.lma_incompat = ext2fs_le32_to_cpu(lma->lma_incompat); loa->loa_attr_bits |= LS3_OBJECT_ATTR_SELF_FID; @@ -186,7 +186,7 @@ ldiskfs_read_attr_file_fid(struct ls3_instance *li, if (rc < 0) return rc; - loa->loa_file_fid = loa->loa_self_fid; + loa->loa_file_fid = *loa_self_fid(loa); } else if (li->li_device_is_ost) { rc = ldiskfs_read_attr_filter_fid(li, lo, loa); if (rc < 0) @@ -227,7 +227,7 @@ ldiskfs_read_attr_links(struct ls3_instance *li, if (rc < 0) return rc; - if (loa->loa_lma_incompat & LMAI_ORPHAN) { + if (loa->loa_lma.lma_incompat & LMAI_ORPHAN) { /* Then no links and loa_links is empty so good. */ goto out_ok; } @@ -734,7 +734,7 @@ static int ldiskfs_scan_groups(ext2_inode_scan scan, * crashes when we try to access objects by or using * fid2path. */ if ((li->li_required_attrs & LS3_OBJECT_ATTR_SELF_FID) && - !fid_is_norm(&loa->loa_self_fid) && !fid_is_idif(&loa->loa_self_fid)) + !fid_is_norm(loa_self_fid(loa)) && !fid_is_idif(loa_self_fid(loa))) continue; if (lo_is_dir_stripe(li, lo, loa)) diff --git a/lustre/tests/sanity-lipe-scan3.sh b/lustre/tests/sanity-lipe-scan3.sh index 5d5bada..0011dcb 100644 --- a/lustre/tests/sanity-lipe-scan3.sh +++ b/lustre/tests/sanity-lipe-scan3.sh @@ -91,22 +91,20 @@ function lipe_scan3_format() { function init_lipe_scan3_env() { # Check "$MOUNT" is a Lustre client mount point. local fid=$($LFS path2fid "$MOUNT") + local file + local index + [[ "$fid" == "$ROOT_FID" ]] || error "'$MOUNT' is not a lustre client mount" find "$MOUNT" -mindepth 1 -delete || error "cannot clean '$MOUNT'" find "$MOUNT" -mindepth 1 | grep . && error "find -delete did not delete all files from '$MOUNT'" - sync -} - -function init_lipe_scan3_env_file() { - local file="$1" - local index - - init_lipe_scan3_env + for file in "$@"; do + mcreate $file || error "cannot create $file" + index=$($LFS getstripe --mdt-index $file) + ((index == 0)) || error "file '$file' is not on MDT0000" + done - mcreate $file || error "cannot create $file" - index=$($LFS getstripe --mdt-index $file) - ((index == 0)) || error "file '$file' is not on MDT0000" + sync sync } @@ -229,7 +227,7 @@ test_12() { local tmp=$(mktemp -d) local fid - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" fid=$($LFS path2fid "$file") touch $tmp/$tfile @@ -313,7 +311,7 @@ test_100() { local file=$MOUNT/$tfile local proc - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" lipe_scan3 "$device" --print-self-fid lipe_scan3_format "$device" '(self-fid)' @@ -338,7 +336,7 @@ test_101() { local file=$MOUNT/$tfile local mode - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" mode=0$(stat --format=%a $file) # octal access rights expect_attr "$device" mode $((S_IFREG | mode)) # $((...)) converts to decimal @@ -372,7 +370,7 @@ test_102() { local file=$MOUNT/$tfile local id - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" id=$(stat --format=%u $file) # uid expect_attr "$device" uid "$id" @@ -419,7 +417,7 @@ test_103() { local file=$MOUNT/$tfile local time - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" time=$(stat --format=%X $file) # atime expect_attr "$device" atime "$time" @@ -467,7 +465,7 @@ test_104() { local file=$MOUNT/$tfile local size - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" expect_attr "$device" size 0 @@ -485,7 +483,7 @@ test_105() { local device="$(facet_device $facet)" local file=$MOUNT/$tfile - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" expect_attr "$device" nlink 1 ln $file $file-2 @@ -504,7 +502,7 @@ test_106() { local file=$MOUNT/$tfile local id - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" id=$($LFS project "$file" | awk '{ print $1 }') expect_attr "$device" projid "$id" @@ -522,7 +520,7 @@ test_107() { local file=$MOUNT/$tfile local fid - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" fid=$($LFS path2fid $file) expect_attr "$device" file-fid "$fid" expect_attr "$device" self-fid "$fid" @@ -535,7 +533,7 @@ test_108() { local file=$MOUNT/$tfile local fd - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" # (links) returns a list of parent-fid, name pairs # (([0x200000007:0x1:0x0] . "f0") ...) @@ -562,7 +560,7 @@ test_109() { local device="$(facet_device $facet)" local file=$MOUNT/$tfile - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" expect_expr "$device" '(absolute-paths)' "($file)" expect_expr "$device" '(relative-paths)' "($tfile)" @@ -620,13 +618,69 @@ test_110() { } run_test 110 "lipe_scan3 som attr works" +test_111() { + local facet=mds1 + local device="$(facet_device $facet)" + local file=$MOUNT/$tfile + local fid + local fid2 + + init_lipe_scan3_env "$file" + fid=$($LFS path2fid "$file") + + # { + # "lma": { + # "self_fid": "[0x200000bd9:0x8c:0x0]", + # "compat": [], + # "_compat": 0, + # "incompat": [], + # "_incompat": 0 + # } + # } + + fid2=$(lipe_scan3 "$device" --print-json=lma | jq --raw-output .lma.self_fid) + [[ "$fid" == "$fid2" ]] || error "lma.self_fid expected '$fid', got '$fid2'" +} +run_test 111 "lipe_scan3 lma attr does the right thing" + +test_112() { + local facet=mds1 + local device="$(facet_device $facet)" + local file=$MOUNT/$tfile + local hsm + + init_lipe_scan3_env "$file" + + # FIXME Make a better test. + + hsm=$(lipe_scan3 "$device" --print-json=hsm) + [[ "$hsm" == "{}" ]] || error "hsm expected '{}', got '$hsm'" +} +run_test 112 "lipe_scan3 hsm attr does the right thing" + +test_113() { + local facet=mds1 + local device="$(facet_device $facet)" + local file=$MOUNT/$tfile + local a2 + + init_lipe_scan3_env "$file" + + # FIXME Make a better test. We scan the mds1 for + # filter_fid. This just checks that ls3 understands the + # filter_fid attr. + + a2=$(lipe_scan3 "$device" --print-json=filter_fid) + [[ "$a2" == "{}" ]] || error "filter_fid expected '', got '$a2'" +} +run_test 113 "lipe_scan3 filter_fid does the right thing" + test_120() { local facet=mds1 local device="$(facet_device $facet)" local file=$MOUNT/$tfile - local fd - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" echo XXX > "$file" expect_expr "$device" '(car (assoc "trusted.lov" (xattrs)))' trusted.lov @@ -646,9 +700,8 @@ test_130() { local file=$MOUNT/$tfile local -a ost_indexes - init_lipe_scan3_env + init_lipe_scan3_env "$file" $LFS setstripe -c -1 "$file" - echo XXX > "$file" ost_indexes=($($LFS getstripe --yaml "$file" | yq '.lmm_objects[] | .l_ost_idx')) expect_expr "$device" '(lov-pools)' '()' @@ -662,7 +715,7 @@ test_200() { local file=$MOUNT/$tfile local proc - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" lipe_scan3_format "$device" '(lipe-scan-device-name)' expect_attr "$device" lipe-scan-fsname "$FSNAME" @@ -690,7 +743,7 @@ test_201() { local file=$MOUNT/$tfile local rc - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" lipe_scan3_body "$device" '(lipe-scan-break 7)' rc=$? @@ -707,7 +760,7 @@ test_300() { local fid local out - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" fid=$($LFS path2fid "$file") lipe_scan3 "$device" --print-file-fid @@ -753,7 +806,7 @@ test_302() { local file=$MOUNT/$tfile local out - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" out=$(lipe_scan3 "$device" --print-absolute-path) [[ "$out" == "$file" ]] || error "--print-absolute-path should print absolute path" @@ -794,7 +847,7 @@ test_304() { local out local expect - init_lipe_scan3_env_file "$file" + init_lipe_scan3_env "$file" ln "$file" "$file-1" ln "$file" "$file-2" -- 1.8.3.1