static int hf_lustre_obdo_o_gid = -1;
static int hf_lustre_llog_catid_lci_logid = -1;
static int hf_lustre_llog_rec_tail_lrt_index = -1;
-static int hf_lustre_obdo_o_mds = -1;
static int hf_lustre_lov_desc_ld_default_stripe_count = -1;
static int hf_lustre_ldlm_resource_desc_lr_padding = -1;
static int hf_lustre_cfg_marker_cm_vers = -1;
static int hf_lustre_llog_setattr_rec_lsr_ogen = -1;
static int hf_lustre_mds_rec_create_cr_padding_3 = -1;
static int hf_lustre_llog_logid_rec_lid_hdr = -1;
-static int hf_lustre_obdo_o_easize = -1;
+static int hf_lustre_obdo_o_ioepoch = -1;
static int hf_lustre_ost_body_oa = -1;
static int hf_lustre_llog_logid_rec_padding3 = -1;
static int hf_lustre_llog_log_hdr_llh_flags = -1;
/* IDL: uint32 o_nlink; */
/* IDL: uint32 o_generation; */
/* IDL: uint32 o_misc; */
-/* IDL: uint32 o_easize; */
-/* IDL: uint32 o_mds; */
+/* IDL: uint64 o_ioepoch; */
/* IDL: uint32 o_stripe_idx; */
/* IDL: uint32 o_padding_1; */
/* IDL: struct lustre_handle { */
}
static int
-lustre_dissect_element_obdo_o_easize(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_)
+lustre_dissect_element_obdo_o_ioepoch(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_)
{
- offset=dissect_uint32(tvb, offset, pinfo, tree, hf_lustre_obdo_o_easize);
-
- return offset;
-}
-
-static int
-lustre_dissect_element_obdo_o_mds(tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_)
-{
- offset=dissect_uint32(tvb, offset, pinfo, tree, hf_lustre_obdo_o_mds);
+ offset=dissect_uint64(tvb, offset, pinfo, tree, hf_lustre_obdo_o_ioepoch);
return offset;
}
offset=lustre_dissect_element_obdo_o_misc(tvb, offset, pinfo, tree);
- offset=lustre_dissect_element_obdo_o_easize(tvb, offset, pinfo, tree);
-
- offset=lustre_dissect_element_obdo_o_mds(tvb, offset, pinfo, tree);
+ offset=lustre_dissect_element_obdo_o_ioepoch(tvb, offset, pinfo, tree);
offset=lustre_dissect_element_obdo_o_stripe_idx(tvb, offset, pinfo, tree);
{ "Lci Logid", "lustre.llog_catid.lci_logid", FT_NONE, BASE_HEX, NULL, 0, "", HFILL }},
{ &hf_lustre_llog_rec_tail_lrt_index,
{ "Lrt Index", "lustre.llog_rec_tail.lrt_index", FT_UINT32, BASE_DEC, NULL, 0, "", HFILL }},
- { &hf_lustre_obdo_o_mds,
- { "O Mds", "lustre.obdo.o_mds", FT_UINT32, BASE_DEC, NULL, 0, "", HFILL }},
{ &hf_lustre_lov_desc_ld_default_stripe_count,
{ "Ld Default Stripe Count", "lustre.lov_desc.ld_default_stripe_count", FT_UINT32, BASE_DEC, NULL, 0, "", HFILL }},
{ &hf_lustre_ldlm_resource_desc_lr_padding,
{ "Cr Padding 3", "lustre.mds_rec_create.cr_padding_3", FT_UINT32, BASE_DEC, NULL, 0, "", HFILL }},
{ &hf_lustre_llog_logid_rec_lid_hdr,
{ "Lid Hdr", "lustre.llog_logid_rec.lid_hdr", FT_NONE, BASE_HEX, NULL, 0, "", HFILL }},
- { &hf_lustre_obdo_o_easize,
- { "O Easize", "lustre.obdo.o_easize", FT_UINT32, BASE_DEC, NULL, 0, "", HFILL }},
+ { &hf_lustre_obdo_o_ioepoch,
+ { "O IOEpoch", "lustre.obdo.o_ioepoch", FT_UINT64, BASE_DEC, NULL, 0, "", HFILL }},
{ &hf_lustre_ost_body_oa,
{ "Oa", "lustre.ost_body.oa", FT_NONE, BASE_HEX, NULL, 0, "", HFILL }},
{ &hf_lustre_llog_logid_rec_padding3,
extern void lustre_swab_mdt_body (struct mdt_body *b);
-struct mdt_epoch {
+struct mdt_ioepoch {
struct lustre_handle handle;
__u64 ioepoch;
__u32 flags;
__u32 padding;
};
-extern void lustre_swab_mdt_epoch (struct mdt_epoch *b);
+extern void lustre_swab_mdt_ioepoch (struct mdt_ioepoch *b);
#define Q_QUOTACHECK 0x800100
#define Q_INITQUOTA 0x800101 /* init slave limits */
obd_count o_nlink; /* brw: checksum */
obd_count o_generation;
obd_count o_misc; /* brw: o_dropped */
- __u32 o_easize; /* epoch in ost writes */
- __u32 o_mds;
+ __u64 o_ioepoch; /* epoch in ost writes */
__u32 o_stripe_idx; /* holds stripe idx */
__u32 o_padding_1;
struct lustre_handle o_handle; /* brw: lock handle to prolong locks */
ENTRY;
- /*
- * XXX layering violation.
- */
- if (cl_i2info(inode)->lli_smd->lsm_stripe_count == 0)
+ if (!cl_i2info(inode)->lli_smd)
RETURN(0);
result = cl_io_get(inode, &env, &io, &refcheck);
*
* - o_generation
*
- * - and IO epoch (stored in o_easize),
+ * - o_ioepoch,
*
* and capability.
*/
if (slice->crs_req->crq_type == CRT_WRITE) {
if (flags & OBD_MD_FLEPOCH) {
oa->o_valid |= OBD_MD_FLEPOCH;
- oa->o_easize = cl_i2info(inode)->lli_ioepoch;
+ oa->o_ioepoch = cl_i2info(inode)->lli_ioepoch;
valid_flags |= OBD_MD_FLMTIME|OBD_MD_FLCTIME|
OBD_MD_FLUID|OBD_MD_FLGID|
OBD_MD_FLFID|OBD_MD_FLGENER;
LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK));
LASSERT(sbi->ll_lco.lco_flags & OBD_CONNECT_SOM);
- rc = llu_inode_getattr(inode, &oa);
- if (rc == -ENOENT) {
- oa.o_valid = 0;
- CDEBUG(D_INODE, "objid "LPX64" is already destroyed\n",
- lli->lli_smd->lsm_object_id);
- } else if (rc) {
- CERROR("inode_getattr failed (%d): unable to send a "
- "Size-on-MDS attribute update for inode %llu/%lu\n",
- rc, (long long)llu_i2stat(inode)->st_ino,
- lli->lli_st_generation);
- RETURN(rc);
- }
+ /* If inode is already in another epoch, skip getattr from OSTs. */
+ if (lli->lli_ioepoch == ioepoch) {
+ rc = llu_inode_getattr(inode, &oa);
+ if (rc == -ENOENT) {
+ oa.o_valid = 0;
+ CDEBUG(D_INODE, "objid "LPX64" is already destroyed\n",
+ lli->lli_smd->lsm_object_id);
+ } else if (rc) {
+ CERROR("inode_getattr failed (%d): unable to send a "
+ "Size-on-MDS attribute update for inode "
+ "%llu/%lu\n", rc,
+ (long long)llu_i2stat(inode)->st_ino,
+ lli->lli_st_generation);
+ RETURN(rc);
+ }
- md_from_obdo(&op_data, &oa, oa.o_valid);
+ md_from_obdo(&op_data, &oa, oa.o_valid);
+ }
memcpy(&op_data.op_handle, fh, sizeof(*fh));
op_data.op_ioepoch = ioepoch;
op_data.op_flags |= MF_SOM_CHANGE;
RETURN(rc);
}
+void llu_pack_inode2opdata(struct inode *inode, struct md_op_data *op_data,
+ struct lustre_handle *fh)
+{
+ struct llu_inode_info *lli = llu_i2info(inode);
+ struct intnl_stat *st = llu_i2stat(inode);
+ ENTRY;
+
+ op_data->op_fid1 = lli->lli_fid;
+ op_data->op_attr.ia_atime = st->st_atime;
+ op_data->op_attr.ia_mtime = st->st_mtime;
+ op_data->op_attr.ia_ctime = st->st_ctime;
+ op_data->op_attr.ia_size = st->st_size;
+ op_data->op_attr_blocks = st->st_blocks;
+ op_data->op_attr.ia_attr_flags = lli->lli_st_flags;
+ op_data->op_ioepoch = lli->lli_ioepoch;
+ if (fh)
+ op_data->op_handle = *fh;
+ EXIT;
+}
+
+void llu_done_writing_attr(struct inode *inode, struct md_op_data *op_data)
+{
+ struct llu_inode_info *lli = llu_i2info(inode);
+ ENTRY;
+
+ op_data->op_flags |= MF_SOM_CHANGE;
+
+ /* Pack Size-on-MDS attributes if we are in IO
+ * epoch and attributes are valid. */
+ LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK));
+ if (!cl_local_size(inode))
+ op_data->op_attr.ia_valid |= ATTR_MTIME_SET | ATTR_CTIME_SET |
+ ATTR_ATIME_SET | ATTR_SIZE | ATTR_BLOCKS;
+
+ EXIT;
+}
+
int llu_md_close(struct obd_export *md_exp, struct inode *inode)
{
struct llu_inode_info *lli = llu_i2info(inode);
} else {
/* Inode cannot be dirty. Close the epoch. */
op_data.op_flags |= MF_EPOCH_CLOSE;
- /* XXX: Send CHANGE flag only if Size-on-MDS inode attributes
- * are really changed. */
- op_data.op_flags |= MF_SOM_CHANGE;
-
- /* Pack Size-on-MDS attributes if we are in IO epoch and
- * attributes are valid. */
- LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK));
- if (!cl_local_size(inode))
- op_data.op_attr.ia_valid |=
- OBD_MD_FLSIZE | OBD_MD_FLBLOCKS;
+ /* XXX: Send SOM attributes only if they are really
+ * changed. */
+ llu_done_writing_attr(inode, &op_data);
}
}
- op_data.op_fid1 = lli->lli_fid;
- op_data.op_attr.ia_atime = st->st_atime;
- op_data.op_attr.ia_mtime = st->st_mtime;
- op_data.op_attr.ia_ctime = st->st_ctime;
- op_data.op_attr.ia_size = st->st_size;
- op_data.op_attr_blocks = st->st_blocks;
- op_data.op_attr.ia_attr_flags = lli->lli_st_flags;
- op_data.op_ioepoch = lli->lli_ioepoch;
- memcpy(&op_data.op_handle, &och->och_fh, sizeof(op_data.op_handle));
+ llu_pack_inode2opdata(inode, &op_data, &och->och_fh);
rc = md_close(md_exp, &op_data, och->och_mod, &req);
if (rc == -EAGAIN) {
int llu_create(struct inode *dir, struct pnode_base *pnode, int mode);
int llu_local_open(struct llu_inode_info *lli, struct lookup_intent *it);
int llu_iop_open(struct pnode *pnode, int flags, mode_t mode);
+void llu_done_writing_attr(struct inode *inode, struct md_op_data *op_data);
int llu_md_close(struct obd_export *md_exp, struct inode *inode);
+void llu_pack_inode2opdata(struct inode *inode, struct md_op_data *op_data,
+ struct lustre_handle *fh);
int llu_file_release(struct inode *inode);
int llu_sizeonmds_update(struct inode *inode, struct lustre_handle *fh,
__u64 ioepoch);
CDEBUG(D_INODE, "Epoch "LPU64" closed on "DFID" for truncate\n",
op_data->op_ioepoch, PFID(&lli->lli_fid));
- op_data->op_flags = MF_EPOCH_CLOSE | MF_SOM_CHANGE;
+ op_data->op_flags = MF_EPOCH_CLOSE;
+ llu_done_writing_attr(inode, op_data);
+ llu_pack_inode2opdata(inode, op_data, NULL);
+
rc = md_done_writing(llu_i2sbi(inode)->ll_md_exp, op_data, mod);
if (rc == -EAGAIN) {
/* MDS has instructed us to obtain Size-on-MDS attribute
memcpy(&op_data.op_attr, attr, sizeof(*attr));
/* Open epoch for truncate. */
- if ((llu_i2mdexp(inode)->exp_connect_flags & OBD_CONNECT_SOM) &&
+ if (exp_connect_som(llu_i2mdexp(inode)) &&
(ia_valid & ATTR_SIZE))
op_data.op_flags = MF_EPOCH_OPEN;
rc = llu_md_setattr(inode, &op_data, &mod);
op_data->op_attr_blocks = inode->i_blocks;
((struct ll_iattr *)&op_data->op_attr)->ia_attr_flags = inode->i_flags;
op_data->op_ioepoch = ll_i2info(inode)->lli_ioepoch;
- memcpy(&op_data->op_handle, fh, sizeof(op_data->op_handle));
+ if (fh)
+ op_data->op_handle = *fh;
op_data->op_capa1 = ll_mdscapa_get(inode);
}
if (!(och->och_flags & FMODE_WRITE))
goto out;
- if (!(exp_connect_som(ll_i2mdexp(inode))) || !S_ISREG(inode->i_mode))
+ if (!exp_connect_som(ll_i2mdexp(inode)) || !S_ISREG(inode->i_mode))
op_data->op_attr.ia_valid |= ATTR_SIZE | ATTR_BLOCKS;
else
- ll_epoch_close(inode, op_data, &och, 0);
+ ll_ioepoch_close(inode, op_data, &och, 0);
out:
ll_pack_inode2opdata(inode, op_data, &och->och_fh);
LASSERT(epoch_close);
/* MDS has instructed us to obtain Size-on-MDS attribute from
* OSTs and send setattr to back to MDS. */
- rc = ll_sizeonmds_update(inode, &och->och_fh,
+ rc = ll_sizeonmds_update(inode, &op_data->op_handle,
op_data->op_ioepoch);
if (rc) {
CERROR("inode %lu mdc Size-on-MDS update failed: "
EXIT;
out:
- if ((exp->exp_connect_flags & OBD_CONNECT_SOM) && !epoch_close &&
+ if (exp_connect_som(exp) && !epoch_close &&
S_ISREG(inode->i_mode) && (och->och_flags & FMODE_WRITE)) {
ll_queue_done_writing(inode, LLIF_DONE_WRITING);
} else {
EXIT;
}
+void ll_done_writing_attr(struct inode *inode, struct md_op_data *op_data)
+{
+ struct ll_inode_info *lli = ll_i2info(inode);
+ ENTRY;
+
+ op_data->op_flags |= MF_SOM_CHANGE;
+ /* Check if Size-on-MDS attributes are valid. */
+ if (lli->lli_flags & LLIF_MDS_SIZE_LOCK)
+ CERROR("ino %lu/%u(flags %lu) som valid it just after "
+ "recovery\n", inode->i_ino, inode->i_generation,
+ lli->lli_flags);
+
+ if (!cl_local_size(inode)) {
+ /* Send Size-on-MDS Attributes if valid. */
+ op_data->op_attr.ia_valid |= ATTR_MTIME_SET | ATTR_CTIME_SET |
+ ATTR_ATIME_SET | ATTR_SIZE | ATTR_BLOCKS;
+ }
+ EXIT;
+}
+
/** Closes epoch and sends Size-on-MDS attribute update if possible. Call
* this under ll_inode_info::lli_lock spinlock. */
-void ll_epoch_close(struct inode *inode, struct md_op_data *op_data,
+void ll_ioepoch_close(struct inode *inode, struct md_op_data *op_data,
struct obd_client_handle **och, unsigned long flags)
{
struct ll_inode_info *lli = ll_i2info(inode);
LASSERT(list_empty(&club->cob_pending_list));
lli->lli_flags &= ~LLIF_SOM_DIRTY;
spin_unlock(&lli->lli_lock);
- op_data->op_flags |= MF_SOM_CHANGE;
+ ll_done_writing_attr(inode, op_data);
- /* Check if Size-on-MDS attributes are valid. */
- if (lli->lli_flags & LLIF_MDS_SIZE_LOCK)
- CWARN("ino %lu/%u(flags %lu) som valid it just after "
- "recovery\n",
- inode->i_ino, inode->i_generation, lli->lli_flags);
-
- if (!cl_local_size(inode)) {
- /* Send Size-on-MDS Attributes if valid. Atime is sent along
- * with all the attributes. */
- op_data->op_attr.ia_valid |= ATTR_MTIME_SET | ATTR_CTIME_SET |
- ATTR_ATIME_SET | ATTR_SIZE | ATTR_BLOCKS;
- }
EXIT;
out:
return;
int rc;
ENTRY;
- /* LASSERT(!(lli->lli_flags & LLIF_MDS_SIZE_LOCK)); */
- /* After recovery that can be valid. */
if (lli->lli_flags & LLIF_MDS_SIZE_LOCK)
- CWARN("ino %lu/%u(flags %lu) som valid it just after "
- "recovery\n", inode->i_ino, inode->i_generation,
- lli->lli_flags);
+ CERROR("ino %lu/%u(flags %lu) som valid it just after "
+ "recovery\n", inode->i_ino, inode->i_generation,
+ lli->lli_flags);
OBDO_ALLOC(oa);
OBD_ALLOC_PTR(op_data);
CERROR("can't allocate memory for Size-on-MDS update.\n");
RETURN(-ENOMEM);
}
- rc = ll_inode_getattr(inode, oa);
- if (rc == -ENOENT) {
- oa->o_valid = 0;
- CDEBUG(D_INODE, "objid "LPX64" is already destroyed\n",
- lli->lli_smd->lsm_object_id);
- } else if (rc) {
- CERROR("inode_getattr failed (%d): unable to send a "
- "Size-on-MDS attribute update for inode %lu/%u\n",
- rc, inode->i_ino, inode->i_generation);
- GOTO(out, rc);
+ /* If inode is already in another epoch, skip getattr from OSTs. */
+ if (lli->lli_ioepoch == ioepoch) {
+ rc = ll_inode_getattr(inode, oa);
+ if (rc == -ENOENT) {
+ oa->o_valid = 0;
+ CDEBUG(D_INODE, "objid "LPX64" is already destroyed\n",
+ lli->lli_smd->lsm_object_id);
+ } else if (rc) {
+ CERROR("inode_getattr failed (%d): unable to send a "
+ "Size-on-MDS attribute update for inode "
+ "%lu/%u\n", rc, inode->i_ino,
+ inode->i_generation);
+ GOTO(out, rc);
+ }
+ CDEBUG(D_INODE, "Size-on-MDS update on "DFID"\n",
+ PFID(&lli->lli_fid));
+ md_from_obdo(op_data, oa, oa->o_valid);
}
- CDEBUG(D_INODE, "Size-on-MDS update on "DFID"\n", PFID(&lli->lli_fid));
-
- md_from_obdo(op_data, oa, oa->o_valid);
memcpy(&op_data->op_handle, fh, sizeof(*fh));
op_data->op_ioepoch = ioepoch;
int rc;
ENTRY;
- LASSERT(ll_i2mdexp(inode)->exp_connect_flags & OBD_CONNECT_SOM);
+ LASSERT(exp_connect_som(ll_i2mdexp(inode)));
OBD_ALLOC_PTR(op_data);
if (op_data == NULL) {
return;
}
- ll_epoch_close(inode, op_data, &och, LLIF_DONE_WRITING);
+ ll_ioepoch_close(inode, op_data, &och, LLIF_DONE_WRITING);
/* If there is no @och, we do not do D_W yet. */
if (och == NULL)
GOTO(out, 0);
if (rc == -EAGAIN) {
/* MDS has instructed us to obtain Size-on-MDS attribute from
* OSTs and send setattr to back to MDS. */
- rc = ll_sizeonmds_update(inode, &och->och_fh,
+ rc = ll_sizeonmds_update(inode, &op_data->op_handle,
op_data->op_ioepoch);
} else if (rc) {
CERROR("inode %lu mdc done_writing failed: rc = %d\n",
int ll_md_close(struct obd_export *md_exp, struct inode *inode,
struct file *file);
int ll_md_real_close(struct inode *inode, int flags);
-void ll_epoch_close(struct inode *inode, struct md_op_data *op_data,
- struct obd_client_handle **och, unsigned long flags);
+void ll_ioepoch_close(struct inode *inode, struct md_op_data *op_data,
+ struct obd_client_handle **och, unsigned long flags);
+void ll_done_writing_attr(struct inode *inode, struct md_op_data *op_data);
int ll_sizeonmds_update(struct inode *inode, struct lustre_handle *fh,
__u64 ioepoch);
int ll_inode_getattr(struct inode *inode, struct obdo *obdo);
CDEBUG(D_INODE, "Epoch "LPU64" closed on "DFID" for truncate\n",
op_data->op_ioepoch, PFID(&lli->lli_fid));
- op_data->op_flags = MF_EPOCH_CLOSE | MF_SOM_CHANGE;
+ op_data->op_flags = MF_EPOCH_CLOSE;
+ ll_done_writing_attr(inode, op_data);
+ ll_pack_inode2opdata(inode, op_data, NULL);
+
rc = md_done_writing(ll_i2sbi(inode)->ll_md_exp, op_data, mod);
if (rc == -EAGAIN) {
/* MDS has instructed us to obtain Size-on-MDS attribute
memcpy(&op_data->op_attr, attr, sizeof(*attr));
/* Open epoch for truncate. */
- if ((ll_i2mdexp(inode)->exp_connect_flags & OBD_CONNECT_SOM) &&
- (ia_valid & ATTR_SIZE))
+ if (exp_connect_som(ll_i2mdexp(inode)) && (ia_valid & ATTR_SIZE))
op_data->op_flags = MF_EPOCH_OPEN;
rc = ll_md_setattr(inode, op_data, &mod);
rec->sa_suppgid = op_data->op_suppgids[0];
}
-static void mdc_epoch_pack(struct mdt_epoch *epoch, struct md_op_data *op_data)
+static void mdc_ioepoch_pack(struct mdt_ioepoch *epoch,
+ struct md_op_data *op_data)
{
memcpy(&epoch->handle, &op_data->op_handle, sizeof(epoch->handle));
epoch->ioepoch = op_data->op_ioepoch;
void *ea, int ealen, void *ea2, int ea2len)
{
struct mdt_rec_setattr *rec;
- struct mdt_epoch *epoch;
+ struct mdt_ioepoch *epoch;
CLASSERT(sizeof(struct mdt_rec_reint) ==sizeof(struct mdt_rec_setattr));
rec = req_capsule_client_get(&req->rq_pill, &RMF_REC_REINT);
if (op_data->op_flags & (MF_SOM_CHANGE | MF_EPOCH_OPEN)) {
epoch = req_capsule_client_get(&req->rq_pill, &RMF_MDT_EPOCH);
- mdc_epoch_pack(epoch, op_data);
+ mdc_ioepoch_pack(epoch, op_data);
}
if (ealen == 0)
void mdc_close_pack(struct ptlrpc_request *req, struct md_op_data *op_data)
{
- struct mdt_epoch *epoch;
+ struct mdt_ioepoch *epoch;
struct mdt_rec_setattr *rec;
epoch = req_capsule_client_get(&req->rq_pill, &RMF_MDT_EPOCH);
mdc_setattr_pack_rec(rec, op_data);
mdc_pack_capa(req, &RMF_CAPA1, op_data->op_capa1);
- mdc_epoch_pack(epoch, op_data);
+ mdc_ioepoch_pack(epoch, op_data);
}
static int mdc_req_avail(struct client_obd *cli, struct mdc_cache_waiter *mcw)
/* Save the obtained info in the original RPC for the replay case. */
if (rc == 0 && (op_data->op_flags & MF_EPOCH_OPEN)) {
- struct mdt_epoch *epoch;
+ struct mdt_ioepoch *epoch;
struct mdt_body *body;
epoch = req_capsule_client_get(&req->rq_pill, &RMF_MDT_EPOCH);
close_req = mod->mod_close_req;
if (close_req != NULL) {
__u32 opc = lustre_msg_get_opc(close_req->rq_reqmsg);
- struct mdt_epoch *epoch;
+ struct mdt_ioepoch *epoch;
LASSERT(opc == MDS_CLOSE || opc == MDS_DONE_WRITING);
epoch = req_capsule_client_get(&close_req->rq_pill,
return (*p)(env, cookie, LUSTRE_MDT_NAME"-object@%p(ioepoch=%llu "
"flags=%llx, epochcount=%d, writecount=%d)",
mdto, mdto->mot_ioepoch, mdto->mot_flags,
- mdto->mot_epochcount, mdto->mot_writecount);
+ mdto->mot_ioepoch_count, mdto->mot_writecount);
}
static const struct lu_device_operations mdt_lu_ops = {
return -EBADE;
}
- if (mdt->mdt_som_conf &&
- !(exp->exp_connect_flags & OBD_CONNECT_MDS_MDS) &&
- !(exp->exp_connect_flags & OBD_CONNECT_SOM)) {
+ if (mdt->mdt_som_conf && !exp_connect_som(exp) &&
+ !(exp->exp_connect_flags & OBD_CONNECT_MDS_MDS)) {
CWARN("%s: MDS has SOM enabled, but client does not support "
"it\n", mdt->mdt_md_dev.md_lu_dev.ld_obd->obd_name);
return -EBADE;
struct md_object mot_obj;
__u64 mot_ioepoch;
__u64 mot_flags;
- int mot_epochcount;
+ int mot_ioepoch_count;
int mot_writecount;
};
} mti_u;
/* IO epoch related stuff. */
- struct mdt_epoch *mti_epoch;
+ struct mdt_ioepoch *mti_ioepoch;
__u64 mti_replayepoch;
/* server and client data buffers */
struct mdt_file_data *mdt_handle2mfd(struct mdt_thread_info *,
const struct lustre_handle *);
-int mdt_epoch_open(struct mdt_thread_info *info, struct mdt_object *o);
+int mdt_ioepoch_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);
RETURN(0);
}
-static int mdt_epoch_unpack(struct mdt_thread_info *info)
+static int mdt_ioepoch_unpack(struct mdt_thread_info *info)
{
struct req_capsule *pill = info->mti_pill;
ENTRY;
if (req_capsule_get_size(pill, &RMF_MDT_EPOCH, RCL_CLIENT))
- info->mti_epoch = req_capsule_client_get(pill, &RMF_MDT_EPOCH);
+ info->mti_ioepoch =
+ req_capsule_client_get(pill, &RMF_MDT_EPOCH);
else
- info->mti_epoch = NULL;
- RETURN(info->mti_epoch == NULL ? -EFAULT : 0);
+ info->mti_ioepoch = NULL;
+ RETURN(info->mti_ioepoch == NULL ? -EFAULT : 0);
}
static inline int mdt_dlmreq_unpack(struct mdt_thread_info *info) {
RETURN(rc);
/* Epoch may be absent */
- mdt_epoch_unpack(info);
+ mdt_ioepoch_unpack(info);
ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_EADATA, RCL_CLIENT);
if (ma->ma_lmm_size) {
int rc;
ENTRY;
- rc = mdt_epoch_unpack(info);
+ rc = mdt_ioepoch_unpack(info);
if (rc)
RETURN(rc);
RETURN(rc);
}
-static int mdt_epoch_opened(struct mdt_object *mo)
+static int mdt_ioepoch_opened(struct mdt_object *mo)
{
- return mo->mot_epochcount;
+ return mo->mot_ioepoch_count;
}
int mdt_sizeonmds_enabled(struct mdt_object *mo)
struct mdt_object *mo)
{
spin_lock(&info->mti_mdt->mdt_ioepoch_lock);
- if (info->mti_epoch->ioepoch == mo->mot_ioepoch) {
- LASSERT(!mdt_epoch_opened(mo));
+ if (info->mti_ioepoch->ioepoch == mo->mot_ioepoch) {
+ LASSERT(!mdt_ioepoch_opened(mo));
mo->mot_ioepoch = 0;
mo->mot_flags = 0;
}
/* Open the epoch. Epoch open is allowed if @writecount is not negative.
* 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)
+int mdt_ioepoch_open(struct mdt_thread_info *info, struct mdt_object *o)
{
struct mdt_device *mdt = info->mti_mdt;
int cancel = 0;
RETURN(0);
spin_lock(&mdt->mdt_ioepoch_lock);
- if (mdt_epoch_opened(o)) {
+ if (mdt_ioepoch_opened(o)) {
/* Epoch continues even if there is no writers yet. */
CDEBUG(D_INODE, "continue epoch "LPU64" for "DFID"\n",
o->mot_ioepoch, PFID(mdt_object_fid(o)));
mdt->mdt_ioepoch, PFID(mdt_object_fid(o)));
cancel = 1;
}
- o->mot_epochcount++;
+ o->mot_ioepoch_count++;
spin_unlock(&mdt->mdt_ioepoch_lock);
/* Cancel Size-on-MDS attributes on clients if not truncate.
ENTRY;
CDEBUG(D_INODE, "Closing epoch "LPU64" on "DFID". Count %d\n",
- o->mot_ioepoch, PFID(mdt_object_fid(o)), o->mot_epochcount);
+ o->mot_ioepoch, PFID(mdt_object_fid(o)), o->mot_ioepoch_count);
if (info->mti_attr.ma_attr.la_valid & LA_SIZE) {
/* Do Size-on-MDS attribute update.
* Returns 0 if epoch closes.
* Returns -EAGAIN if epoch closes but an Size-on-MDS Update is still needed
* from the client. */
-static int mdt_epoch_close(struct mdt_thread_info *info, struct mdt_object *o)
+static int mdt_ioepoch_close(struct mdt_thread_info *info, struct mdt_object *o)
{
int eviction = (mdt_info_req(info) == NULL ? 1 : 0);
struct lu_attr *la = &info->mti_attr.ma_attr;
spin_lock(&info->mti_mdt->mdt_ioepoch_lock);
/* Epoch closes only if client tells about it or eviction occures. */
- if (eviction || (info->mti_epoch->flags & MF_EPOCH_CLOSE)) {
- LASSERT(o->mot_epochcount);
- o->mot_epochcount--;
+ if (eviction || (info->mti_ioepoch->flags & MF_EPOCH_CLOSE)) {
+ LASSERT(o->mot_ioepoch_count);
+ o->mot_ioepoch_count--;
CDEBUG(D_INODE, "Closing epoch "LPU64" on "DFID". Count %d\n",
o->mot_ioepoch, PFID(mdt_object_fid(o)),
- o->mot_epochcount);
+ o->mot_ioepoch_count);
if (!eviction)
- achange = (info->mti_epoch->flags & MF_SOM_CHANGE);
+ achange = (info->mti_ioepoch->flags & MF_SOM_CHANGE);
rc = 0;
- if (!eviction && !mdt_epoch_opened(o)) {
+ if (!eviction && !mdt_ioepoch_opened(o)) {
/* Epoch ends. Is an Size-on-MDS update needed? */
if (o->mot_flags & MF_SOM_CHANGE) {
/* Some previous writer changed the attribute.
o->mot_flags |= MF_SOM_CHANGE;
}
- opened = mdt_epoch_opened(o);
+ opened = mdt_ioepoch_opened(o);
spin_unlock(&info->mti_mdt->mdt_ioepoch_lock);
/* If eviction occurred, do nothing. */
if (flags & FMODE_WRITE) {
rc = mdt_write_get(info->mti_mdt, o);
if (rc == 0) {
- mdt_epoch_open(info, o);
+ mdt_ioepoch_open(info, o);
repbody->ioepoch = o->mot_ioepoch;
}
} else if (flags & MDS_FMODE_EXEC) {
if ((mode & FMODE_WRITE) || (mode & FMODE_EPOCHLCK)) {
mdt_write_put(info->mti_mdt, o);
- ret = mdt_epoch_close(info, o);
+ ret = mdt_ioepoch_close(info, o);
} else if (mode & MDS_FMODE_EXEC) {
mdt_write_allow(info->mti_mdt, o);
} else if (mode & FMODE_EPOCH) {
- ret = mdt_epoch_close(info, o);
+ ret = mdt_ioepoch_close(info, o);
}
/* Update atime on close only. */
if (rc)
RETURN(err_serious(rc));
- LASSERT(info->mti_epoch);
+ LASSERT(info->mti_ioepoch);
req_capsule_set_size(info->mti_pill, &RMF_MDT_MD, RCL_SERVER,
info->mti_mdt->mdt_max_mdsize);
med = &req->rq_export->exp_mdt_data;
spin_lock(&med->med_open_lock);
- mfd = mdt_handle2mfd(info, &info->mti_epoch->handle);
+ mfd = mdt_handle2mfd(info, &info->mti_ioepoch->handle);
if (mdt_mfd_closed(mfd)) {
spin_unlock(&med->med_open_lock);
CDEBUG(D_INODE, "no handle for file close: fid = "DFID
": cookie = "LPX64"\n", PFID(info->mti_rr.rr_fid1),
- info->mti_epoch->handle.cookie);
+ info->mti_ioepoch->handle.cookie);
/** not serious error since bug 3633 */
rc = -ESTALE;
} else {
med = &info->mti_exp->exp_mdt_data;
spin_lock(&med->med_open_lock);
- mfd = mdt_handle2mfd(info, &info->mti_epoch->handle);
+ mfd = mdt_handle2mfd(info, &info->mti_ioepoch->handle);
if (mfd == NULL) {
spin_unlock(&med->med_open_lock);
CDEBUG(D_INODE, "no handle for done write: fid = "DFID
": cookie = "LPX64" ioepoch = "LPU64"\n",
PFID(info->mti_rr.rr_fid1),
- info->mti_epoch->handle.cookie,
- info->mti_epoch->ioepoch);
+ info->mti_ioepoch->handle.cookie,
+ info->mti_ioepoch->ioepoch);
RETURN(-ESTALE);
}
spin_unlock(&med->med_open_lock);
/* Set EPOCH CLOSE flag if not set by client. */
- info->mti_epoch->flags |= MF_EPOCH_CLOSE;
+ info->mti_ioepoch->flags |= MF_EPOCH_CLOSE;
info->mti_attr.ma_valid = 0;
rc = mdt_mfd_close(info, mfd);
mdt_empty_transno(info);
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));
- if (mti->mti_epoch && (mti->mti_epoch->flags & MF_EPOCH_OPEN)) {
+ if (mti->mti_ioepoch && (mti->mti_ioepoch->flags & MF_EPOCH_OPEN)) {
struct mdt_file_data *mfd;
struct mdt_body *repbody;
/* attr shouldn't be set on remote object */
LASSERT(mdt_object_exists(mo) >= 0);
- if (exp_connect_som(info->mti_exp) && info->mti_epoch)
- som_update = (info->mti_epoch->flags & MF_SOM_CHANGE);
+ if (exp_connect_som(info->mti_exp) && info->mti_ioepoch)
+ som_update = (info->mti_ioepoch->flags & MF_SOM_CHANGE);
/* Try to avoid object_lock if another epoch has been started
* already. */
- if (som_update && (info->mti_epoch->ioepoch != mo->mot_ioepoch))
+ if (som_update && (info->mti_ioepoch->ioepoch != mo->mot_ioepoch))
RETURN(0);
lh = &info->mti_lh[MDT_LH_PARENT];
/* Setattrs are syncronized through dlm lock taken above. If another
* epoch started, its attributes may be already flushed on disk,
* skip setattr. */
- if (som_update && (info->mti_epoch->ioepoch != mo->mot_ioepoch))
+ if (som_update && (info->mti_ioepoch->ioepoch != mo->mot_ioepoch))
GOTO(out_unlock, rc = 0);
if (mdt_object_exists(mo) == 0)
/* Re-enable SIZEONMDS. */
if (som_update) {
- CDEBUG(D_INODE, "Closing epoch "LPU64" on "DFID". Count %d\n",
- mo->mot_ioepoch, PFID(mdt_object_fid(mo)),
- mo->mot_epochcount);
+ CDEBUG(D_INODE, "Closing epoch "LPU64" on "DFID" size "LPU64
+ ". Count %d\n", mo->mot_ioepoch,
+ PFID(mdt_object_fid(mo)), ma->ma_attr.la_size,
+ mo->mot_ioepoch_count);
mdt_sizeonmds_enable(info, mo);
}
if (mdt_write_read(info->mti_mdt, mo) < 0)
GOTO(out_put, rc = -ETXTBSY);
}
- } else if (info->mti_epoch &&
- (info->mti_epoch->flags & MF_EPOCH_OPEN)) {
+ } else if (info->mti_ioepoch &&
+ (info->mti_ioepoch->flags & MF_EPOCH_OPEN)) {
/* Truncate case. */
rc = mdt_write_get(info->mti_mdt, mo);
if (rc)
if (mfd == NULL)
GOTO(out_put, rc = -ENOMEM);
- mdt_epoch_open(info, mo);
+ mdt_ioepoch_open(info, mo);
repbody->ioepoch = mo->mot_ioepoch;
mdt_object_get(info->mti_env, mo);
repbody->handle.cookie = mfd->mfd_handle.h_cookie;
}
- if (info->mti_epoch && (info->mti_epoch->flags & MF_SOM_CHANGE))
+ if (info->mti_ioepoch && (info->mti_ioepoch->flags & MF_SOM_CHANGE))
ma->ma_attr_flags |= MDS_PERM_BYPASS | MDS_SOM;
rc = mdt_attr_set(info, mo, rr->rr_flags);
if (rc)
GOTO(out_put, rc);
- if (info->mti_epoch && (info->mti_epoch->flags & MF_SOM_CHANGE)) {
+ if (info->mti_ioepoch && (info->mti_ioepoch->flags & MF_SOM_CHANGE)) {
LASSERT(mdt_conn_flags(info) & OBD_CONNECT_SOM);
- LASSERT(info->mti_epoch);
+ LASSERT(info->mti_ioepoch);
spin_lock(&med->med_open_lock);
/* Size-on-MDS Update. Find and free mfd. */
- mfd = mdt_handle2mfd(info, &info->mti_epoch->handle);
+ mfd = mdt_handle2mfd(info, &info->mti_ioepoch->handle);
if (mfd == NULL) {
spin_unlock(&med->med_open_lock);
CDEBUG(D_INODE | D_ERROR, "no handle for file close: "
"fid = "DFID": cookie = "LPX64"\n",
PFID(info->mti_rr.rr_fid1),
- info->mti_epoch->handle.cookie);
+ info->mti_ioepoch->handle.cookie);
GOTO(out_put, rc = -ESTALE);
}
LASSERT(mfd->mfd_mode == FMODE_SOM);
- LASSERT(!(info->mti_epoch->flags & MF_EPOCH_CLOSE));
+ LASSERT(!(info->mti_ioepoch->flags & MF_EPOCH_CLOSE));
class_handle_unhash(&mfd->mfd_handle);
list_del_init(&mfd->mfd_list);
EXPORT_SYMBOL(RMF_QUNIT_DATA);
const struct req_msg_field RMF_MDT_EPOCH =
- DEFINE_MSGF("mdt_epoch", 0,
- sizeof(struct mdt_epoch), lustre_swab_mdt_epoch, NULL);
+ DEFINE_MSGF("mdt_ioepoch", 0,
+ sizeof(struct mdt_ioepoch), lustre_swab_mdt_ioepoch, NULL);
EXPORT_SYMBOL(RMF_MDT_EPOCH);
const struct req_msg_field RMF_PTLRPC_BODY =
__swab32s (&o->o_nlink);
__swab32s (&o->o_generation);
__swab32s (&o->o_misc);
- __swab32s (&o->o_easize);
- __swab32s (&o->o_mds);
+ __swab64s (&o->o_ioepoch);
__swab32s (&o->o_stripe_idx);
__swab32s (&o->o_padding_1);
/* o_inline is opaque */
__swab32s (&b->padding_4);
}
-void lustre_swab_mdt_epoch (struct mdt_epoch *b)
+void lustre_swab_mdt_ioepoch (struct mdt_ioepoch *b)
{
/* handle is opaque */
__swab64s (&b->ioepoch);
EXPORT_SYMBOL(lustre_swab_mds_status_req);
EXPORT_SYMBOL(lustre_swab_mds_body);
EXPORT_SYMBOL(lustre_swab_mdt_body);
-EXPORT_SYMBOL(lustre_swab_mdt_epoch);
+EXPORT_SYMBOL(lustre_swab_mdt_ioepoch);
EXPORT_SYMBOL(lustre_swab_obd_quotactl);
EXPORT_SYMBOL(lustre_swab_mds_remote_perm);
EXPORT_SYMBOL(lustre_swab_mdt_remote_perm);
(long long)(int)offsetof(struct obdo, o_misc));
LASSERTF((int)sizeof(((struct obdo *)0)->o_misc) == 4, " found %lld\n",
(long long)(int)sizeof(((struct obdo *)0)->o_misc));
- LASSERTF((int)offsetof(struct obdo, o_easize) == 112, " found %lld\n",
- (long long)(int)offsetof(struct obdo, o_easize));
- LASSERTF((int)sizeof(((struct obdo *)0)->o_easize) == 4, " found %lld\n",
- (long long)(int)sizeof(((struct obdo *)0)->o_easize));
- LASSERTF((int)offsetof(struct obdo, o_mds) == 116, " found %lld\n",
- (long long)(int)offsetof(struct obdo, o_mds));
- LASSERTF((int)sizeof(((struct obdo *)0)->o_mds) == 4, " found %lld\n",
- (long long)(int)sizeof(((struct obdo *)0)->o_mds));
+ LASSERTF((int)offsetof(struct obdo, o_ioepoch) == 112, " found %lld\n",
+ (long long)(int)offsetof(struct obdo, o_ioepoch));
+ LASSERTF((int)sizeof(((struct obdo *)0)->o_ioepoch) == 8, " found %lld\n",
+ (long long)(int)sizeof(((struct obdo *)0)->o_ioepoch));
LASSERTF((int)offsetof(struct obdo, o_stripe_idx) == 120, " found %lld\n",
(long long)(int)offsetof(struct obdo, o_stripe_idx));
LASSERTF((int)sizeof(((struct obdo *)0)->o_stripe_idx) == 4, " found %lld\n",
#define lustre_swab_lu_seq_range NULL
#define lustre_swab_md_fld NULL
#define lustre_swab_mdt_body NULL
-#define lustre_swab_mdt_epoch NULL
+#define lustre_swab_mdt_ioepoch NULL
#define lustre_swab_ptlrpc_body NULL
#define lustre_swab_obd_statfs NULL
#define lustre_swab_connect NULL
CHECK_MEMBER(obdo, o_nlink);
CHECK_MEMBER(obdo, o_generation);
CHECK_MEMBER(obdo, o_misc);
- CHECK_MEMBER(obdo, o_easize);
- CHECK_MEMBER(obdo, o_mds);
+ CHECK_MEMBER(obdo, o_ioepoch);
CHECK_MEMBER(obdo, o_stripe_idx);
CHECK_MEMBER(obdo, o_padding_1);
CHECK_MEMBER(obdo, o_handle);
(long long)(int)offsetof(struct obdo, o_misc));
LASSERTF((int)sizeof(((struct obdo *)0)->o_misc) == 4, " found %lld\n",
(long long)(int)sizeof(((struct obdo *)0)->o_misc));
- LASSERTF((int)offsetof(struct obdo, o_easize) == 112, " found %lld\n",
- (long long)(int)offsetof(struct obdo, o_easize));
- LASSERTF((int)sizeof(((struct obdo *)0)->o_easize) == 4, " found %lld\n",
- (long long)(int)sizeof(((struct obdo *)0)->o_easize));
- LASSERTF((int)offsetof(struct obdo, o_mds) == 116, " found %lld\n",
- (long long)(int)offsetof(struct obdo, o_mds));
- LASSERTF((int)sizeof(((struct obdo *)0)->o_mds) == 4, " found %lld\n",
- (long long)(int)sizeof(((struct obdo *)0)->o_mds));
+ LASSERTF((int)offsetof(struct obdo, o_ioepoch) == 112, " found %lld\n",
+ (long long)(int)offsetof(struct obdo, o_ioepoch));
+ LASSERTF((int)sizeof(((struct obdo *)0)->o_ioepoch) == 8, " found %lld\n",
+ (long long)(int)sizeof(((struct obdo *)0)->o_ioepoch));
LASSERTF((int)offsetof(struct obdo, o_stripe_idx) == 120, " found %lld\n",
(long long)(int)offsetof(struct obdo, o_stripe_idx));
LASSERTF((int)sizeof(((struct obdo *)0)->o_stripe_idx) == 4, " found %lld\n",