/* CMM local md_object operations */
static int cml_object_create(const struct lu_context *ctx,
struct md_object *mo,
+ const struct md_create_spec *spec,
struct md_attr *attr)
{
int rc;
ENTRY;
- rc = mo_object_create(ctx, md_object_next(mo), attr);
+ rc = mo_object_create(ctx, md_object_next(mo), spec, attr);
RETURN(rc);
}
static int cml_create(const struct lu_context *ctx, struct md_object *mo_p,
const char *child_name, struct md_object *mo_c,
- const char *target_name, const void *eadata,
- int eadatalen, struct md_attr *ma)
+ const struct md_create_spec *spec,
+ struct md_attr *ma)
{
int rc;
ENTRY;
rc = mdo_create(ctx, md_object_next(mo_p), child_name,
- md_object_next(mo_c), target_name, eadata, eadatalen,
- ma);
+ md_object_next(mo_c), spec, ma);
RETURN(rc);
}
/* CMM remote md_object operations. All are invalid */
static int cmr_object_create(const struct lu_context *ctx,
struct md_object *mo,
+ const struct md_create_spec *spec,
struct md_attr *ma)
{
RETURN(-EFAULT);
*/
static int cmr_create(const struct lu_context *ctx, struct md_object *mo_p,
const char *child_name, struct md_object *mo_c,
- const char *target_name, const void *eadata,
- int eadatasize, struct md_attr *ma)
+ const struct md_create_spec *spec,
+ struct md_attr *ma)
{
int rc;
//XXX: make sure that MDT checks name isn't exist
/* remote object creation and local name insert */
- rc = mo_object_create(ctx, md_object_next(mo_c), ma);
+ rc = mo_object_create(ctx, md_object_next(mo_c), spec, ma);
if (rc == 0) {
rc = mdo_name_insert(ctx, md_object_next(mo_p),
child_name, lu_object_fid(&mo_c->mo_lu));
/* md_object_operations */
static int mdc_object_create(const struct lu_context *ctx,
- struct md_object *mo, struct md_attr *ma)
+ struct md_object *mo,
+ const struct md_create_spec *spec,
+ struct md_attr *ma)
{
struct mdc_device *mc = md2mdc_dev(md_obj2dev(mo));
struct lu_attr *attr = &ma->ma_attr;
memset(&mci->mci_opdata, 0, sizeof(mci->mci_opdata));
mci->mci_opdata.fid1 = *lu_object_fid(&mo->mo_lu);
mci->mci_opdata.mod_time = attr->la_mtime;
-
+ /*TODO: pack create_spec properly */
rc = md_create(mc->mc_desc.cl_exp, &mci->mci_opdata, NULL, 0,
attr->la_mode, attr->la_uid, attr->la_gid, 0, 0,
&mci->mci_req);
struct llog_cookie *ma_cookie;
int ma_cookie_size;
};
+/* additional parameters for create */
+struct md_create_spec {
+ union {
+ /* symlink target */
+ const char *sp_symname;
+ /* parent FID for cross-ref mkdir */
+ const struct lu_fid sp_pfid;
+ /* eadata for regular files */
+ struct md_spec_reg {
+ const void *eadata;
+ int eadatalen;
+ } sp_ea;
+ } u;
+};
/*
* Operations implemented for each md object (both directory and leaf).
/* part of cross-ref operation */
int (*moo_object_create)(const struct lu_context *,
- struct md_object *, struct md_attr *);
+ struct md_object *,
+ const struct md_create_spec *spec,
+ struct md_attr *);
int (*moo_ref_add)(const struct lu_context *, struct md_object *);
int (*moo_ref_del)(const struct lu_context *, struct md_object *,
struct md_attr *);
/* target_name is valid iff this is a symlink operation. */
int (*mdo_create)(const struct lu_context *, struct md_object *,
const char *child_name, struct md_object *,
- const char *target_name, const void *eadata,
- int eadatalen, struct md_attr *);
+ const struct md_create_spec *spec,
+ struct md_attr *);
/* This method is used for creating data object for this meta object*/
int (*mdo_create_data)(const struct lu_context *cx, struct md_object *p,
struct md_object *o, const void *eadata,
}
static inline int mo_object_create(const struct lu_context *cx,
- struct md_object *m, struct md_attr *at)
+ struct md_object *m,
+ const struct md_create_spec *spc,
+ struct md_attr *at)
{
LASSERT(m->mo_ops->moo_object_create);
- return m->mo_ops->moo_object_create(cx, m, at);
+ return m->mo_ops->moo_object_create(cx, m, spc, at);
}
static inline int mo_ref_add(const struct lu_context *cx,
static inline int mdo_create(const struct lu_context *cx, struct md_object *p,
const char *child_name, struct md_object *c,
- const char *target_name, const void *eadata,
- int eadatalen, struct md_attr *at)
+ const struct md_create_spec *spc,
+ struct md_attr *at)
{
LASSERT(c->mo_dir_ops->mdo_create);
- return c->mo_dir_ops->mdo_create(cx, p, child_name, c, target_name,
- eadata, eadatalen, at);
+ return c->mo_dir_ops->mdo_create(cx, p, child_name, c, spc, at);
}
static inline int mdo_create_data(const struct lu_context *cx,
struct md_object *p, struct md_object *c,
*/
static int mdd_create(const struct lu_context *ctxt, struct md_object *pobj,
const char *name, struct md_object *child,
- const char *target_name, const void *eadata,
- int eadatasize, struct md_attr* ma)
+ const struct md_create_spec *spec,
+ struct md_attr* ma)
{
struct mdd_device *mdd = mdo2mdd(pobj);
struct mdd_object *mdo = md2mdd_obj(pobj);
/* no RPC inside the transaction, so OST objects should be created at
* first */
if (S_ISREG(attr->la_mode)) {
+ const void *eadata = spec->u.sp_ea.eadata;
+ int eadatasize = spec->u.sp_ea.eadatalen;
+
rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size,
eadata, eadatasize, attr);
if (rc)
if (S_ISLNK(attr->la_mode)) {
struct dt_object *dt = mdd_object_child(son);
- loff_t pos = 0;
+ const char *target_name = spec->u.sp_symname;
int sym_len = strlen(target_name);
+ loff_t pos = 0;
+
rc = dt->do_body_ops->dbo_write(ctxt, dt, target_name,
sym_len, &pos, handle);
if (rc == sym_len)
}
/* partial operation */
static int mdd_object_create(const struct lu_context *ctxt,
- struct md_object *obj, struct md_attr *ma)
+ struct md_object *obj,
+ const struct md_create_spec *spec,
+ struct md_attr *ma)
{
struct mdd_device *mdd = mdo2mdd(obj);
/* XXX: parent fid is needed here
rc = __mdd_object_initialize(ctxt, mdo, son, ma, handle);
*/
- mdd_attr_get(ctxt, md2mdd_obj(obj), ma);
+ mdd_attr_get(ctxt, obj, ma);
mdd_trans_stop(ctxt, mdd, handle);
spin_lock_init(&m->mdt_transno_lock);
/* FIXME: We need to load them from disk. But now fake it */
- m->mdt_last_transno = 100;
- m->mdt_last_committed = 99;
+ m->mdt_last_transno = 1;
+ m->mdt_last_committed = 1;
m->mdt_max_mdsize = MAX_MD_SIZE;
m->mdt_max_cookiesize = sizeof(struct llog_cookie);
*/
struct md_attr mti_attr;
/*
+ * Create specification
+ */
+ struct md_create_spec mti_spec;
+ /*
* reint record. contains information for reint operations.
*/
struct mdt_reint_record mti_rr;
rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
if (rr->rr_name) {
if (req_capsule_field_present(pill, &RMF_SYMTGT)) {
- rr->rr_tgt = req_capsule_client_get(pill,
- &RMF_SYMTGT);
- if (rr->rr_tgt == NULL)
+ const char *tgt;
+ tgt = req_capsule_client_get(pill,
+ &RMF_SYMTGT);
+ if (tgt == NULL)
result = -EFAULT;
+ info->mti_spec.u.sp_symname = tgt;
}
} else
result = -EFAULT;
rr->rr_name = req_capsule_client_get(pill, &RMF_NAME);
if (rr->rr_name == NULL)
+ /*XXX: what about open by FID? */
result = -EFAULT;
else
result = 0;
result = -EFAULT;
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);
+ struct md_create_spec *sp = &info->mti_spec;
+ sp->u.sp_ea.eadata = req_capsule_client_get(pill,
+ &RMF_EADATA);
+ sp->u.sp_ea.eadatalen = req_capsule_get_size(pill,
+ &RMF_EADATA,
+ RCL_CLIENT);
}
RETURN(result);
&RMF_MDT_MD,
RCL_SERVER);
LASSERT(p != NULL);
+ /*XXX: Tom, do we need this?
rc = mdt_create_data_obj(info, p, o);
if (rc)
RETURN(rc);
+ */
}
CDEBUG(D_INODE, "after open, ma_valid bit = "LPX64" lmm_size = %d\n",
if (la->la_flags & MDS_OPEN_CREAT) {
rc = mo_object_create(info->mti_ctxt,
mdt_object_child(o),
+ &info->mti_spec,
&info->mti_attr);
if (rc == 0)
rc = mdt_mfd_open(info, NULL, o, flags, 1);
mdt_object_child(parent),
rr->rr_name,
mdt_object_child(child),
- rr->rr_tgt, rr->rr_eadata,
- rr->rr_eadatalen, &info->mti_attr);
+ &info->mti_spec,
+ /* rr->rr_tgt, rr->rr_eadata, rr->rr_eadatalen,*/
+ &info->mti_attr);
intent_set_disposition(ldlm_rep, DISP_OPEN_CREATE);
if (result != 0)
GOTO(out_child, result);
struct md_object *next = mdt_object_child(parent);
rc = mdo_create(info->mti_ctxt, next, rr->rr_name,
- mdt_object_child(child), rr->rr_tgt, NULL, 0,
+ mdt_object_child(child), &info->mti_spec,
+ /* rr->rr_tgt, NULL, 0, */
ma);
if (rc == 0) {
/* return fid & attr to client. */
if (!IS_ERR(o)) {
struct md_object *next = mdt_object_child(o);
- rc = mo_object_create(info->mti_ctxt, next, ma);
+ rc = mo_object_create(info->mti_ctxt, next,
+ &info->mti_spec, ma);
if (rc == 0) {
/* return fid & attr to client. */
if (ma->ma_valid & MA_INODE)
switch (info->mti_attr.ma_attr.la_mode & S_IFMT) {
case S_IFREG:
case S_IFDIR:{
- if (strlen(info->mti_rr.rr_name) > 0)
- rc = mdt_md_create(info);
- else
+ if (strlen(info->mti_rr.rr_name) == 0) {
rc = mdt_md_mkobj(info);
- break;
+ break;
+ }
}
case S_IFLNK:
case S_IFCHR: