buf->mcd_last_close_result = cpu_to_le32(mcd->mcd_last_close_result);
}
-static int mdt_last_rcvd_header_read(const struct lu_env *env,
- struct mdt_device *mdt,
- struct mdt_server_data *msd)
+static inline int mdt_last_rcvd_header_read(const struct lu_env *env,
+ struct mdt_device *mdt)
{
struct mdt_thread_info *mti;
- struct mdt_server_data *tmp;
- loff_t *off;
int rc;
mti = lu_context_key_get(&env->le_ctx, &mdt_thread_key);
- /* temporary stuff for read */
- tmp = &mti->mti_msd;
- off = &mti->mti_off;
- *off = 0;
+
+ mti->mti_off = 0;
rc = mdt_record_read(env, mdt->mdt_last_rcvd,
- mdt_buf(env, tmp, sizeof(*tmp)), off);
+ mdt_buf(env, &mti->mti_msd, sizeof(mti->mti_msd)),
+ &mti->mti_off);
if (rc == 0)
- msd_le_to_cpu(tmp, msd);
+ msd_le_to_cpu(&mti->mti_msd, &mdt->mdt_msd);
CDEBUG(D_INFO, "read last_rcvd header rc = %d:\n"
"uuid = %s\n"
"last_transno = "LPU64"\n",
- rc,
- msd->msd_uuid,
- msd->msd_last_transno);
+ rc, mdt->mdt_msd.msd_uuid,
+ mdt->mdt_msd.msd_last_transno);
return rc;
}
-static int mdt_last_rcvd_header_write(const struct lu_env *env,
- struct mdt_device *mdt,
- struct mdt_server_data *msd)
+static inline int mdt_last_rcvd_header_write(const struct lu_env *env,
+ struct mdt_device *mdt)
{
struct mdt_thread_info *mti;
- struct mdt_server_data *tmp;
struct thandle *th;
- loff_t *off;
int rc;
ENTRY;
if (IS_ERR(th))
RETURN(PTR_ERR(th));
- /* temporary stuff for read */
- tmp = &mti->mti_msd;
- off = &mti->mti_off;
- *off = 0;
-
- msd_cpu_to_le(msd, tmp);
+ mti->mti_off = 0;
+ msd_cpu_to_le(&mdt->mdt_msd, &mti->mti_msd);
rc = mdt_record_write(env, mdt->mdt_last_rcvd,
- mdt_buf_const(env, tmp, sizeof(*tmp)), off, th);
+ mdt_buf_const(env, &mti->mti_msd, sizeof(mti->mti_msd)),
+ &mti->mti_off, th);
mdt_trans_stop(env, mdt, th);
CDEBUG(D_INFO, "write last_rcvd header rc = %d:\n"
"uuid = %s\nlast_transno = "LPU64"\n",
- rc, msd->msd_uuid, msd->msd_last_transno);
+ rc, mdt->mdt_msd.msd_uuid, mdt->mdt_msd.msd_last_transno);
RETURN(rc);
}
OBD_INCOMPAT_COMMON_LR;
} else {
LCONSOLE_WARN("%s: used disk, loading\n", obd->obd_name);
- rc = mdt_last_rcvd_header_read(env, mdt, msd);
+ rc = mdt_last_rcvd_header_read(env, mdt);
if (rc) {
CERROR("error reading MDS %s: rc %d\n", LAST_RCVD, rc);
GOTO(out, rc);
static int mdt_server_data_update(const struct lu_env *env,
struct mdt_device *mdt)
{
- struct mdt_server_data *msd = &mdt->mdt_msd;
int rc = 0;
ENTRY;
mdt->mdt_mount_count, mdt->mdt_last_transno);
spin_lock(&mdt->mdt_transno_lock);
- msd->msd_last_transno = mdt->mdt_last_transno;
+ mdt->mdt_msd.msd_last_transno = mdt->mdt_last_transno;
spin_unlock(&mdt->mdt_transno_lock);
/*
* mdt->mdt_last_rcvd may be NULL that time.
*/
if (mdt->mdt_last_rcvd != NULL)
- rc = mdt_last_rcvd_header_write(env, mdt, msd);
+ rc = mdt_last_rcvd_header_write(env, mdt);
RETURN(rc);
}
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;
mdt->mdt_txn_cb.dtc_txn_stop = mdt_txn_stop_cb;
mdt->mdt_txn_cb.dtc_txn_commit = mdt_txn_commit_cb;
mdt->mdt_txn_cb.dtc_cookie = mdt;
- INIT_LIST_HEAD(&mdt->mdt_txn_cb.dtc_linkage);
+ CFS_INIT_LIST_HEAD(&mdt->mdt_txn_cb.dtc_linkage);
dt_txn_callback_add(mdt->mdt_bottom, &mdt->mdt_txn_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;
}
-