next = mdd_object_child(mdd_obj);
rc = next->do_ops->do_attr_get(ctxt, next, &ma->ma_attr);
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;
- if ((S_ISREG(ma->ma_attr.la_mode)
+ 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);
- if (rc > 0) {
+ if (rc > 0) {
ma->ma_valid |= MA_LOV;
rc = 0;
}
}
/*TODO: get DIREA for directory */
}
- CDEBUG(D_INODE, "after getattr rc = %d, ma_valid = "LPX64"\n",
+ CDEBUG(D_INODE, "after getattr rc = %d, ma_valid = "LPX64"\n",
rc, ma->ma_valid);
RETURN(rc);
}
struct mdd_device *mdd = mdo2mdd(pobj);
struct mdd_object *mdd_pobj = md2mdd_obj(pobj);
struct mdd_object *mdd_cobj = md2mdd_obj(cobj);
- struct dt_object *dt_cobj = mdd_object_child(mdd_cobj);
struct thandle *handle;
- struct lu_attr *la = &mdd_ctx_info(ctxt)->mti_la;
int rc;
ENTRY;
- /* sanity checks */
- rc = dt_cobj->do_ops->do_attr_get(ctxt, dt_cobj, la);
- if (rc == 0) {
- if (S_ISDIR(la->la_mode)) {
- if (!S_ISDIR(ma->ma_attr.la_mode))
- rc = -EISDIR;
- } else if (S_ISDIR(ma->ma_attr.la_mode))
- rc = -ENOTDIR;
- }
- if (rc != 0)
- RETURN(rc);
+ if (S_ISDIR(cobj->mo_lu.lo_header->loh_attr)) {
+ if (!S_ISDIR(ma->ma_attr.la_mode))
+ RETURN(-EISDIR);
+ } else if (S_ISDIR(ma->ma_attr.la_mode))
+ RETURN(-ENOTDIR);
mdd_txn_param_build(ctxt, &MDD_TXN_UNLINK);
handle = mdd_trans_start(ctxt, mdd);
mdd_lock2(ctxt, mdd_pobj, mdd_cobj);
/* rmdir checks */
- if (S_ISDIR(la->la_mode)) {
+ if (S_ISDIR(cobj->mo_lu.lo_header->loh_attr)) {
rc = mdd_dir_is_empty(ctxt, mdd_cobj);
if (rc != 0)
GOTO(cleanup, rc);
return rc;
}
-static int mdd_create_data_object(const struct lu_context *ctxt,
+static int mdd_create_data_object(const struct lu_context *ctxt,
struct md_object *pobj, struct md_object *cobj,
const void *eadata, int eadatasize,
struct md_attr *ma)
int lmm_size = 0;
int rc;
ENTRY;
-
+
rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size, eadata,
eadatasize, attr);
if (rc)
RETURN(rc);
}
-static int mdd_create_sanity_check(const struct lu_context *ctxt,
+static int mdd_create_sanity_check(const struct lu_context *ctxt,
struct mdd_device *mdd,
- struct md_object *pobj,
+ struct md_object *pobj,
const char *name, struct md_attr *ma)
{
struct lu_fid *fid;
int rc;
-
+
fid = &mdd_ctx_info(ctxt)->mti_fid;
rc = mdd_lookup(ctxt, pobj, name, fid);
if (rc != -ENOENT) {
rc = 0;
break;
default:
- rc = -EINVAL;
+ rc = -EINVAL;
break;
}
- RETURN(rc);
+ RETURN(rc);
}
/*
*/
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,
+ const char *target_name, const void *eadata,
int eadatasize, struct md_attr* ma)
{
struct mdd_device *mdd = mdo2mdd(pobj);
* first */
if (S_ISREG(attr->la_mode)) {
- rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size,
+ rc = mdd_lov_create(ctxt, mdd, mdo, son, &lmm, &lmm_size,
eadata, eadatasize, attr);
if (rc)
RETURN(rc);
}
-
+
mdd_txn_param_build(ctxt, &MDD_TXN_MKDIR);
handle = mdd_trans_start(ctxt, mdd);
if (IS_ERR(handle))
rc = __mdd_object_create(ctxt, son, ma, handle);
if (rc)
GOTO(cleanup, rc);
-
+
created = 1;
rc = __mdd_object_initialize(ctxt, mdo, son, ma, handle);
}
static int mdd_statfs(const struct lu_context *ctx,
- struct md_device *m, struct kstatfs *sfs)
+ struct md_device *m, struct kstatfs *sfs)
{
struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev);
int rc;
static int mdd_get_maxsize(const struct lu_context *ctx,
struct md_device *m, int *md_size,
- int *cookie_size)
+ int *cookie_size)
{
struct mdd_device *mdd = lu2mdd_dev(&m->md_lu_dev);
int rc;
if (rc)
RETURN(rc);
rc = mdd_lov_cookiesize(ctx, mdd, cookie_size);
-
+
RETURN(rc);
}
mdd_lock(ctxt, mdd, DT_READ_LOCK);
if (dt_try_as_dir(ctxt, next))
- rc = next->do_ops->do_readpage(ctxt, next, rdpg);
+ rc = next->do_ops->do_readpage(ctxt, next, rdpg);
else
rc = -ENOTDIR;
mdd_unlock(ctxt, mdd, DT_READ_LOCK);
struct mdd_thread_info {
struct txn_param mti_param;
struct lu_fid mti_fid;
- struct lu_attr mti_la;
struct lov_desc mti_ld;
struct lov_mds_md mti_lmm;
};
-int mdd_init_obd(const struct lu_context *ctxt, struct mdd_device *mdd,
+int mdd_init_obd(const struct lu_context *ctxt, struct mdd_device *mdd,
char *dev);
int mdd_xattr_set(const struct lu_context *ctxt, struct md_object *obj,
const void *buf, int buf_len, const char *name, int fl);
struct md_object *child, struct lov_mds_md *lmm,
int lmm_size, int mode);
int mdd_lov_create(const struct lu_context *ctxt, struct mdd_device *mdd,
- struct mdd_object *parent, struct mdd_object *child,
+ struct mdd_object *parent, struct mdd_object *child,
struct lov_mds_md **lmm, int *lmm_size, const void *eadata,
int eadatasize, struct lu_attr *la);
int mdd_get_md(const struct lu_context *ctxt, struct md_object *obj,
void *md, int *md_size);
-int mdd_unlink_log(const struct lu_context *ctxt, struct mdd_device *mdd,
+int mdd_unlink_log(const struct lu_context *ctxt, struct mdd_device *mdd,
struct mdd_object *mdd_cobj, struct md_attr *ma);
struct mdd_thread_info *mdd_ctx_info(const struct lu_context *ctx);
}
static inline struct obd_device *mdd2_obd(struct mdd_device *mdd)
{
- return mdd->mdd_md_dev.md_lu_dev.ld_obd;
+ return mdd->mdd_md_dev.md_lu_dev.ld_obd;
}
int mdd_lov_mdsize(const struct lu_context *ctxt, struct mdd_device *mdd,