ll_lookup_it(IT_OPEN) always alloc FID on MDT0 for pcc open, but
the open request is sent to MDT where the name hash points to,
which may be different from the MDT where the FID is, which will
trigger osp_md_create() assertion because file is created remotely.
This FID allocation is not necessary, and it can be left to be done
in lmv_intent_open() by LMV layer, because the MDT is chosen in
LMV. Then when it's done, the FID allocated can be used to initialize
PCC inode.
Change assertion in osp_md_create() to error message and return
error.
Update sanity-sec 2a for this.
Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: I3ccea3f9e7cca5083695c71135b9a5805f833b14
Reviewed-on: https://review.whamcloud.com/39568
Reviewed-by: Yingjin Qian <qian@ddn.com>
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
}
if (pca && pca->pca_dataset) {
}
if (pca && pca->pca_dataset) {
- struct pcc_dataset *dataset = pca->pca_dataset;
-
OBD_ALLOC_PTR(lum);
if (lum == NULL)
GOTO(out, retval = ERR_PTR(-ENOMEM));
OBD_ALLOC_PTR(lum);
if (lum == NULL)
GOTO(out, retval = ERR_PTR(-ENOMEM));
lum->lmm_pattern = LOV_PATTERN_F_RELEASED | LOV_PATTERN_RAID0;
op_data->op_data = lum;
op_data->op_data_size = sizeof(*lum);
lum->lmm_pattern = LOV_PATTERN_F_RELEASED | LOV_PATTERN_RAID0;
op_data->op_data = lum;
op_data->op_data_size = sizeof(*lum);
- op_data->op_archive_id = dataset->pccd_rwid;
-
- rc = obd_fid_alloc(NULL, ll_i2mdexp(parent), &op_data->op_fid2,
- op_data);
- if (rc)
- GOTO(out, retval = ERR_PTR(rc));
-
- rc = pcc_inode_create(parent->i_sb, dataset, &op_data->op_fid2,
- &pca->pca_dentry);
- if (rc)
- GOTO(out, retval = ERR_PTR(rc));
-
+ op_data->op_archive_id = pca->pca_dataset->pccd_rwid;
it->it_flags |= MDS_OPEN_PCC;
}
it->it_flags |= MDS_OPEN_PCC;
}
if (rc < 0)
GOTO(out, retval = ERR_PTR(rc));
if (rc < 0)
GOTO(out, retval = ERR_PTR(rc));
+ if (pca && pca->pca_dataset) {
+ rc = pcc_inode_create(parent->i_sb, pca->pca_dataset,
+ &op_data->op_fid2,
+ &pca->pca_dentry);
+ if (rc)
+ GOTO(out, retval = ERR_PTR(rc));
+ }
+
/* dir layout may change */
ll_unlock_md_op_lsm(op_data);
rc = ll_lookup_it_finish(req, it, parent, &dentry,
/* dir layout may change */
ll_unlock_md_op_lsm(op_data);
rc = ll_lookup_it_finish(req, it, parent, &dentry,
op_data->op_mds = tgt->ltd_index;
} else {
LASSERT(fid_is_sane(&op_data->op_fid1));
op_data->op_mds = tgt->ltd_index;
} else {
LASSERT(fid_is_sane(&op_data->op_fid1));
- LASSERT(it->it_flags & MDS_OPEN_PCC ||
- fid_is_zero(&op_data->op_fid2));
+ LASSERT(fid_is_zero(&op_data->op_fid2));
LASSERT(op_data->op_name != NULL);
tgt = lmv_locate_tgt(lmv, op_data);
LASSERT(op_data->op_name != NULL);
tgt = lmv_locate_tgt(lmv, op_data);
/* If it is ready to open the file by FID, do not need
* allocate FID at all, otherwise it will confuse MDT */
/* If it is ready to open the file by FID, do not need
* allocate FID at all, otherwise it will confuse MDT */
- if ((it->it_op & IT_CREAT) && !(it->it_flags & MDS_OPEN_BY_FID ||
- it->it_flags & MDS_OPEN_PCC)) {
+ if ((it->it_op & IT_CREAT) && !(it->it_flags & MDS_OPEN_BY_FID)) {
/*
* For lookup(IT_CREATE) cases allocate new fid and setup FLD
* for it.
/*
* For lookup(IT_CREATE) cases allocate new fid and setup FLD
* for it.
update = thandle_to_osp_update_request(th);
LASSERT(update != NULL);
update = thandle_to_osp_update_request(th);
LASSERT(update != NULL);
- LASSERT(attr->la_valid & LA_TYPE);
+ if (!(attr->la_valid & LA_TYPE)) {
+ CERROR("%s: create type not specified: valid %llx\n",
+ dt->do_lu.lo_dev->ld_obd->obd_name, attr->la_valid);
+ GOTO(out, rc = -EINVAL);
+ }
+
rc = OSP_UPDATE_RPC_PACK(env, out_create_pack, update,
lu_object_fid(&dt->do_lu), attr, hint, dof);
if (rc != 0)
rc = OSP_UPDATE_RPC_PACK(env, out_create_pack, update,
lu_object_fid(&dt->do_lu), attr, hint, dof);
if (rc != 0)
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
file=$DIR/$tdir/multiop
copytool setup -m "$MOUNT" -a "$HSM_ARCHIVE_NUMBER"
setup_pcc_mapping
file=$DIR/$tdir/multiop
+ $LFS mkdir -i -1 -c $MDSCOUNT $DIR/$tdir
rm -f $file
do_facet $SINGLEAGT $LFS project -sp $project_id $DIR/$tdir ||
rm -f $file
do_facet $SINGLEAGT $LFS project -sp $project_id $DIR/$tdir ||