recover IO epoch number from replayed open request.
struct lu_fid cr_fid2;
__u64 cr_time;
__u64 cr_rdev;
+ __u64 cr_ioepoch;
__u32 cr_suppgid;
__u32 cr_padding_1; /* also fix lustre_swab_mds_rec_create */
__u32 cr_padding_2; /* also fix lustre_swab_mds_rec_create */
__u32 cr_padding_3; /* also fix lustre_swab_mds_rec_create */
- __u32 cr_padding_4; /* also fix lustre_swab_mds_rec_create */
- __u32 cr_padding_5; /* also fix lustre_swab_mds_rec_create */
};
extern void lustre_swab_mdt_rec_create (struct mdt_rec_create *cr);
}
rec->cr_fid2 = body->fid1;
+ rec->cr_ioepoch = body->ioepoch;
open_req->rq_replay_cb = mdc_replay_open;
if (!fid_is_sane(&body->fid1)) {
DEBUG_REQ(D_ERROR, open_req, "saving replay request with "
/* IO epoch related stuff. */
struct mdt_epoch *mti_epoch;
+ __u64 mti_replayepoch;
/* server and client data buffers */
struct mdt_server_data mti_msd;
struct mdt_lock_handle *lhc);
struct mdt_file_data *mdt_handle2mfd(const struct lustre_handle *handle);
-int mdt_epoch_open(struct mdt_thread_info *info, struct mdt_object *o,
- __u64 epoch);
+int mdt_epoch_open(struct mdt_thread_info *info, struct mdt_object *o);
void mdt_sizeonmds_enable(struct mdt_thread_info *info, struct mdt_object *mo);
int mdt_sizeonmds_enabled(struct mdt_object *mo);
int mdt_write_get(struct mdt_device *mdt, struct mdt_object *o);
attr->la_valid = LA_MODE | LA_RDEV | LA_UID | LA_GID |
LA_CTIME | LA_MTIME | LA_ATIME;
info->mti_spec.sp_cr_flags = rec->cr_flags;
+ info->mti_replayepoch = rec->cr_ioepoch;
if (req_capsule_get_size(pill, &RMF_CAPA1, RCL_CLIENT))
rr->rr_capa1 = req_capsule_client_get(pill, &RMF_CAPA1);
}
/* Open the epoch. Epoch open is allowed if @writecount is not negative.
- * The epoch and writecount handling is performed under the mdt_ioepoch_lock.
- *
- * @epoch is nonzero during recovery XXX not ready. */
-int mdt_epoch_open(struct mdt_thread_info *info, struct mdt_object *o,
- __u64 epoch)
+ * The epoch and writecount handling is performed under the mdt_ioepoch_lock. */
+int mdt_epoch_open(struct mdt_thread_info *info, struct mdt_object *o)
{
struct mdt_device *mdt = info->mti_mdt;
int cancel = 0;
CDEBUG(D_INODE, "continue epoch "LPU64" for "DFID"\n",
o->mot_ioepoch, PFID(mdt_object_fid(o)));
} else {
- if (epoch > mdt->mdt_ioepoch)
- mdt->mdt_ioepoch = epoch;
+ if (info->mti_replayepoch > mdt->mdt_ioepoch)
+ mdt->mdt_ioepoch = info->mti_replayepoch;
else
mdt->mdt_ioepoch++;
- o->mot_ioepoch = epoch ? epoch : mdt->mdt_ioepoch;
+ o->mot_ioepoch = info->mti_replayepoch ?
+ info->mti_replayepoch : mdt->mdt_ioepoch;
CDEBUG(D_INODE, "starting epoch "LPU64" for "DFID"\n",
mdt->mdt_ioepoch, PFID(mdt_object_fid(o)));
cancel = 1;
if (flags & FMODE_WRITE) {
rc = mdt_write_get(info->mti_mdt, o);
if (rc == 0) {
- /* FIXME: in recovery, need to pass old epoch here */
- mdt_epoch_open(info, o, 0);
+ mdt_epoch_open(info, o);
repbody->ioepoch = o->mot_ioepoch;
}
} else if (flags & MDS_FMODE_EXEC) {
if (mfd == NULL)
GOTO(out, rc = -ENOMEM);
- /* FIXME: in recovery, need to pass old epoch here */
- mdt_epoch_open(info, mo, 0);
+ mdt_epoch_open(info, mo);
repbody->ioepoch = mo->mot_ioepoch;
mdt_object_get(info->mti_env, mo);
lustre_swab_lu_fid (&cr->cr_fid2);
__swab64s (&cr->cr_time);
__swab64s (&cr->cr_rdev);
+ __swab64s (&cr->cr_ioepoch);
__swab32s (&cr->cr_suppgid);
CLASSERT(offsetof(typeof(*cr), cr_padding_1) != 0);
CLASSERT(offsetof(typeof(*cr), cr_padding_2) != 0);
CLASSERT(offsetof(typeof(*cr), cr_padding_3) != 0);
- CLASSERT(offsetof(typeof(*cr), cr_padding_4) != 0);
- CLASSERT(offsetof(typeof(*cr), cr_padding_5) != 0);
}
void lustre_swab_mds_rec_link (struct mds_rec_link *lk)