RETURN(ll_ioctl_fsgetxattr(inode, cmd, arg));
case FS_IOC_FSSETXATTR:
RETURN(ll_ioctl_fssetxattr(inode, cmd, arg));
+ case LL_IOC_PCC_STATE: {
+ struct lu_pcc_state __user *ustate =
+ (struct lu_pcc_state __user *)arg;
+ struct lu_pcc_state *state;
+ struct dentry *parent = file_dentry(file);
+ struct dentry *dchild = NULL;
+ struct inode *child_inode = NULL;
+ struct qstr qstr;
+ int namelen = 0;
+ char *name;
+
+ OBD_ALLOC_PTR(state);
+ if (state == NULL)
+ RETURN(-ENOMEM);
+
+ if (copy_from_user(state, ustate, sizeof(*state)))
+ GOTO(out_free, rc = -EFAULT);
+
+ name = state->pccs_path;
+ namelen = strlen(name);
+ if (namelen < 0 || state->pccs_namelen != namelen + 1) {
+ CDEBUG(D_INFO, "IOC_PCC_STATE missing filename\n");
+ GOTO(out_state_free, rc = -EINVAL);
+ }
+
+ /* Get Child from dcache first. */
+ qstr.hash = ll_full_name_hash(parent, name, namelen);
+ qstr.name = name;
+ qstr.len = namelen;
+ dchild = d_lookup(parent, &qstr);
+ if (dchild) {
+ if (dchild->d_inode)
+ child_inode = igrab(dchild->d_inode);
+ dput(dchild);
+ }
+
+ if (!child_inode) {
+ unsigned long ino;
+ struct lu_fid fid;
+
+ rc = ll_get_fid_by_name(parent->d_inode, name, namelen,
+ &fid, NULL);
+ if (rc)
+ GOTO(out_state_free, rc);
+
+ ino = cl_fid_build_ino(&fid, ll_need_32bit_api(sbi));
+ child_inode = ilookup5(inode->i_sb, ino,
+ ll_test_inode_by_fid, &fid);
+ }
+
+ if (!child_inode) {
+ /*
+ * Target inode is not in inode cache, the
+ * corresponding PCC file may be already released,
+ * return immediately.
+ */
+ state->pccs_type = LU_PCC_NONE;
+ GOTO(out_copy_to, rc = 0);
+ }
+
+ if (!S_ISREG(child_inode->i_mode))
+ GOTO(out_child_iput, rc = -EINVAL);
+
+ rc = pcc_ioctl_state(NULL, child_inode, state);
+ if (rc)
+ GOTO(out_child_iput, rc);
+out_copy_to:
+ if (copy_to_user(ustate, state, sizeof(*state)))
+ GOTO(out_child_iput, rc = -EFAULT);
+out_child_iput:
+ iput(child_inode);
+out_state_free:
+ OBD_FREE_PTR(state);
+ RETURN(rc);
+ }
case LL_IOC_PCC_DETACH_BY_FID: {
struct lu_pcc_detach_fid *detach;
struct lu_fid *fid;
$LFS project -sp $project_id $file ||
error "failed to set project for $file"
$LFS project -d $file
+ check_file_data $SINGLEAGT $file "ro_uptodate"
check_lpcc_state $file "readonly"
check_file_data $SINGLEAGT $file "ro_uptodate"
echo -n Update_ro_data > $file2
- check_lpcc_state $file "readonly"
+ check_lpcc_state $file "none"
check_file_data $SINGLEAGT $file "Update_ro_data"
+ check_lpcc_state $file "readonly"
do_facet $SINGLEAGT $LFS pcc detach $file ||
error "failed to detach $file"
do_facet $SINGLEAGT $LCTL pcc list $MOUNT
touch $file || error "touch $file failed"
$TRUNCATE $file $((1048576 * 2)) || error "Truncate $file failed"
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
do_facet $SINGLEAGT $LFS pcc state $file
$TRUNCATE $file $((1048576 / 2)) || error "Truncate $file failed"
do_facet $SINGLEAGT $LFS pcc state $file
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "readonly"
cleanup_pcc_mapping
setup_pcc_mapping $SINGLEAGT \
"fname={*.doc}\&size\<{5M}\&size\>{3M}\ roid=5\ ropcc=1"
do_facet $SINGLEAGT $LCTL pcc list $MOUNT
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$TRUNCATE $file2 $((1048576 * 6)) || error "Truncate $file2 failed"
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$TRUNCATE $file2 $((1048576 * 4)) || error "Truncate $file2 failed"
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "readonly"
cleanup_pcc_mapping
setup_pcc_mapping $SINGLEAGT \
"fname={*.doc}\&size={5M\ 3M}\ roid=5\ ropcc=1"
do_facet $SINGLEAGT $LCTL pcc list $MOUNT
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$TRUNCATE $file $((1048576 * 5)) || error "Truncate $file failed"
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "readonly"
do_facet $SINGLEAGT $LFS pcc detach $file ||
error "failed to detach $file"
$TRUNCATE $file $((1048576 * 4)) || error "Truncate $file failed"
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$TRUNCATE $file $((1048576 * 3)) || error "Truncate $file failed"
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "readonly"
cleanup_pcc_mapping
}
do_facet $SINGLEAGT $LCTL pcc list $MOUNT
do_facet $SINGLEAGT "echo -n QQQQQ > $file" ||
error "failed to write $file"
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$LFS project -p 99 $file || error "failed to set project for $file"
$LFS project -d $file
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$LFS project -p 101 $file || error "failed to set project for $file"
$LFS project -d $file
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "readonly"
cleanup_pcc_mapping
setup_pcc_mapping $SINGLEAGT \
"projid\<{100}\ roid=5\ ropcc=1"
do_facet $SINGLEAGT $LCTL pcc list $MOUNT
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$LFS project -p 102 $file || error "failed to set project for $file"
$LFS project -d $file
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$LFS project -p 99 $file || error "failed to set project for $file"
$LFS project -d $file
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "readonly"
cleanup_pcc_mapping
setup_pcc_mapping $SINGLEAGT \
"projid\<{120}\&projid\>{110}\ roid=5\ ropcc=1"
do_facet $SINGLEAGT $LCTL pcc list $MOUNT
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$LFS project -p 105 $file || error "failed to set project for $file"
$LFS project -d $file
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$LFS project -p 121 $file || error "failed to set project for $file"
$LFS project -d $file
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "none"
$LFS project -p 115 $file || error "failed to set project for $file"
$LFS project -d $file
+ do_facet $SINGLEAGT $MULTIOP $file oc ||
+ error "failed to readonly open $file"
check_lpcc_state $file "readonly"
cleanup_pcc_mapping
}
}
run_test 37 "Multiple readers on a shared file with PCC-RO mode"
+test_38() {
+ local loopfile="$TMP/$tfile"
+ local mntpt="/mnt/pcc.$tdir"
+ local hsm_root="$mntpt/$tdir"
+ local dir=$DIR/$tdir
+ local file=$dir/$tfile
+
+ ! is_project_quota_supported &&
+ skip "project quota is not supported"
+
+ enable_project_quota
+ mkdir $dir || error "mkdir $dir failed"
+ $LFS project -sp 100 $dir ||
+ error "failed to set project for $dir"
+ echo "QQQQQ" > $file
+
+ setup_loopdev $SINGLEAGT $loopfile $mntpt 50
+ do_facet $SINGLEAGT mkdir $hsm_root || error "mkdir $hsm_root failed"
+ setup_pcc_mapping $SINGLEAGT \
+ "projid={100}\ roid=$HSM_ARCHIVE_NUMBER\ ropcc=1"
+
+ do_facet $SINGLEAGT $LFS pcc state $file ||
+ error "failed to get PCC state for $file"
+ check_lpcc_state $file "none"
+ do_facet $SINGLEAGT cat $file || error "cat $file failed"
+ check_lpcc_state $file "readonly"
+ do_facet $SINGLEAGT $LFS pcc detach $file ||
+ error "failed to detach $file"
+ check_lpcc_state $file "none"
+}
+run_test 38 "Verify LFS pcc state does not trigger prefetch for auto PCC-RO"
+
complete $SECONDS
check_and_cleanup_lustre
exit_status