(2)disabled mdt_fs operation, waiting for read & write of osd.
__u32 la_flags; /* object flags */
__u32 la_nlink; /* number of persistent references to this
* object */
-#ifdef MDT_CODE
__u32 la_rdev; /* real device */
- __u64 la_valid; /* real device */
-#endif
+ __u64 la_valid; /* valid bits */
};
mdt->mdt_last = NULL;
}
} else {
- CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc);
rc = PTR_ERR(last);
+ CERROR("cannot open %s: rc = %d\n", LAST_RCVD, rc);
}
return rc;
}
* Author: Phil Schwan <phil@clusterfs.com>
* Author: Mike Shaver <shaver@clusterfs.com>
* Author: Nikita Danilov <nikita@clusterfs.com>
+ * Author: Huang Hua <huanghua@clusterfs.com>
*
* This file is part of the Lustre file system, http://www.lustre.org
* Lustre is a trademark of Cluster File Systems, Inc.
b->nlink = attr->la_nlink;
}
-static int mdt_getattr_pack_msg(struct mdt_thread_info *info)
+static int mdt_getattr_pack_msg(struct mdt_thread_info *info,
+ struct mdt_object *o)
{
-#ifdef MDT_CODE
const struct mdt_body *body = info->mti_body;
struct req_capsule *pill = &info->mti_pill;
struct ptlrpc_request *req = mdt_info_req(info);
-#endif
- struct md_object *next = mdt_object_child(info->mti_object);
+ struct md_object *next = mdt_object_child(o);
struct lu_attr *la = &info->mti_attr;
int rc;
ENTRY;
if (rc){
RETURN(rc);
}
-#ifdef MDT_CODE
if ((S_ISREG(la->la_mode) && (body->valid & OBD_MD_FLEASIZE)) ||
(S_ISDIR(la->la_mode) && (body->valid & OBD_MD_FLDIREA))) {
rc = mo_xattr_get(info->mti_ctxt, next, NULL, 0, "lov");
CDEBUG(D_INODE, "got %d bytes MD data for object "DFID3"\n",
- rc, PFID3(mdt_object_fid(info->mti_object)));
+ rc, PFID3(mdt_object_fid(o)));
if (rc < 0) {
- if (rc != -ENODATA) {
+ if (rc != -ENODATA && rc != -EOPNOTSUPP) {
CERROR("error getting MD "DFID3": rc = %d\n",
- PFID3(mdt_object_fid(info->mti_object)),
+ PFID3(mdt_object_fid(o)),
rc);
RETURN(rc);
}
- req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, 0);
+ rc = 0;
} else if (rc > MAX_MD_SIZE) {
- req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, 0);
CERROR("MD size %d larger than maximum possible %u\n",
rc, MAX_MD_SIZE);
- } else {
- req_capsule_set_size(pill, &RMF_MDT_MD,
- RCL_SERVER, rc);
+ rc = 0;
}
} else if (S_ISLNK(la->la_mode) && (body->valid & OBD_MD_LINKNAME)) {
- /* XXX:It also uese the mdt_md to hold symname.
+ /* XXX:It also uses the mdt_md to hold symname.
* Are there any problem? will be swabbed? hope not.
*/
- int len = min_t(int, la->la_size + 1, body->eadatasize);
- req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, len);
+ rc = min_t(int, la->la_size + 1, body->eadatasize);
}
+ req_capsule_set_size(pill, &RMF_MDT_MD, RCL_SERVER, rc);
#ifdef CONFIG_FS_POSIX_ACL
if ((req->rq_export->exp_connect_flags & OBD_CONNECT_ACL) &&
rc = mo_xattr_get(info->mti_ctxt, next,
NULL, 0, XATTR_NAME_ACL_ACCESS);
if (rc < 0) {
- if (rc != -ENODATA) {
+ if (rc != -ENODATA && rc != -EOPNOTSUPP) {
CERROR("got acl size: %d\n", rc);
RETURN(rc);
}
- req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, 0);
- } else
- req_capsule_set_size(pill, &RMF_EADATA,
- RCL_SERVER, rc);
+ rc = 0;
+ }
+ req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc);
}
#endif
-#endif
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETATTR_PACK)) {
CERROR("failed MDT_GETATTR_PACK test\n");
RETURN(-ENOMEM);
rc = req_capsule_pack(&info->mti_pill);
if (rc) {
CERROR("lustre_pack_reply failed: rc %d\n", rc);
- RETURN(rc);
}
- RETURN(0);
+ RETURN(rc);
}
-static int mdt_getattr_internal(struct mdt_thread_info *info)
+static int mdt_getattr_internal(struct mdt_thread_info *info,
+ struct mdt_object *o)
{
- struct md_object *next = mdt_object_child(info->mti_object);
+ struct md_object *next = mdt_object_child(o);
const struct mdt_body *reqbody = info->mti_body;
struct mdt_body *repbody;
struct lu_attr *la = &info->mti_attr;
int rc;
-#ifdef MDT_CODE
void *buffer;
int length;
struct ptlrpc_request *req = mdt_info_req(info);
-#endif
ENTRY;
rc = mo_attr_get(info->mti_ctxt, next, la);
repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
mdt_pack_attr2body(repbody, la);
- repbody->fid1 = *mdt_object_fid(info->mti_object);
+ repbody->fid1 = *mdt_object_fid(o);
repbody->valid |= OBD_MD_FLID;
-#ifdef MDT_CODE
buffer = req_capsule_server_get(&info->mti_pill, &RMF_MDT_MD);
length = req_capsule_get_size(&info->mti_pill, &RMF_MDT_MD,
RCL_SERVER);
buffer, length, XATTR_NAME_ACL_ACCESS);
if (rc < 0) {
- if (rc != -ENODATA) {
+ if (rc != -ENODATA && rc != -EOPNOTSUPP) {
CERROR("got acl size: %d\n", rc);
RETURN(rc);
}
repbody->valid |= OBD_MD_FLACL;
}
#endif
-#endif
RETURN(0);
}
CERROR(LUSTRE_MDT0_NAME": getattr lustre_pack_reply failed\n");
result = -ENOMEM;
} else {
- result = mdt_getattr_pack_msg(info);
+ result = mdt_getattr_pack_msg(info, info->mti_object);
if (result == 0)
- result = mdt_getattr_internal(info);
+ result = mdt_getattr_internal(info, info->mti_object);
}
RETURN(result);
}
/*step 2: lookup child's fid by name */
result = mdo_lookup(info->mti_ctxt, next, name, &child_fid);
+ if (result == -EREMOTE) {
+ /* This object is located on remote node */
+ req_capsule_set_size(&info->mti_pill, &RMF_MDT_MD,
+ RCL_SERVER, 0);
+#ifdef CONFIG_FS_POSIX_ACL
+ req_capsule_set_size(&info->mti_pill, &RMF_EADATA,
+ RCL_SERVER, 0);
+#endif
+ result = req_capsule_pack(&info->mti_pill);
+ if (result == 0) {
+ struct mdt_body *repbody;
+ repbody = req_capsule_server_get(&info->mti_pill,
+ &RMF_MDT_BODY);
+ repbody->fid1 = child_fid;
+ }
+ }
if (result != 0)
GOTO(out_parent, result);
GOTO(out_parent, result = PTR_ERR(child));
/* finally, we can get attr for child. */
- result = mdt_getattr_pack_msg(info);
+ result = mdt_getattr_pack_msg(info, child);
if (result == 0) {
- result = mdt_getattr_internal(info);
+ result = mdt_getattr_internal(info, child);
}
if (result != 0)
mdt_object_unlock(ns, child, lhc);
rc = mdt_reint_unpack(info, op);
if (rc == 0) {
- struct mdt_reint_reply *rep;
-
- rep = &info->mti_reint_rep;
- rep->mrr_body = req_capsule_server_get(&info->mti_pill,
- &RMF_MDT_BODY);
- if (rep->mrr_body != NULL)
- /*
- * XXX fill other fields in @rep with pointers to
- * reply buffers.
- */
- rc = mdt_reint_rec(info);
- else
- rc = -EFAULT;
+ rc = mdt_reint_rec(info);
}
RETURN(rc);
intent_set_disposition(ldlm_rep, DISP_LOOKUP_EXECD);
if (rc) {
- intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
+ if (rc == -EREMOTE)
+ intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
+ else
+ intent_set_disposition(ldlm_rep, DISP_LOOKUP_NEG);
if (ldlm_rep)
ldlm_rep->lock_policy_res2 = 0;
RETURN(ELDLM_LOCK_ABORTED);
}
- else
- intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
+ intent_set_disposition(ldlm_rep, DISP_LOOKUP_POS);
new_lock = ldlm_handle2lock(&lhc.mlh_lh);
if (new_lock == NULL && (flags & LDLM_FL_INTENT_ONLY))
ENTRY;
+/*
mdt_fs_cleanup(ctx, m);
-
+*/
mdt_stop_ptlrpc_service(m);
/* finish the stack */
m->mdt_max_mdsize = MAX_MD_SIZE;
m->mdt_max_cookiesize = sizeof(struct llog_cookie);
+ m->mdt_flags = 0;
+
+ /* Temporary. should parse mount option. */
+ m->mdt_opts.mo_user_xattr = 0;
+ m->mdt_opts.mo_acl = 0;
+
+
OBD_ALLOC_PTR(s);
if (s == NULL)
RETURN(-ENOMEM);
rc = mdt_start_ptlrpc_service(m);
if (rc)
GOTO(err_free_ns, rc);
-
+/* TODO: wait for read & write
rc = mdt_fs_setup(ctx, m);
if (rc)
GOTO(err_stop_service, rc);
-
+*/
RETURN(0);
+/*
err_stop_service:
mdt_stop_ptlrpc_service(m);
+*/
err_free_ns:
ldlm_namespace_free(m->mdt_namespace, 0);
m->mdt_namespace = NULL;
lu_site_fini(s);
err_free_site:
OBD_FREE_PTR(s);
+ md_device_fini(&m->mdt_md_dev);
return (rc);
}
RETURN(rc);
}
+/* FIXME: Can we avoid using these two interfaces? */
static int mdt_init_export(struct obd_export *exp)
{
struct mdt_export_data *med = &exp->exp_mdt_data;
};
MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");
-MODULE_DESCRIPTION("Lustre Meta-data Target Prototype ("LUSTRE_MDT0_NAME")");
+MODULE_DESCRIPTION("Lustre Meta-data Target ("LUSTRE_MDT0_NAME")");
MODULE_LICENSE("GPL");
CFS_MODULE_PARM(mdt_num_threads, "ul", ulong, 0444,
"number of mdt service threads to start");
-cfs_module(mdt, "0.0.4", mdt_mod_init, mdt_mod_exit);
+cfs_module(mdt, "0.1.0", mdt_mod_init, mdt_mod_exit);
};
-struct mdt_reint_reply {
- struct mdt_body *mrr_body;
- struct lov_mds_md *mrr_md;
- struct llog_cookie *mrr_cookie;
-};
#define XATTR_NAME_ACL_ACCESS "system.posix_acl_access"
* frequent.
*/
struct kstatfs mti_sfs;
- struct mdt_reint_reply mti_reint_rep;
};
static inline struct md_device_operations *mdt_child_ops(struct mdt_device * m)
/* unpacking */
static int mdt_setattr_unpack(struct mdt_thread_info *info)
{
-#ifdef MDT_CODE
struct mdt_rec_setattr *rec;
struct lu_attr *attr = &info->mti_attr;
struct mdt_reint_record *rr = &info->mti_rr;
}
RETURN(0);
-#endif
- ENTRY;
- RETURN(-EOPNOTSUPP);
}
static int mdt_create_unpack(struct mdt_thread_info *info)
rr->rr_fid2 = &rec->cr_fid2;
attr->la_mode = rec->cr_mode;
rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
-#ifdef MDT_CODE
attr->la_rdev = rec->cr_rdev;
attr->la_uid = rec->cr_fsuid;
attr->la_gid = rec->cr_fsgid;
attr->la_flags = rec->cr_flags;
attr->la_ctime = rec->cr_time;
+ attr->la_mtime = rec->cr_time;
if (req_capsule_field_present(pill, &RMF_SYMTGT))
rr->rr_tgt = req_capsule_client_get(pill, &RMF_SYMTGT);
-#endif
} else
result = -EFAULT;
RETURN(result);
static int mdt_link_unpack(struct mdt_thread_info *info)
{
-#ifdef MDT_CODE
struct mdt_rec_link *rec;
struct lu_attr *attr = &info->mti_attr;
struct mdt_reint_record *rr = &info->mti_rr;
rr->rr_fid1 = &rec->lk_fid1;
rr->rr_fid2 = &rec->lk_fid2;
attr->la_ctime = rec->lk_time;
+ attr->la_mtime = rec->lk_time;
rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
if (rr->rr_name == NULL)
RETURN(-EFAULT);
RETURN(0);
-#endif
- ENTRY;
- RETURN(-EOPNOTSUPP);
}
static int mdt_unlink_unpack(struct mdt_thread_info *info)
{
-#ifdef MDT_CODE
struct mdt_rec_unlink *rec;
struct lu_attr *attr = &info->mti_attr;
struct mdt_reint_record *rr = &info->mti_rr;
rr->rr_fid1 = &rec->ul_fid1;
rr->rr_fid2 = &rec->ul_fid2;
attr->la_ctime = rec->ul_time;
+ attr->la_mtime = rec->ul_time;
attr->la_mode = rec->ul_mode;
rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
if (rr->rr_name == NULL)
RETURN(-EFAULT);
RETURN(0);
-#endif
- ENTRY;
- RETURN(-EOPNOTSUPP);
}
static int mdt_rename_unpack(struct mdt_thread_info *info)
{
-#ifdef MDT_CODE
struct mdt_rec_rename *rec;
struct lu_attr *attr = &info->mti_attr;
struct mdt_reint_record *rr = &info->mti_rr;
rr->rr_fid1 = &rec->rn_fid1;
rr->rr_fid2 = &rec->rn_fid2;
attr->la_ctime = rec->rn_time;
+ attr->la_mtime = rec->rn_time;
rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
if (rr->rr_name == NULL)
if (rr->rr_tgt == NULL)
RETURN(-EFAULT);
RETURN(0);
-#endif
-
- ENTRY;
- RETURN(-EOPNOTSUPP);
}
static int mdt_open_unpack(struct mdt_thread_info *info)
struct mdt_object *parent;
struct mdt_object *child;
struct mdt_lock_handle *lh;
- struct mdt_body *repbody = info->mti_reint_rep.mrr_body;
+ struct mdt_body *repbody;
struct lu_attr *attr = &info->mti_attr;
struct mdt_reint_record *rr = &info->mti_rr;
int rc;
ENTRY;
+ repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+
lh = &info->mti_lh[MDT_LH_PARENT];
lh->mlh_mode = LCK_PW;
RETURN(rc);
}
-#if 0
-static int mdt_md_mkdir(struct mdt_thread_info *info)
-{
- struct mdt_device *mdt = info->mti_mdt;
- struct mdt_object *parent;
- struct mdt_object *child;
- struct mdt_lock_handle *lh;
-
- int result;
-
- lh = &info->mti_lh[MDT_LH_PARENT];
- lh->mlh_mode = LCK_PW;
-
- parent = mdt_object_find_lock(info->mti_ctxt, mdt, info->mti_rr.rr_fid1,
- lh, MDS_INODELOCK_UPDATE);
- if (IS_ERR(parent))
- return PTR_ERR(parent);
-
- child = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid2);
- if (!IS_ERR(child)) {
- struct md_object *next = mdt_object_child(parent);
-
- result = mdo_create(info->mti_ctxt, next, info->mti_rr.rr_name,
- mdt_object_child(child), &info->mti_attr);
- mdt_object_put(info->mti_ctxt, child);
- } else
- result = PTR_ERR(child);
- mdt_object_unlock(mdt->mdt_namespace, parent, lh);
- mdt_object_put(info->mti_ctxt, parent);
- return result;
-}
-#endif
-
/* partial request to create object only */
static int mdt_md_mkobj(struct mdt_thread_info *info)
{
struct mdt_device *mdt = info->mti_mdt;
struct mdt_object *o;
- struct mdt_body *repbody = info->mti_reint_rep.mrr_body;
+ struct mdt_body *repbody;
int rc;
-
ENTRY;
+ repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+
o = mdt_object_find(info->mti_ctxt, mdt, info->mti_rr.rr_fid1);
if (!IS_ERR(o)) {
struct md_object *next = mdt_object_child(o);
static int mdt_reint_setattr(struct mdt_thread_info *info)
{
-#ifdef MDT_CODE
struct lu_attr *attr = &info->mti_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct ptlrpc_request *req = mdt_info_req(info);
}
mdt_object_put(info->mti_ctxt, mo);
return (rc);
-#endif
- ENTRY;
- RETURN(-EOPNOTSUPP);
}
static int mdt_reint_unlink(struct mdt_thread_info *info)
{
-#ifdef MDT_CODE
- struct lu_attr *attr = &info->mti_attr;
struct mdt_reint_record *rr = &info->mti_rr;
struct ptlrpc_request *req = mdt_info_req(info);
struct mdt_object *mp;
if (IS_ERR(mc))
GOTO(out_unlock_parent, rc = PTR_ERR(mc));
- if (lu_object_assert_not_exists(info->mti_ctxt, &mc->mot_obj.mo_lu))
- GOTO(out_unlock_child, rc = -ENOENT);
-
/* NB: Be aware of Bug 2029 */
/*step 3: deal with orphan */
- /* If this is potentially the last reference to this inode, get the
- * OBD EA data first so the client can destroy OST objects. We
- * only do the object removal later if no open files/links remain. */
-
repbody = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
- rc = mo_attr_get(info->mti_ctxt, mdt_object_child(mc), attr);
- if (rc != 0)
- GOTO(out_unlock_child, rc);
-
- if (S_ISREG(attr->la_mode) && attr->la_nlink == 1) {
- /* && if opencount == 0*/
- /* see mds_reint */
- void * lmm = req_capsule_server_get(&info->mti_pill,
- &RMF_MDT_MD);
- int len = req_capsule_get_size(&info->mti_pill,
- &RMF_MDT_MD,
- RCL_SERVER);
- mdt_pack_attr2body(repbody, attr);
- repbody->fid1 = *mdt_object_fid(mc);
- repbody->valid |= OBD_MD_FLID;
-
- rc = mo_xattr_get(info->mti_ctxt, mdt_object_child(mc),
- lmm, len, "lov");
- if (rc < 0)
- GOTO(out_unlock_child, rc);
-
- if (S_ISDIR(attr->la_mode))
- repbody->valid |= OBD_MD_FLDIREA;
- else
- repbody->valid |= OBD_MD_FLEASIZE;
- repbody->eadatasize = rc;
- rc = 0;
- }
if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
GOTO(out_unlock_child, rc = -EROFS);
/*step 5: orphan handling & recovery issue */
if (rc == 0) {
+ /* If this is potentially the last reference to this inode, get the
+ * OBD EA data first so the client can destroy OST objects. We
+ * only do the object removal later if no open files/links remain. */
+
/* FIXME & TODO:
* 1. orphan handling here
* 2. Please deal with logcookies here */
mdt_object_unlock(info->mti_mdt->mdt_namespace, mp, lhp);
mdt_object_put(info->mti_ctxt, mp);
return rc;
-#endif
-
- ENTRY;
- RETURN(-EOPNOTSUPP);
}
static int mdt_reint_link(struct mdt_thread_info *info)
{
-#ifdef MDT_CODE
struct mdt_reint_record *rr = &info->mti_rr;
struct ptlrpc_request *req = mdt_info_req(info);
struct mdt_object *ms;
if (IS_ERR(mt))
GOTO(out_unlock_source, rc = PTR_ERR(mt));
- /* step 3: do some checking :TODO*/
- /* if isorphan(ms)
- * return -ENOENT
- */
-
if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
GOTO(out_unlock_target, rc = -EROFS);
rc = mdo_link(info->mti_ctxt, mdt_object_child(mt),
mdt_object_child(ms), rr->rr_name);
GOTO(out_unlock_target, rc);
+
out_unlock_target:
mdt_object_unlock(info->mti_mdt->mdt_namespace, mt, lht);
mdt_object_put(info->mti_ctxt, mt);
mdt_object_unlock(info->mti_mdt->mdt_namespace, ms, lhs);
mdt_object_put(info->mti_ctxt, ms);
return rc;
-#endif
-
- ENTRY;
- RETURN(-EOPNOTSUPP);
}
-#ifdef MDT_CODE
/* partial operation for rename */
static int mdt_reint_rename_tgt(struct mdt_thread_info *info)
{
ENTRY;
- DEBUG_REQ(D_INODE, req, "rename_tgr "DFID3" to "DFID3" %s",
+ DEBUG_REQ(D_INODE, req, "rename_tgt "DFID3" to "DFID3" %s",
PFID3(rr->rr_fid2),
PFID3(rr->rr_fid1), rr->rr_tgt);
rr->rr_tgt, &tgt_fid);
if (rc && rc != -ENOENT)
GOTO(out_unlock_tgtdir, rc);
+
+ if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
+ GOTO(out_unlock_tgt, rc = -EROFS);
if (rc == 0) {
lh_tgt = &info->mti_lh[MDT_LH_CHILD];
GOTO(out_unlock_tgtdir, rc = PTR_ERR(mtgt));
}
- if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
- GOTO(out_unlock_tgt, rc = -EROFS);
-
/* step 3: rename_tgt or name_insert */
if (mtgt)
rc = mdo_rename_tgt(info->mti_ctxt, mdt_object_child(mtgtdir),
else
rc = mdo_name_insert(info->mti_ctxt, mdt_object_child(mtgtdir),
rr->rr_tgt, rr->rr_fid2);
-
GOTO(out_unlock_tgt, rc);
+
out_unlock_tgt:
if (mtgt) {
mdt_object_unlock(ns, mtgt, lh_tgt);
out:
return rc;
}
-#endif
static int mdt_reint_rename(struct mdt_thread_info *info)
{
-#ifdef MDT_CODE
struct mdt_reint_record *rr = &info->mti_rr;
struct req_capsule *pill = &info->mti_pill;
struct ptlrpc_request *req = mdt_info_req(info);
ENTRY;
- DEBUG_REQ(D_INODE, req, "rename "DFID3"/%s to "DFID3" %s",
+ DEBUG_REQ(D_INODE, req, "rename "DFID3"/%s to "DFID3"/%s",
PFID3(rr->rr_fid1), rr->rr_tgt,
PFID3(rr->rr_fid2), rr->rr_name);
MDS_INODELOCK_UPDATE);
if (IS_ERR(mtgtdir))
GOTO(out_unlock_source, rc = PTR_ERR(mtgtdir));
-
/*step 3: find & lock the old object*/
rc = mdo_lookup(info->mti_ctxt, mdt_object_child(msrcdir),
if (rc && rc != -ENOENT)
GOTO(out_unlock_old, rc);
- /* NB: the new_fid may be zero at this moment*/
if (rc == 0) {
+ /* the new_fid should have been filled at this moment*/
lh_new.mlh_mode = LCK_EX;
mnew = mdt_object_find_lock(info->mti_ctxt, info->mti_mdt,
&new_fid, &lh_new,
GOTO(out_unlock_old, rc = PTR_ERR(mnew));
}
- /* step 5:TODO orphan handling on new object*/
- /* if isorphan(mnew) {...}
- */
+ /* step 5: dome some checking*/
if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
GOTO(out_unlock_new, rc = -EROFS);
mdt_object_child(mtgtdir), &old_fid,
rr->rr_name, mnew ? mdt_object_child(mnew): NULL,
rr->rr_tgt);
- GOTO(out_unlock_new, rc);
+ if (rc)
+ GOTO(out_unlock_new, rc);
+
+ /* step 7: TODO:check old object */
+ /* if (mold is orphan)
+ */
+
out_unlock_new:
if (mnew) {
mdt_object_unlock(ns, mnew, &lh_new);
mdt_object_put(info->mti_ctxt, msrcdir);
out:
return rc;
-#endif
-
-
- ENTRY;
- RETURN(-EOPNOTSUPP);
}
/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
* vim:expandtab:shiftwidth=8:tabstop=8:
*
- * linux/mdt/mdt_reint.c
- * Lustre Metadata Target (mdt) reintegration routines
+ * linux/mdt/mdt_xattr.c
+ * Lustre Metadata Target (mdt) extended attributes management.
*
* Copyright (C) 2002-2006 Cluster File Systems, Inc.
* Author: Peter Braam <braam@clusterfs.com>
/* return EADATA length to the caller. negative value means error */
static int mdt_getxattr_pack_reply(struct mdt_thread_info * info)
{
- char *xattr_name;
- int rc = -EOPNOTSUPP;
- int rc2;
struct req_capsule *pill = &info->mti_pill ;
struct ptlrpc_request *req = mdt_info_req(info);
+ char *xattr_name;
+ int rc;
/* Imagine how many bytes we need */
if (info->mti_body->valid & OBD_MD_FLXATTR) {
}
if (rc < 0) {
- if (rc != -ENODATA && rc != -EOPNOTSUPP)
+ if (rc != -ENODATA && rc != -EOPNOTSUPP) {
CWARN("get EA size error: %d\n", rc);
- /* return empty to client */
- req_capsule_extend(&info->mti_pill, &RQF_MDS_SETXATTR);
+ return rc;
+ }
+ rc = 0;
} else {
rc = min_t(int, info->mti_body->eadatasize, rc);
- req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc);
}
+ req_capsule_set_size(pill, &RMF_EADATA, RCL_SERVER, rc);
if (OBD_FAIL_CHECK(OBD_FAIL_MDS_GETXATTR_PACK)) {
CERROR("failed MDS_GETXATTR_PACK test\n");
return -ENOMEM;
}
- rc2 = req_capsule_pack(pill);
- if (rc2)
- return rc2;
+ rc = req_capsule_pack(pill);
return rc;
}
rc = mdt_getxattr_pack_reply(info);
if (rc < 0)
RETURN(rc);
- buf = req_capsule_server_get(&info->mti_pill,
- &RMF_EADATA);
- buflen = req_capsule_get_size(&info->mti_pill,
- &RMF_EADATA, RCL_SERVER);
- rep_body = req_capsule_server_get(&info->mti_pill,
- &RMF_MDT_BODY);
+ buf = req_capsule_server_get(&info->mti_pill, &RMF_EADATA);
+ rep_body = req_capsule_server_get(&info->mti_pill, &RMF_MDT_BODY);
+ buflen = req_capsule_get_size(&info->mti_pill, &RMF_EADATA, RCL_SERVER);
+ if (buflen == 0)
+ GOTO(no_xattr, rc = 0);
if (info->mti_body->valid & OBD_MD_FLXATTR) {
char *xattr_name = req_capsule_client_get(&info->mti_pill,
LBUG();
if (rc >= 0) {
+no_xattr:
rep_body->eadatasize = rc;
rc = 0;
}
struct mdt_lock_handle *lh;
ENTRY;
- lh = &info->mti_lh[MDT_LH_PARENT];
- lh->mlh_mode = LCK_EX;
-/* if (req->rq_reqmsg->bufcount < 2)
- * RETURN(-EFAULT);
- */
DEBUG_REQ(D_INODE, req, "setxattr "DFID3"\n",
PFID3(&info->mti_body->fid1));
/* MDS_CHECK_RESENT(req, mds_reconstruct_generic(req)); */
- lockpart = MDS_INODELOCK_UPDATE;
-
/* various sanity check for xattr name */
xattr_name = req_capsule_client_get(&info->mti_pill, &RMF_NAME);
if (!xattr_name) {
GOTO(out, rc = -EOPNOTSUPP);
}
+ lockpart = MDS_INODELOCK_UPDATE;
if (!strcmp(xattr_name, XATTR_NAME_ACL_ACCESS))
lockpart |= MDS_INODELOCK_LOOKUP;
+ lh = &info->mti_lh[MDT_LH_PARENT];
+ lh->mlh_mode = LCK_EX;
rc = mdt_object_lock(info->mti_mdt->mdt_namespace, info->mti_object,
lh, lockpart);
if (rc != 0)
GOTO(out, rc);
+ if (req->rq_export->exp_connect_flags & OBD_CONNECT_RDONLY)
+ GOTO(out_unlock, rc = -EROFS);
+
if (info->mti_body->valid & OBD_MD_FLXATTR) {
char * xattr;
if (!req_capsule_field_present(&info->mti_pill, &RMF_EADATA)) {