From a9445bc5d84dbf36b3de675b5f62da866d021dde Mon Sep 17 00:00:00 2001 From: Qian Yingjin Date: Thu, 25 Mar 2021 10:44:16 +0800 Subject: [PATCH] LU-10499 pcc: test interoperability with PCC-RO For Lustre 2.15.0 servers, it fails many of subtests that are PCC-RO specific. In this patch, each subtest related to PCC-RO adds an connect flag check and skip it when run against old servers without PCC-RO support. EX-4006 pcc: make "pccro=1" default To avoid a risk that users will accidentally configure PCC-RW and potentially lose data if those client nodes go offline, this patch makes "pccro=1" default for PCC backends. This patch adds a new option "--w|--write" for PCC-RW cache mode when attach a file. Also It makes "--r|--readonly" as a default option for PCC attach command. Was-Change-Id: I56735b0ebe8f0d9ef22b3f7e39e8cccfa3aad443 EX-8739 tests: skip sanity-pcc tests on el9.3 Skip sanity-pcc test_6, test_7a/7b, test_23, test_35 on RHEL9.3 clients due to continuous failures with PCC-RW, which is unused. Skip sanity-pcc test_102 due to el9.3 fio io_uring bug. Was-Change-Id: I76cbd0342788fff8b0167c0656e941f96d73fc48 EX-bug-id: EX-2860 EX-4006 EX-8739 Test-Parameters: clientdistro=el9.3 serverversion=EXA6 serverdistro=el8.8 testlist=sanity-pcc Test-Parameters: clientdistro=el8.9 serverversion=EXA6 serverdistro=el8.8 testlist=sanity-pcc Signed-off-by: Qian Yingjin Change-Id: Ie4fc41b2dc51a038027009fbcc6e86f9d61cd54f Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54386 Tested-by: jenkins Tested-by: Maloo Reviewed-by: James Simmons Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/include/uapi/linux/lustre/lustre_idl.h | 3 +- lustre/llite/file.c | 4 +- lustre/llite/llite_lib.c | 3 +- lustre/llite/pcc.c | 87 ++++---- lustre/llite/pcc.h | 14 +- lustre/tests/sanity-pcc.sh | 281 +++++++++++++++++--------- lustre/utils/lfs.c | 31 ++- 7 files changed, 265 insertions(+), 158 deletions(-) diff --git a/lustre/include/uapi/linux/lustre/lustre_idl.h b/lustre/include/uapi/linux/lustre/lustre_idl.h index 06da9ef..2a26077 100644 --- a/lustre/include/uapi/linux/lustre/lustre_idl.h +++ b/lustre/include/uapi/linux/lustre/lustre_idl.h @@ -935,7 +935,8 @@ struct ptlrpc_body_v2 { OBD_CONNECT2_ENCRYPT_NAME | \ OBD_CONNECT2_ENCRYPT_FID2PATH | \ OBD_CONNECT2_DMV_IMP_INHERIT |\ - OBD_CONNECT2_UNALIGNED_DIO) + OBD_CONNECT2_UNALIGNED_DIO | \ + OBD_CONNECT2_PCCRO) #define OST_CONNECT_SUPPORTED (OBD_CONNECT_SRVLOCK | OBD_CONNECT_GRANT | \ OBD_CONNECT_REQPORTAL | OBD_CONNECT_VERSION | \ diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 6a0ad36..b6800b9 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -6594,7 +6594,9 @@ static int ll_layout_intent(struct inode *inode, struct layout_intent *intent) memset(&it, 0, sizeof(it)); it.it_op = IT_LAYOUT; if (intent->lai_opc == LAYOUT_INTENT_WRITE || - intent->lai_opc == LAYOUT_INTENT_TRUNC) + intent->lai_opc == LAYOUT_INTENT_TRUNC || + intent->lai_opc == LAYOUT_INTENT_PCCRO_SET || + intent->lai_opc == LAYOUT_INTENT_PCCRO_CLEAR) it.it_open_flags = FMODE_WRITE; LDLM_DEBUG_NOLOCK("%s: requeue layout lock for file "DFID"(%p)", diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 5a196d3..b69a201 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -376,7 +376,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt) OBD_CONNECT2_ATOMIC_OPEN_LOCK | OBD_CONNECT2_BATCH_RPC | OBD_CONNECT2_DMV_IMP_INHERIT | - OBD_CONNECT2_UNALIGNED_DIO; + OBD_CONNECT2_UNALIGNED_DIO | + OBD_CONNECT2_PCCRO; #ifdef HAVE_LRU_RESIZE_SUPPORT if (test_bit(LL_SBI_LRU_RESIZE, sbi->ll_flags)) diff --git a/lustre/llite/pcc.c b/lustre/llite/pcc.c index 472325d..e9a4cc3 100644 --- a/lustre/llite/pcc.c +++ b/lustre/llite/pcc.c @@ -458,18 +458,18 @@ pcc_parse_value_pair(struct pcc_cmd *cmd, char *buffer) return rc; if (id == 0) cmd->u.pccc_add.pccc_flags &= ~PCC_DATASET_STAT_ATTACH; - } else if (strcmp(key, "rwpcc") == 0) { + } else if (strcmp(key, "rwpcc") == 0 || strcmp(key, "pccrw") == 0) { rc = kstrtoul(val, 10, &id); if (rc) return rc; if (id > 0) - cmd->u.pccc_add.pccc_flags |= PCC_DATASET_RWPCC; - } else if (strcmp(key, "ropcc") == 0) { + cmd->u.pccc_add.pccc_flags |= PCC_DATASET_PCCRW; + } else if (strcmp(key, "ropcc") == 0 || strcmp(key, "pccro") == 0) { rc = kstrtoul(val, 10, &id); if (rc) return rc; if (id > 0) - cmd->u.pccc_add.pccc_flags |= PCC_DATASET_ROPCC; + cmd->u.pccc_add.pccc_flags |= PCC_DATASET_PCCRO; } else { return -EINVAL; } @@ -504,37 +504,6 @@ pcc_parse_value_pairs(struct pcc_cmd *cmd, char *buffer) return rc; } - switch (cmd->pccc_cmd) { - case PCC_ADD_DATASET: - if (cmd->u.pccc_add.pccc_flags & PCC_DATASET_RWPCC && - cmd->u.pccc_add.pccc_flags & PCC_DATASET_ROPCC) - return -EINVAL; - /* - * By default, a PCC backend can provide caching service for - * both PCC-RW and PCC-RO. - */ - if ((cmd->u.pccc_add.pccc_flags & PCC_DATASET_PCC_ALL) == 0) - cmd->u.pccc_add.pccc_flags |= PCC_DATASET_PCC_ALL; - - if (cmd->u.pccc_add.pccc_rwid == 0 && - cmd->u.pccc_add.pccc_roid == 0) - return -EINVAL; - - if (cmd->u.pccc_add.pccc_rwid == 0 && - cmd->u.pccc_add.pccc_flags & PCC_DATASET_RWPCC) - cmd->u.pccc_add.pccc_rwid = cmd->u.pccc_add.pccc_roid; - - if (cmd->u.pccc_add.pccc_roid == 0 && - cmd->u.pccc_add.pccc_flags & PCC_DATASET_ROPCC) - cmd->u.pccc_add.pccc_roid = cmd->u.pccc_add.pccc_rwid; - - break; - case PCC_DEL_DATASET: - case PCC_CLEAR_ALL: - break; - default: - return -EINVAL; - } return 0; } @@ -682,7 +651,7 @@ pcc_dataset_match_get(struct pcc_super *super, struct pcc_matcher *matcher) down_read(&super->pccs_rw_sem); list_for_each_entry(dataset, &super->pccs_datasets, pccd_linkage) { - if (!(dataset->pccd_flags & PCC_DATASET_RWPCC)) + if (!(dataset->pccd_flags & PCC_DATASET_PCCRW)) continue; if (pcc_cond_match(&dataset->pccd_rule, matcher)) { @@ -701,6 +670,40 @@ pcc_dataset_match_get(struct pcc_super *super, struct pcc_matcher *matcher) return selected; } +static int +pcc_dataset_flags_check(struct pcc_super *super, struct pcc_cmd *cmd) +{ + struct ll_sb_info *sbi; + + sbi = container_of(super, struct ll_sb_info, ll_pcc_super); + + /* + * A PCC backend can provide caching service for both PCC-RW and PCC-RO. + * It defaults to readonly PCC as long as the server supports it. + */ + if (!(exp_connect_flags2(sbi->ll_md_exp) & OBD_CONNECT2_PCCRO)) { + if (cmd->u.pccc_add.pccc_flags & PCC_DATASET_PCCRO || + !(cmd->u.pccc_add.pccc_flags & PCC_DATASET_PCCRW)) + return -EOPNOTSUPP; + } else if ((cmd->u.pccc_add.pccc_flags & PCC_DATASET_PCC_ALL) == 0) { + cmd->u.pccc_add.pccc_flags |= PCC_DATASET_PCC_DEFAULT; + } /* else RWPCC or ROPCC must have been given */ + + if (cmd->u.pccc_add.pccc_rwid == 0 && + cmd->u.pccc_add.pccc_roid == 0) + return -EINVAL; + + if (cmd->u.pccc_add.pccc_rwid == 0 && + cmd->u.pccc_add.pccc_flags & PCC_DATASET_PCCRW) + cmd->u.pccc_add.pccc_rwid = cmd->u.pccc_add.pccc_roid; + + if (cmd->u.pccc_add.pccc_roid == 0 && + cmd->u.pccc_add.pccc_flags & PCC_DATASET_PCCRO) + cmd->u.pccc_add.pccc_roid = cmd->u.pccc_add.pccc_rwid; + + return 0; +} + /** * pcc_dataset_add - Add a Cache policy to control which files need be * cached and where it will be cached. @@ -717,6 +720,10 @@ pcc_dataset_add(struct pcc_super *super, struct pcc_cmd *cmd) bool found = false; int rc; + rc = pcc_dataset_flags_check(super, cmd); + if (rc) + return rc; + OBD_ALLOC_PTR(dataset); if (dataset == NULL) return -ENOMEM; @@ -777,10 +784,10 @@ pcc_dataset_get(struct pcc_super *super, enum lu_pcc_type type, __u32 id) down_read(&super->pccs_rw_sem); list_for_each_entry(dataset, &super->pccs_datasets, pccd_linkage) { if (type == LU_PCC_READWRITE && (dataset->pccd_rwid != id || - !(dataset->pccd_flags & PCC_DATASET_RWPCC))) + !(dataset->pccd_flags & PCC_DATASET_PCCRW))) continue; if (type == LU_PCC_READONLY && (dataset->pccd_roid != id || - !(dataset->pccd_flags & PCC_DATASET_ROPCC))) + !(dataset->pccd_flags & PCC_DATASET_PCCRO))) continue; atomic_inc(&dataset->pccd_refcount); selected = dataset; @@ -1248,11 +1255,11 @@ static int pcc_try_dataset_attach(struct inode *inode, __u32 gen, ENTRY; if (type == LU_PCC_READWRITE && - !(dataset->pccd_flags & PCC_DATASET_RWPCC)) + !(dataset->pccd_flags & PCC_DATASET_PCCRW)) RETURN(0); if (type == LU_PCC_READONLY && - !(dataset->pccd_flags & PCC_DATASET_ROPCC)) + !(dataset->pccd_flags & PCC_DATASET_PCCRO)) RETURN(0); rc = pcc_fid2dataset_path(pathname, PCC_DATASET_MAX_PATH, diff --git a/lustre/llite/pcc.h b/lustre/llite/pcc.h index b1c1f7e..d13b1b0 100644 --- a/lustre/llite/pcc.h +++ b/lustre/llite/pcc.h @@ -103,12 +103,14 @@ enum pcc_dataset_flags { PCC_DATASET_AUTO_ATTACH = PCC_DATASET_OPEN_ATTACH | PCC_DATASET_IO_ATTACH | PCC_DATASET_STAT_ATTACH, - /* PCC backend is only used for RW-PCC */ - PCC_DATASET_RWPCC = 0x10, - /* PCC backend is only used for RO-PCC */ - PCC_DATASET_ROPCC = 0x20, - /* PCC backend provides caching services for both RW-PCC and RO-PCC */ - PCC_DATASET_PCC_ALL = PCC_DATASET_RWPCC | PCC_DATASET_ROPCC, + /* PCC backend is only used for PCC-RW */ + PCC_DATASET_PCCRW = 0x10, + /* PCC backend is only used for PCC-RO */ + PCC_DATASET_PCCRO = 0x20, + /* PCC backend provides caching services for both PCC-RW and PCC-RO */ + PCC_DATASET_PCC_ALL = PCC_DATASET_PCCRW | PCC_DATASET_PCCRO, + /* Default PCC caching mode: PCC-RO mode */ + PCC_DATASET_PCC_DEFAULT = PCC_DATASET_PCCRO, }; struct pcc_dataset { diff --git a/lustre/tests/sanity-pcc.sh b/lustre/tests/sanity-pcc.sh index 40db631..221919b 100755 --- a/lustre/tests/sanity-pcc.sh +++ b/lustre/tests/sanity-pcc.sh @@ -54,6 +54,14 @@ else error "No generic nobody group" fi +if [[ -r /etc/redhat-release ]]; then + rhel_version=$(sed -e 's/[^0-9.]*//g' /etc/redhat-release) + if (( $(version_code $rhel_version) >= $(version_code 9.3.0) )); then + always_except EX-8739 6 7a 7b 23 # PCC-RW + always_except LU-17289 102 # fio io_uring + fi +fi + build_test_filter # if there is no CLIENT1 defined, some tests can be ran on localhost @@ -184,7 +192,8 @@ setup_pcc_mapping() { [ -z "$param" ] && param="projid={100}\ rwid=$HSM_ARCHIVE_NUMBER" stack_trap "cleanup_pcc_mapping $facet" EXIT - do_facet $facet $LCTL pcc add $MOUNT $hsm_root -p $param + do_facet $facet $LCTL pcc add $MOUNT $hsm_root -p $param || + error "Setup PCC backend $hsm_root on $MOUNT failed" } umount_loopdev() { @@ -238,14 +247,14 @@ lpcc_rw_test() { is_project_quota_supported || project=false do_facet $SINGLEAGT $LFS mkdir -i0 -c1 $DIR/$tdir - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" $project && lfs project -sp $project_id $DIR2/$tdir do_facet $SINGLEAGT "echo -n attach_origin > $file" if ! $project; then check_lpcc_state $file "none" - do_facet $SINGLEAGT $LFS pcc attach -i \ - $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w \ + -i $HSM_ARCHIVE_NUMBER $file || error "pcc attach $file failed" fi @@ -295,8 +304,8 @@ lpcc_rw_test() { do_facet $SINGLEAGT "echo -n new_data2 > $file" if ! $project; then check_lpcc_state $file "none" - do_facet $SINGLEAGT $LFS pcc attach -i \ - $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w \ + -i $HSM_ARCHIVE_NUMBER $file || error "PCC attach $file failed" fi check_lpcc_state $file "readwrite" @@ -341,14 +350,14 @@ test_1e() { copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1" $LCTL pcc list $MOUNT mkdir_on_mdt0 $DIR/$tdir || error "mkdir $DIR/$tdir failed" chmod 777 $DIR/$tdir || error "chmod 777 $DIR/$tdir failed" do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 || error "failed to dd write to $file" - do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT $RUNAS $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" do_facet $SINGLEAGT $RUNAS dd if=$file of=/dev/null bs=1024 count=1 || @@ -378,7 +387,7 @@ test_1e() { [[ $perm == "0" ]] || error "PCC file permission ($perm) is not zero" - do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT $RUNAS $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" @@ -404,7 +413,7 @@ test_1f() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0\ pccrw=1" do_facet $SINGLEAGT $LFS mkdir -i0 -c1 $DIR/$tdir chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed" @@ -449,7 +458,7 @@ test_1g() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" dd if=/dev/zero of=$file bs=1024 count=1 || error "failed to dd write to $file" @@ -458,7 +467,7 @@ test_1g() { error "non-root user can dd write $file" do_facet $SINGLEAGT $RUNAS dd if=$file of=/dev/null bs=1024 count=1 && error "non-root user can dd read $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 && @@ -499,7 +508,7 @@ test_2a() { enable_project_quota setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" file=$DIR/$tdir/multiop $LFS mkdir -i -1 -c $MDSCOUNT $DIR/$tdir rm -f $file @@ -556,13 +565,13 @@ test_2b() { enable_project_quota setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" file=$DIR/$tdir/multiop mkdir -p $DIR/$tdir rm -f $file do_facet $SINGLEAGT "echo -n file_data > $file" - do_facet $SINGLEAGT lfs pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT lfs pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "PCC attach $file failed" check_lpcc_state $file "readwrite" @@ -595,12 +604,12 @@ test_2c() { enable_project_quota setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" mkdir -p $DIR/$tdir rm -f $file do_facet $SINGLEAGT "echo -n file_data > $file" - do_facet $SINGLEAGT lfs pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT lfs pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "PCC attach $file failed" check_lpcc_state $file "readwrite" @@ -625,16 +634,19 @@ test_3a() { local file=$DIR/$tdir/$tfile local file2=$DIR2/$tdir/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1\ pccro=1" mkdir -p $DIR/$tdir || error "mkdir $DIR/$tdir failed" dd if=/dev/zero of=$file2 bs=1024 count=1 || error "failed to dd write to $file" echo "Start to RW-PCC attach/detach the file: $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" do_facet $SINGLEAGT $LFS pcc detach -k $file || @@ -642,7 +654,7 @@ test_3a() { check_lpcc_state $file "none" echo "Repeat to RW-PCC attach/detach the same file: $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" do_facet $SINGLEAGT $LFS pcc detach -k $file || @@ -650,7 +662,7 @@ test_3a() { check_lpcc_state $file "none" rm -f $file || error "failed to remove $file" - echo "ropcc_data" > $file + echo "pccro_data" > $file echo "Start to RO-PCC attach/detach the file: $file" do_facet $SINGLEAGT $LFS pcc attach -r -i $HSM_ARCHIVE_NUMBER $file || @@ -679,7 +691,7 @@ test_3b() { # Start all of the copytools and setup PCC for n in $(seq $AGTCOUNT); do copytool setup -f agt$n -a $n -m $MOUNT -h $(hsm_root agt$n) - setup_pcc_mapping agt$n "projid={100}\ rwid=$n\ auto_attach=0" + setup_pcc_mapping agt$n "projid={100}\ rwid=$n\ auto_attach=0\ pccrw=1\ pccro=1" done mkdir -p $DIR/$tdir || error "mkdir $DIR/$tdir failed" @@ -687,7 +699,7 @@ test_3b() { error "failed to dd write to $file" echo "Start to RW-PCC attach/detach $file on $agt1_HOST" - do_facet agt1 $LFS pcc attach -i 1 $file || + do_facet agt1 $LFS pcc attach -w -i 1 $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" agt1 do_facet agt1 $LFS pcc detach -k $file || @@ -695,7 +707,7 @@ test_3b() { check_lpcc_state $file "none" agt1 echo "Repeat to RW-PCC attach/detach $file on $agt2_HOST" - do_facet agt2 $LFS pcc attach -i 2 $file || + do_facet agt2 $LFS pcc attach -w -i 2 $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" agt2 do_facet agt2 $LFS pcc detach -k $file || @@ -703,10 +715,10 @@ test_3b() { check_lpcc_state $file "none" agt2 echo "Try RW-PCC attach on two agents" - do_facet agt1 $LFS pcc attach -i 1 $file || + do_facet agt1 $LFS pcc attach -w -i 1 $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" agt1 - do_facet agt2 $LFS pcc attach -i 2 $file || + do_facet agt2 $LFS pcc attach -w -i 2 $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" agt2 # The later attach PCC agent should succeed, @@ -762,7 +774,7 @@ test_4() { enable_project_quota setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" mkdir -p $DIR/$tdir || error "mkdir $DIR/$tdir failed" lfs project -sp $project_id $DIR/$tdir || @@ -800,12 +812,12 @@ test_5() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" do_facet $SINGLEAGT "echo -n attach_mmap_data > $file" || error "echo $file failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" @@ -833,10 +845,10 @@ test_6() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" echo -n mmap_write_data > $file || error "echo write $file failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" @@ -869,10 +881,10 @@ test_7a() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" echo "QQQQQ" > $file - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" check_file_data $SINGLEAGT $file "QQQQQ" @@ -901,10 +913,10 @@ test_7b() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1" echo "QQQQQ" > $file - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" check_file_data $SINGLEAGT $file "QQQQQ" @@ -936,10 +948,10 @@ test_8() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" echo "QQQQQ" > $file - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach file $file" check_lpcc_state $file "readwrite" check_file_data $SINGLEAGT $file "QQQQQ" @@ -963,11 +975,11 @@ test_9() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMVER" -h "$hsm_root" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" do_facet $SINGLEAGT $LCTL pcc list $MOUNT touch $file || error "touch $file failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "fail to attach $file" check_lpcc_state $file "readwrite" # write 60M data, it is larger than the capacity of PCC backend @@ -982,13 +994,18 @@ test_usrgrp_quota() { local loopfile="$TMP/$tfile" local mntpt="/mnt/pcc.$tdir" local hsm_root="$mntpt/$tdir" - local state="readwrite" + local state="readonly" + local mode="pccro" local ug=$1 - local ro=$2 + local rw=$2 local id=$RUNAS_ID [[ $ug == "g" ]] && id=$RUNAS_GID - [[ -z $ro ]] || state="readonly" + [[ -z $rw ]] || { + state="readwrite" + mode="pccrw" + } + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 do_facet $SINGLEAGT quotacheck -c$ug $mntpt || error "quotacheck -c$ug $mntpt failed" @@ -999,7 +1016,7 @@ test_usrgrp_quota() { do_facet $SINGLEAGT repquota -${ug}vs $mntpt copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMVER" -h "$hsm_root" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ $mode=1" do_facet $SINGLEAGT $LCTL pcc list $MOUNT mkdir $DIR/$tdir || error "mkdir $DIR/$tdir failed" @@ -1015,14 +1032,14 @@ test_usrgrp_quota() { error "chown $RUNAS_ID:$RUNAS_GID $file1 failed" chown $RUNAS_ID:$RUNAS_GID $file2 || error "chown $RUNAS_ID:$RUNAS_GID $file2 failed" - do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $ro \ + do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $rw \ $file1 || error "attach $file1 failed" - do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $ro \ + do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $rw \ $file2 && error "attach $file2 should fail due to quota limit" check_lpcc_state $file1 $state check_lpcc_state $file2 "none" - if [[ -n $ro ]]; then + if [[ -z $rw ]]; then do_facet $SINGLEAGT $LFS pcc detach $file1 || error "detach $file1 failed" return 0 @@ -1036,22 +1053,28 @@ test_usrgrp_quota() { } test_10a() { - test_usrgrp_quota "u" + test_usrgrp_quota "u" "-w" } run_test 10a "Test RW-PCC with user quota on loop PCC device" test_10b() { - test_usrgrp_quota "g" + test_usrgrp_quota "g" "-w" } run_test 10b "Test RW-PCC with group quota on loop PCC device" test_10c() { - test_usrgrp_quota "u" "-r" + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + + test_usrgrp_quota "u" } run_test 10c "Test RO-PCC with user quota on loop PCC device" test_10d() { - test_usrgrp_quota "g" "-r" + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + + test_usrgrp_quota "g" } run_test 10d "Test RO-PCC with group quota on loop PCC device" @@ -1065,7 +1088,7 @@ test_11() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" do_facet $SINGLEAGT "echo -n QQQQQ > $file" lpcc_path=$(lpcc_fid2path $hsm_root $file) @@ -1073,7 +1096,7 @@ test_11() { echo "Lustre file: $file LPCC dir: $lpcc_dir" do_facet $SINGLEAGT mkdir -p $lpcc_dir || error "mkdir -p $lpcc_dir failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach $file" check_lpcc_state $file "readwrite" check_file_data $SINGLEAGT $file "QQQQQ" @@ -1090,7 +1113,7 @@ test_11() { error "mkdir -p $lpcc_dir failed" do_facet $SINGLEAGT chattr +i $lpcc_dir || error "chattr +i $lpcc_dir failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file && + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file && error "attach $file with immutable directory should be failed" do_facet $SINGLEAGT chattr -i $lpcc_dir || error "chattr -i $lpcc_dir failed" @@ -1101,7 +1124,7 @@ test_11() { lpcc_path=$(lpcc_fid2path $hsm_root $file) do_facet $SINGLEAGT mkdir -p $lpcc_path || error "mkdir -p $lpcc_path failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file && + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file && error "attach $file should fail as PCC path is a directory" rm $file || error "rm $file failed" } @@ -1115,11 +1138,11 @@ test_12() { copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1" echo -n race_rw_attach_hsmremove > $file lpcc_path=$(lpcc_fid2path $hsm_root $file) - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "attach $file failed" do_facet $SINGLEAGT $LFS pcc detach -k $file || error "detach $file failed" @@ -1127,7 +1150,7 @@ test_12() { check_hsm_flags $file "0x0000000d" # define OBD_FAIL_LLITE_PCC_ATTACH_PAUSE 0x1414 do_facet $SINGLEAGT $LCTL set_param fail_loc=0x1414 fail_val=20 - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file & + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file & pid=$! $LFS hsm_state $file sleep 3 @@ -1148,7 +1171,7 @@ test_rule_id() { local file=$DIR/$tdir/$tfile setup_pcc_mapping $SINGLEAGT \ - "$rule\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "$rule\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1" $LCTL pcc list $MOUNT do_facet $SINGLEAGT $LFS mkdir -i 0 $DIR/$tdir @@ -1188,7 +1211,7 @@ test_13b() { copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "fname={*.h5\ suffix.*\ Mid*dle}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "fname={*.h5\ suffix.*\ Mid*dle}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1" $LCTL pcc list $MOUNT do_facet $SINGLEAGT mkdir -p $DIR/$tdir @@ -1243,7 +1266,7 @@ test_13c() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100\ 200}\&fname={*.h5},uid={$RUNAS_ID}\&gid={$RUNAS_GID}\ rwid=$HSM_ARCHIVE_NUMBER" + "projid={100\ 200}\&fname={*.h5},uid={$RUNAS_ID}\&gid={$RUNAS_GID}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" $LCTL pcc list $MOUNT do_facet $SINGLEAGT mkdir -p $DIR/$tdir chmod 777 $DIR/$tdir || error "chmod 0777 $DIR/$tdir failed" @@ -1297,13 +1320,16 @@ run_test 13c "Check auto RW-PCC create caching for UID/GID/ProjID/fname rule" test_14() { local file=$DIR/$tdir/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1\ pccro=1" mkdir -p $DIR/$tdir || error "mkdir -p $DIR/$tdir failed" do_facet $SINGLEAGT "echo -n autodetach_data > $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "PCC attach $file failed" check_lpcc_state $file "readwrite" @@ -1335,9 +1361,12 @@ test_15() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tdir/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1\ pccro=1" mkdir_on_mdt0 $DIR/$tdir || error "mkdir $DIR/$tdir failed" chmod 777 $DIR/$tdir || error "chmod 777 $DIR/$tdir failed" @@ -1345,7 +1374,7 @@ test_15() { echo "Verify open attach for non-root user" do_facet $SINGLEAGT $RUNAS dd if=/dev/zero of=$file bs=1024 count=1 || error "failed to dd write to $file" - do_facet $SINGLEAGT $RUNAS $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT $RUNAS $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "failed to attach file $file" do_facet $SINGLEAGT $RUNAS $LFS pcc state $file check_lpcc_state $file "readwrite" $SINGLEAGT "$RUNAS" @@ -1366,7 +1395,7 @@ test_15() { echo "Verify auto attach at open for RW-PCC" do_facet $SINGLEAGT "echo -n autoattach_data > $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "RW-PCC attach $file failed" check_lpcc_state $file "readwrite" @@ -1426,14 +1455,17 @@ test_16() { local file=$DIR/$tfile local -a lpcc_path + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1\ pccro=1" echo "Test detach for RW-PCC" do_facet $SINGLEAGT "echo -n detach_data > $file" lpcc_path=$(lpcc_fid2path $hsm_root $file) - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "RW-PCC attach $file failed" check_lpcc_state $file "readwrite" # HSM released exists archived status @@ -1487,12 +1519,12 @@ test_17() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=0\ stat_attach=0\ pccrw=1" do_facet $SINGLEAGT $LCTL pcc list $MOUNT do_facet $SINGLEAGT "echo -n layout_refresh_data > $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "PCC attach $file failed" check_lpcc_state $file "readwrite" @@ -1538,12 +1570,12 @@ test_18() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" do_facet $SINGLEAGT $LCTL pcc list $MOUNT do_facet $SINGLEAGT dd if=/dev/urandom of=$file bs=1M count=4 || error "failed to write $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach $file" do_facet $SINGLEAGT $LFS pcc state $file check_lpcc_state $file "readwrite" @@ -1560,7 +1592,7 @@ test_18() { do_facet $SINGLEAGT $LFS pcc state $file check_file_size $SINGLEAGT $lpcc_path 4194304 - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "failed to attach $file" check_lpcc_sizes $SINGLEAGT $lpcc_path $file 1049600 newmd5=$(do_facet $SINGLEAGT md5sum $file | awk '{print $1}') @@ -1580,17 +1612,17 @@ test_19() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1" do_facet $SINGLEAGT "echo -n QQQQQ > $file" || error "echo $file failed" lpcc_path=$(lpcc_fid2path $hsm_root $file) - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "Failed to attach $file" check_lpcc_state $file "readwrite" check_lpcc_sizes $SINGLEAGT $file $lpcc_path 5 do_facet $SINGLEAGT $LFS pcc detach --keep $file || error "Failed to detach $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "Failed to attach $file" check_lpcc_sizes $SINGLEAGT $file $lpcc_path 5 do_facet $SINGLEAGT $LFS pcc detach --keep $file || @@ -1608,11 +1640,11 @@ test_20() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" do_facet $SINGLEAGT "echo -n QQQQQ > $file" || error "echo $file failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "Failed to attach $file" do_facet $SINGLEAGT "echo 3 > /proc/sys/vm/drop_caches" check_lpcc_state $file "readwrite" @@ -1630,6 +1662,9 @@ test_21a() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ @@ -1668,8 +1703,12 @@ test_21b() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 - copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" + do_facet $SINGLEAGT mkdir -p $hsm_root || + error "failed to mkdir $hsm_root" setup_pcc_mapping $SINGLEAGT \ "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" @@ -1710,6 +1749,9 @@ test_21c() { local file2=$DIR2/$tfile local fid + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ @@ -1745,6 +1787,9 @@ test_21d() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping @@ -1771,6 +1816,9 @@ test_21e() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping @@ -1797,6 +1845,9 @@ test_21f() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping @@ -1829,6 +1880,9 @@ test_21g() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ @@ -1855,6 +1909,9 @@ test_21h() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ @@ -1897,13 +1954,16 @@ test_21i() { local file2=$DIR2/$tfile local fid + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccro=1\ pccrw=1" do_facet $SINGLEAGT "echo -n hsm_release_pcc_file > $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "RW-PCC attach $file failed" check_lpcc_state $file "readwrite" # HSM released exists archived status @@ -1945,14 +2005,17 @@ test_22() { local file2=$DIR2/$tfile local fid + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1\ pccro=1" do_facet $SINGLEAGT "echo -n roattach_data > $file" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "RW-PCC attach $file failed" check_lpcc_state $file "readwrite" # HSM released exists archived status @@ -2013,21 +2076,24 @@ test_23() { local file=$DIR/$tfile local -a lpcc_path + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping - echo "ropcc_data" > $file + echo "pccro_data" > $file lpcc_path=$(lpcc_fid2path $hsm_root $file) do_facet $SINGLEAGT $LFS pcc attach -r -i $HSM_ARCHIVE_NUMBER $file || error "failed to RO-PCC attach file $file" check_lpcc_state $file "readonly" - check_lpcc_data $SINGLEAGT $lpcc_path $file "ropcc_data" + check_lpcc_data $SINGLEAGT $lpcc_path $file "pccro_data" local content=$(do_facet $SINGLEAGT $MMAP_CAT $file) - [[ $content == "ropcc_data" ]] || + [[ $content == "pccro_data" ]] || error "mmap_cat data mismatch: $content" check_lpcc_state $file "readonly" @@ -2079,6 +2145,9 @@ test_24a() { local file=$DIR/$tdir/$tfile local -a lpcc_path + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping $SINGLEAGT \ @@ -2130,6 +2199,9 @@ test_24b() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tdir/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping @@ -2172,6 +2244,9 @@ test_25() { local file=$DIR/$tdir/$tfile local content + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" setup_pcc_mapping @@ -2225,10 +2300,13 @@ test_26() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" -h "$hsm_root" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1\ pccro=1" echo -n attach_keep_open > $file do_facet $SINGLEAGT $LFS pcc attach -r -i $HSM_ARCHIVE_NUMBER $file || @@ -2276,7 +2354,7 @@ test_26() { do_facet $SINGLEAGT $LFS pcc detach $file || error "detach $file failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "attach $file failed" check_lpcc_state $file "readwrite" rmultiop_start $agt_host $file O_c || error "multiop $file failed" @@ -2295,7 +2373,7 @@ test_26() { rm $file || error "rm $file failed" echo -n attach_keep_open > $file - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "attach $file failed" check_lpcc_state $file "readwrite" rmultiop_start $agt_host $file O_c || error "multiop $file failed" @@ -2321,13 +2399,16 @@ test_27() { local hsm_root="$mntpt/$tdir" local file=$DIR/$tfile + $LCTL get_param -n mdc.*.connect_flags | grep -q pcc_ro || + skip "Server does not support PCC-RO" + setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" -h "$hsm_root" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=1" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ open_attach=1\ pccrw=1\ pccro=1" echo -n auto_attach_multi_open > $file - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "attach $file failed" check_lpcc_state $file "readwrite" rmultiop_start $agt_host $file O_c || error "multiop $file failed" @@ -2344,7 +2425,7 @@ test_27() { rm $file || error "rm $file failed" echo -n auto_attach_multi_open > $file - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "attach $file failed" check_lpcc_state $file "readwrite" rmultiop_start $agt_host $file O_c || error "multiop $file failed" @@ -2401,14 +2482,14 @@ test_28() { setup_loopdev $SINGLEAGT $loopfile $mntpt 50 copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" -h "$hsm_root" setup_pcc_mapping $SINGLEAGT \ - "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0" + "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ auto_attach=0\ pccrw=1" echo -n rw_attach_hasopen_fail > $file rmultiop_start $agt_host $file O_c || error "multiop $file failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file && + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file && error "attach $file should fail" rmultiop_stop $agt_host || error "multiop $file close failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || error "attach $file should fail" check_lpcc_state $file "readwrite" do_facet $SINGLEAGT $LFS pcc detach -k $file || @@ -2417,12 +2498,12 @@ test_28() { multiop_bg_pause $file2 O_c || error "multiop $file2 failed" multipid=$! - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file && + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file && error "attach $file should fail" kill -USR1 $multipid wait $multipid || error "multiop $file2 close failed" - do_facet $SINGLEAGT $LFS pcc attach -i $HSM_ARCHIVE_NUMBER $file || - error "attach $file should fail" + do_facet $SINGLEAGT $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER $file || + error "failed to attach $file" check_lpcc_state $file "readwrite" do_facet $SINGLEAGT $LFS pcc detach -k $file || error "detach $file failed" @@ -2485,7 +2566,7 @@ test_101a() { # Finish PCC setup copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER" - setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER" + setup_pcc_mapping $SINGLEAGT "projid={100}\ rwid=$HSM_ARCHIVE_NUMBER\ pccrw=1" mkdir_on_mdt0 $DIR/$tdir || error "mkdir $DIR/$tdir failed" chmod 777 $DIR/$tdir || error "chmod 777 $DIR/$tdir failed" @@ -2493,7 +2574,7 @@ test_101a() { echo "Verify open attach from inside mount namespace" do_facet $SINGLEAGT nsenter -t $PID -U -m dd if=/dev/zero of=$file bs=1024 count=1 || error "failed to dd write to $file" - do_facet $SINGLEAGT nsenter -t $PID -U -m $LFS pcc attach \ + do_facet $SINGLEAGT nsenter -t $PID -U -m $LFS pcc attach -w \ -i $HSM_ARCHIVE_NUMBER $file || error "cannot attach $file" do_facet $SINGLEAGT nsenter -t $PID -U -m $LFS pcc state $file @@ -2524,7 +2605,7 @@ test_101a() { chmod a+rw $DIR/$tdir/$tfile.shell stack_trap 'rm -f $DIR/$tdir/$tfile.shell' EXIT do_facet $SINGLEAGT nsenter -t $PID -U -m "bash $DIR/$tdir/$tfile.shell" - do_facet $SINGLEAGT nsenter -t $PID -U -m $LFS pcc attach -i $HSM_ARCHIVE_NUMBER \ + do_facet $SINGLEAGT nsenter -t $PID -U -m $LFS pcc attach -w -i $HSM_ARCHIVE_NUMBER \ $file || error "RW-PCC attach $file failed" check_lpcc_state $file "readwrite" diff --git a/lustre/utils/lfs.c b/lustre/utils/lfs.c index 4b188b6..9e62991 100644 --- a/lustre/utils/lfs.c +++ b/lustre/utils/lfs.c @@ -296,13 +296,17 @@ command_t mirror_cmdlist[] = { command_t pcc_cmdlist[] = { { .pc_name = "attach", .pc_func = lfs_pcc_attach, .pc_help = "Attach given files to the Persistent Client Cache.\n" - "usage: lfs pcc attach <--id|-i NUM> ...\n" - "\t-i: archive id for RW-PCC\n" }, + "usage: lfs pcc attach [--id|-i ID] [--readonly|-r] [--write|-w] ...\n" + "\t-i: archive id for PCC\n" + "\t-r: readonly attach\n" + "\t-w: writeable attach\n" }, { .pc_name = "attach_fid", .pc_func = lfs_pcc_attach_fid, .pc_help = "Attach given files into PCC by FID(s).\n" - "usage: lfs pcc attach_id {--id|-i NUM} {--mnt|-m MOUNTPOINT} FID ...\n" - "\t-i: archive id for RW-PCC\n" - "\t-m: Lustre mount point\n" }, + "usage: lfs pcc attach_id [--id|-i ID] {--mnt|-m MOUNTPOINT} [--readonly|-r] [--write|-w] FID ...\n" + "\t-i: archive id for PCC\n" + "\t-m: Lustre mount point\n" + "\t-r: readonly attach\n" + "\t-w: writeable attach\n" }, { .pc_name = "state", .pc_func = lfs_pcc_state, .pc_help = "Display the PCC state for given files.\n" "usage: lfs pcc state ...\n" }, @@ -13552,6 +13556,7 @@ static int lfs_pcc_attach(int argc, char **argv) { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'i', .name = "id", .has_arg = required_argument }, { .val = 'r', .name = "readonly", .has_arg = no_argument }, + { .val = 'w', .name = "write", .has_arg = no_argument }, { .name = NULL } }; int c; int rc = 0; @@ -13559,10 +13564,10 @@ static int lfs_pcc_attach(int argc, char **argv) const char *path; char *end; char fullpath[PATH_MAX]; - enum lu_pcc_type type = LU_PCC_READWRITE; + enum lu_pcc_type type = LU_PCC_READONLY; optind = 0; - while ((c = getopt_long(argc, argv, "hi:r", + while ((c = getopt_long(argc, argv, "hi:rw", long_opts, NULL)) != -1) { switch (c) { case 'i': @@ -13579,6 +13584,9 @@ static int lfs_pcc_attach(int argc, char **argv) case 'r': type = LU_PCC_READONLY; break; + case 'w': + type = LU_PCC_READWRITE; + break; case '?': return CMD_HELP; default: @@ -13631,18 +13639,20 @@ static int lfs_pcc_attach_fid(int argc, char **argv) { .val = 'h', .name = "help", .has_arg = no_argument }, { .val = 'i', .name = "id", .has_arg = required_argument }, { .val = 'r', .name = "readonly", .has_arg = no_argument }, + { .val = 'w', .name = "write", .has_arg = no_argument }, { .val = 'm', .name = "mnt", .has_arg = required_argument }, { .name = NULL } }; + char short_opts[] = "i:m:rw"; int c; int rc = 0; __u32 attach_id = 0; char *end; const char *mntpath = NULL; const char *fidstr; - enum lu_pcc_type type = LU_PCC_READWRITE; + enum lu_pcc_type type = LU_PCC_READONLY; optind = 0; - while ((c = getopt_long(argc, argv, "hi:m:r", + while ((c = getopt_long(argc, argv, short_opts, long_opts, NULL)) != -1) { switch (c) { case 'i': @@ -13659,6 +13669,9 @@ static int lfs_pcc_attach_fid(int argc, char **argv) case 'r': type = LU_PCC_READONLY; break; + case 'w': + type = LU_PCC_READWRITE; + break; case 'm': mntpath = optarg; break; -- 1.8.3.1