}
static int cml_attr_set(const struct lu_context *ctx, struct md_object *mo,
- const struct lu_attr *attr)
+ struct md_attr *attr)
{
int rc;
ENTRY;
}
static int cmr_attr_set(const struct lu_context *ctx, struct md_object *mo,
- const struct lu_attr *attr)
+ struct md_attr *attr)
{
RETURN(-EFAULT);
}
int (*moo_attr_get)(const struct lu_context *ctxt, struct md_object *dt,
struct md_attr *attr);
int (*moo_attr_set)(const struct lu_context *ctxt, struct md_object *dt,
- const struct lu_attr *attr);
+ struct md_attr *attr);
int (*moo_xattr_get)(const struct lu_context *ctxt,
struct md_object *obj,
}
static inline int mo_attr_set(const struct lu_context *cx, struct md_object *m,
- const struct lu_attr *at)
+ struct md_attr *at)
{
LASSERT(m->mo_ops->moo_attr_set);
return m->mo_ops->moo_attr_set(cx, m, at);
if (rc == 0) {
LASSERT((ma->ma_attr.la_mode & S_IFMT) ==
(obj->mo_lu.lo_header->loh_attr & S_IFMT));
- ma->ma_valid |= MA_INODE;
+ ma->ma_valid = MA_INODE;
/* get LOV EA also */
if ((S_ISREG(ma->ma_attr.la_mode)
|| S_ISDIR(ma->ma_attr.la_mode))
&& ma->ma_lmm != 0 && ma->ma_lmm_size > 0) {
- rc = mdd_get_md(ctxt, obj, ma->ma_lmm,&ma->ma_lmm_size);
+ rc = mdd_get_md(ctxt, obj, ma->ma_lmm, &ma->ma_lmm_size);
if (rc > 0) {
ma->ma_valid |= MA_LOV;
rc = 0;
RETURN(rc);
}
-static int __mdd_attr_set(const struct lu_context *ctxt, struct md_object *obj,
+static int __mdd_attr_set(const struct lu_context *ctxt, struct mdd_object *o,
const struct lu_attr *attr, struct thandle *handle)
{
struct dt_object *next;
- LASSERT(lu_object_exists(ctxt, &obj->mo_lu));
- next = mdd_object_child(md2mdd_obj(obj));
+ LASSERT(lu_object_exists(ctxt, mdd2lu_obj(o)));
+ next = mdd_object_child(o);
return next->do_ops->do_attr_set(ctxt, next, attr, handle);
}
+static int __mdd_xattr_set(const struct lu_context *ctxt, struct mdd_object *o,
+ const void *buf, int buf_len, const char *name,
+ int fl, struct thandle *handle)
+{
+ struct dt_object *next;
+
+ LASSERT(lu_object_exists(ctxt, mdd2lu_obj(o)));
+ next = mdd_object_child(o);
+ return next->do_ops->do_xattr_set(ctxt, next, buf, buf_len, name, fl,
+ handle);
+}
+
+
+/* set attr and LOV EA at once, return updated attr */
static int mdd_attr_set(const struct lu_context *ctxt,
- struct md_object *obj, const struct lu_attr *attr)
+ struct md_object *obj, struct md_attr *ma)
{
struct mdd_object *mdo = md2mdd_obj(obj);
struct mdd_device *mdd = mdo2mdd(obj);
RETURN(PTR_ERR(handle));
mdd_lock(ctxt, mdo, DT_WRITE_LOCK);
- rc = __mdd_attr_set(ctxt, obj, attr, handle);
- mdd_unlock(ctxt, mdo, DT_WRITE_LOCK);
+ rc = __mdd_attr_set(ctxt, md2mdd_obj(obj), &ma->ma_attr, handle);
+ if (rc == 0 && (ma->ma_valid & MA_LOV)) {
+ /* set LOV ea now */
+ rc = __mdd_xattr_set(ctxt, md2mdd_obj(obj),
+ ma->ma_lmm, ma->ma_lmm_size,
+ XATTR_NAME_LOV, 0, handle);
+ }
+ /* XXX: llog cancel cookie? */
+
+ if (rc == 0)
+ rc = mdd_attr_get(ctxt, obj, ma);
+
+ mdd_unlock(ctxt, mdo, DT_WRITE_LOCK);
mdd_trans_stop(ctxt, mdd, handle);
RETURN(rc);
}
-static int __mdd_xattr_set(const struct lu_context *ctxt,struct mdd_device *mdd,
- struct mdd_object *obj, const void *buf,
- int buf_len, const char *name, int fl,
- struct thandle *handle)
-{
- struct dt_object *next;
-
- LASSERT(lu_object_exists(ctxt, mdd2lu_obj(obj)));
- next = mdd_object_child(obj);
- return next->do_ops->do_xattr_set(ctxt, next, buf, buf_len, name, fl,
- handle);
-}
-
int mdd_xattr_set_txn(const struct lu_context *ctxt, struct md_object *obj,
const void *buf, int buf_len, const char *name, int fl,
struct thandle *handle)
{
struct mdd_object *mdo = md2mdd_obj(obj);
- struct mdd_device *mdd = mdo2mdd(obj);
int rc;
ENTRY;
-
mdd_lock(ctxt, mdo, DT_WRITE_LOCK);
- rc = __mdd_xattr_set(ctxt, mdd, md2mdd_obj(obj), buf, buf_len, name,
+ rc = __mdd_xattr_set(ctxt, md2mdd_obj(obj), buf, buf_len, name,
fl, handle);
mdd_unlock(ctxt, mdo, DT_WRITE_LOCK);
mdt_pack_attr2body(repbody, la, mdt_object_fid(o));
if (mdt_body_has_lov(la, reqbody)) {
- if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) {
+ if (/*ma->ma_lmm_size && */(ma->ma_valid & MA_LOV)) {
+ LASSERT(ma->ma_lmm_size);
CDEBUG(D_INODE, "packing ea for "DFID3"\n",
PFID3(mdt_object_fid(o)));
mdt_dump_lmm(D_INFO, ma->ma_lmm);
} else {
repbody->valid |= OBD_MD_LINKNAME;
repbody->eadatasize = rc + 1;
- ((char*)ma->ma_lmm)[rc] = 0; /* NULL terminate */
+ ((char*)ma->ma_lmm)[rc] = 0; /* NULL terminate */
CDEBUG(D_INODE, "symlink dest %s, len = %d\n",
- (char*)buffer, rc);
+ (char*)ma->ma_lmm, rc);
rc = 0;
}
}
&RMF_MDT_BODY);
if (ma->ma_valid & MA_INODE)
mdt_pack_attr2body(repbody, la, mdt_object_fid(mo));
- if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) {
+ if (/*ma->ma_lmm_size && */(ma->ma_valid & MA_LOV)) {
+ LASSERT(ma->ma_lmm_size);
mdt_dump_lmm(D_INFO, ma->ma_lmm);
repbody->eadatasize = ma->ma_lmm_size;
repbody->valid |= OBD_MD_FLEASIZE;
}
- if (ma->ma_cookie_size && ma->ma_valid & MA_COOKIE)
+ if (ma->ma_cookie_size && (ma->ma_valid & MA_COOKIE))
repbody->valid |= OBD_MD_FLCOOKIE;
}
static int mdt_setattr_unpack(struct mdt_thread_info *info)
{
struct mdt_rec_setattr *rec;
- struct lu_attr *attr = &info->mti_attr.ma_attr;
+ struct md_attr *ma = &info->mti_attr;
+ struct lu_attr *la = &ma->ma_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct req_capsule *pill = &info->mti_pill;
ENTRY;
RETURN(-EFAULT);
rr->rr_fid1 = &rec->sa_fid;
- attr->la_valid = rec->sa_valid;
- attr->la_mode = rec->sa_mode;
- attr->la_uid = rec->sa_uid;
- attr->la_gid = rec->sa_gid;
- attr->la_size = rec->sa_size;
- attr->la_flags = rec->sa_attr_flags;
- attr->la_ctime = rec->sa_ctime;
- attr->la_atime = rec->sa_atime;
- attr->la_mtime = rec->sa_mtime;
+ la->la_valid = rec->sa_valid;
+ la->la_mode = rec->sa_mode;
+ la->la_uid = rec->sa_uid;
+ la->la_gid = rec->sa_gid;
+ la->la_size = rec->sa_size;
+ la->la_flags = rec->sa_attr_flags;
+ la->la_ctime = rec->sa_ctime;
+ la->la_atime = rec->sa_atime;
+ la->la_mtime = rec->sa_mtime;
+ ma->ma_valid = MA_INODE;
if (req_capsule_field_present(pill, &RMF_EADATA)) {
- rr->rr_eadata = req_capsule_client_get(pill, &RMF_EADATA);
- rr->rr_eadatalen = req_capsule_get_size(pill, &RMF_EADATA,
- RCL_CLIENT);
+ ma->ma_lmm = req_capsule_client_get(pill, &RMF_EADATA);
+ ma->ma_lmm_size = req_capsule_get_size(pill, &RMF_EADATA,
+ RCL_CLIENT);
+ ma->ma_valid |= MA_LOV;
}
if (req_capsule_field_present(pill, &RMF_LOGCOOKIES)) {
- rr->rr_logcookies = req_capsule_client_get(pill,
- &RMF_LOGCOOKIES);
- rr->rr_logcookielen = req_capsule_get_size(pill,
- &RMF_LOGCOOKIES,
- RCL_CLIENT);
+ ma->ma_cookie = req_capsule_client_get(pill,
+ &RMF_LOGCOOKIES);
+ ma->ma_cookie_size = req_capsule_get_size(pill,
+ &RMF_LOGCOOKIES,
+ RCL_CLIENT);
+ ma->ma_valid |= MA_COOKIE;
}
RETURN(0);
if (rc)
RETURN(rc);
}
+
isreg = S_ISREG(la->la_mode);
isdir = S_ISDIR(la->la_mode);
islnk = S_ISLNK(la->la_mode);
if (ma->ma_valid & MA_INODE)
mdt_pack_attr2body(repbody, la, mdt_object_fid(o));
+ /* this check need to return the exists object's fid back, so it is done
+ * here, after preparing the reply */
+ if (!created && (flags & MDS_OPEN_EXCL) && (flags & MDS_OPEN_CREAT))
+ RETURN (-EEXIST);
+
/* if we are following a symlink, don't open
* do not return open handle for special nodes as client required
*/
info->mti_trans_flags |= MDT_NONEED_TANSNO;
RETURN(0);
}
- /* FIXME:maybe this can be done earlier? */
+ /* This can't be done earlier, we need to return reply body */
if (isdir) {
if (flags & (MDS_OPEN_CREAT | FMODE_WRITE)) {
/* we are trying to create or
} else if (flags & MDS_OPEN_DIRECTORY)
RETURN(-ENOTDIR);
+#if 0
if ((isreg) && !(ma->ma_valid & MA_LOV)) {
/*No EA, check whether it is will set regEA and dirEA
*since in above attr get, these size might be zero,
RETURN(rc);
*/
}
-
+#endif
CDEBUG(D_INODE, "after open, ma_valid bit = "LPX64" lmm_size = %d\n",
ma->ma_valid, ma->ma_lmm_size);
repbody->eadatasize = 0;
repbody->aclsize = 0;
- if (ma->ma_lmm_size && ma->ma_valid & MA_LOV) {
+ if (/*ma->ma_lmm_size && */ma->ma_valid & MA_LOV) {
+ LASSERT(ma->ma_lmm_size);
repbody->eadatasize = ma->ma_lmm_size;
if (isdir)
repbody->valid |= OBD_MD_FLDIREA;
/* new object will be created. see the following */
} else {
intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
- if ((la->la_flags & MDS_OPEN_EXCL &&
- la->la_flags & MDS_OPEN_CREAT))
- GOTO(out_parent, result = -EEXIST);
+ /* check for O_EXCL is moved to the mdt_mfd_open, we need to
+ * return FID back in that case */
}
+
child = mdt_object_find(info->mti_ctxt, mdt, child_fid);
if (IS_ERR(child))
GOTO(out_parent, result = PTR_ERR(child));
created = 1;
}
- /* Open it now. */
+ /* Try to open it now. */
result = mdt_mfd_open(info, parent, child, la->la_flags, created);
GOTO(finish_open, result);
o = mfd->mfd_object;
ma->ma_lmm = req_capsule_server_get(&info->mti_pill,
- &RMF_MDT_MD);
+ &RMF_MDT_MD);
ma->ma_lmm_size = req_capsule_get_size(&info->mti_pill,
&RMF_MDT_MD, RCL_SERVER);
rc = mo_attr_get(info->mti_ctxt, mdt_object_child(o), ma);
if (lu_object_exists(info->mti_ctxt, &mo->mot_obj.mo_lu) <= 0)
GOTO(out_unlock, rc = -ENOENT);
- rc = mo_attr_set(info->mti_ctxt, next, attr);
- if (rc != 0)
- GOTO(out_unlock, rc);
-
- rc = mo_attr_get(info->mti_ctxt, next, &info->mti_attr);
+ /* all attrs are packed into mti_attr in unpack_setattr */
+ rc = mo_attr_set(info->mti_ctxt, next, &info->mti_attr);
if (rc != 0)
GOTO(out_unlock, rc);
if (valid & (ATTR_ATIME | ATTR_ATIME_SET))
repbody->valid |= OBD_MD_FLATIME;
*/
- /* FIXME: I have to combine the attr_set & xattr_set into one single
- transaction. How can I?
- */
-
- if (rr->rr_eadatalen > 0)
- rc = mo_xattr_set(info->mti_ctxt, next,
- rr->rr_eadata, rr->rr_eadatalen,
- XATTR_NAME_LOV, 0);
-
- /* FIXME & TODO Please deal with logcookies here*/
GOTO(out_unlock, rc);
out_unlock:
mdt_object_unlock_put(info, mo, lh, rc);