Whamcloud - gitweb
LU-10499 pcc: test interoperability with PCC-RO 86/54386/14
authorQian Yingjin <qian@ddn.com>
Thu, 25 Mar 2021 02:44:16 +0000 (10:44 +0800)
committerOleg Drokin <green@whamcloud.com>
Wed, 5 Jun 2024 04:47:30 +0000 (04:47 +0000)
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 <qian@ddn.com>
Change-Id: Ie4fc41b2dc51a038027009fbcc6e86f9d61cd54f
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/54386
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/uapi/linux/lustre/lustre_idl.h
lustre/llite/file.c
lustre/llite/llite_lib.c
lustre/llite/pcc.c
lustre/llite/pcc.h
lustre/tests/sanity-pcc.sh
lustre/utils/lfs.c

index 06da9ef..2a26077 100644 (file)
@@ -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 | \
index 6a0ad36..b6800b9 100644 (file)
@@ -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)",
index 5a196d3..b69a201 100644 (file)
@@ -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))
index 472325d..e9a4cc3 100644 (file)
@@ -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,
index b1c1f7e..d13b1b0 100644 (file)
@@ -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 {
index 40db631..221919b 100755 (executable)
@@ -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"
 
index 4b188b6..9e62991 100644 (file)
@@ -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> <file> ...\n"
-               "\t-i: archive id for RW-PCC\n" },
+               "usage: lfs pcc attach [--id|-i ID] [--readonly|-r] [--write|-w] <file> ...\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 <file> ...\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;