spin_lock(&mdt->mdt_client_bitmap_lock);
cl_idx = find_first_zero_bit(bitmap, LR_MAX_CLIENTS);
if (cl_idx >= LR_MAX_CLIENTS ||
- MDT_FAIL_CHECK_ONCE(OBD_FAIL_MDS_CLIENT_ADD)) {
+ OBD_FAIL_CHECK(OBD_FAIL_MDS_CLIENT_ADD)) {
CERROR("no room for %u clients - fix LR_MAX_CLIENTS\n",
cl_idx);
spin_unlock(&mdt->mdt_client_bitmap_lock);
int rc = 0;
ENTRY;
- OBD_FAIL_RETURN(OBD_FAIL_MDS_FS_SETUP, -ENOENT);
+ if (OBD_FAIL_CHECK(OBD_FAIL_MDS_FS_SETUP))
+ RETURN(-ENOENT);
/* prepare transactions callbacks */
mdt->mdt_txn_cb.dtc_txn_start = mdt_txn_start_cb;
mds_steal_ack_locks(req);
}
-static void mdt_reconstruct_generic(struct mdt_thread_info *mti,
- struct mdt_lock_handle *lhc)
+void mdt_reconstruct_generic(struct mdt_thread_info *mti,
+ struct mdt_lock_handle *lhc)
{
struct ptlrpc_request *req = mdt_info_req(mti);
struct mdt_export_data *med = &req->rq_export->exp_mdt_data;
child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2);
LASSERT(!IS_ERR(child));
- body = req_capsule_server_get(&mti->mti_pill, &RMF_MDT_BODY);
+ body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
rc = mo_attr_get(mti->mti_env, mdt_object_child(child), &mti->mti_attr);
if (rc == -EREMOTE) {
/* object was created on remote server */
if (req->rq_status)
return;
- body = req_capsule_server_get(&mti->mti_pill, &RMF_MDT_BODY);
+ body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1);
LASSERT(!IS_ERR(obj));
mo_attr_get(mti->mti_env, mdt_object_child(obj), &mti->mti_attr);
- mdt_pack_attr2body(mti, body, &mti->mti_attr.ma_attr, mdt_object_fid(obj));
+ mdt_pack_attr2body(mti, body, &mti->mti_attr.ma_attr,
+ mdt_object_fid(obj));
+ if (mti->mti_epoch && (mti->mti_epoch->flags & MF_EPOCH_OPEN)) {
+ struct mdt_file_data *mfd;
+ struct mdt_body *repbody;
+
+ repbody = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
+ repbody->ioepoch = obj->mot_ioepoch;
+ spin_lock(&med->med_open_lock);
+ list_for_each_entry(mfd, &med->med_open_head, mfd_list) {
+ if (mfd->mfd_xid == req->rq_xid)
+ break;
+ }
+ LASSERT(&mfd->mfd_list != &med->med_open_head);
+ spin_unlock(&med->med_open_lock);
+ repbody->handle.cookie = mfd->mfd_handle.h_cookie;
+ }
- /* Don't return OST-specific attributes if we didn't just set them */
-/*
- if (rec->ur_iattr.ia_valid & ATTR_SIZE)
- body->valid |= OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
- if (rec->ur_iattr.ia_valid & (ATTR_MTIME | ATTR_MTIME_SET))
- body->valid |= OBD_MD_FLMTIME;
- if (rec->ur_iattr.ia_valid & (ATTR_ATIME | ATTR_ATIME_SET))
- body->valid |= OBD_MD_FLATIME;
-*/
mdt_object_put(mti->mti_env, obj);
}
-static void mdt_reconstruct_with_shrink(struct mdt_thread_info *mti,
- struct mdt_lock_handle *lhc)
+static void mdt_reconstruct_setxattr(struct mdt_thread_info *mti,
+ struct mdt_lock_handle *lhc)
{
- mdt_reconstruct_generic(mti, lhc);
- mdt_shrink_reply(mti);
+ /* reply nothing */
+ req_capsule_shrink(mti->mti_pill, &RMF_EADATA, 0, RCL_SERVER);
}
typedef void (*mdt_reconstructor)(struct mdt_thread_info *mti,
[REINT_SETATTR] = mdt_reconstruct_setattr,
[REINT_CREATE] = mdt_reconstruct_create,
[REINT_LINK] = mdt_reconstruct_generic,
- [REINT_UNLINK] = mdt_reconstruct_with_shrink,
- [REINT_RENAME] = mdt_reconstruct_with_shrink,
- [REINT_OPEN] = mdt_reconstruct_open
+ [REINT_UNLINK] = mdt_reconstruct_generic,
+ [REINT_RENAME] = mdt_reconstruct_generic,
+ [REINT_OPEN] = mdt_reconstruct_open,
+ [REINT_SETXATTR] = mdt_reconstruct_setxattr
};
void mdt_reconstruct(struct mdt_thread_info *mti,
reconstructors[mti->mti_rr.rr_opcode](mti, lhc);
EXIT;
}
-