X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_object.c;h=5cf0a15a7edb53d8c3cbe0e8a646a96203f53b7b;hp=c9b9d3e3e6ccdcd59921180a90b8d01683081803;hb=fbf5870b9848929d352460f1f005b79c0b5ccc5a;hpb=70e80ade90af09300396706b8910e196a7928520 diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index c9b9d3e..5cf0a15 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -16,8 +16,8 @@ * in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see [sun.com URL with a - * copy of GPLv2]. + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or @@ -60,7 +60,7 @@ #include "mdd_internal.h" -static struct lu_object_operations mdd_lu_obj_ops; +static const struct lu_object_operations mdd_lu_obj_ops; int mdd_la_get(const struct lu_env *env, struct mdd_object *obj, struct lu_attr *la, struct lustre_capa *capa) @@ -106,9 +106,11 @@ struct llog_cookie *mdd_max_cookie_get(const struct lu_env *env, } if (unlikely(mti->mti_max_cookie == NULL)) { OBD_ALLOC(mti->mti_max_cookie, max_cookie_size); - if (unlikely(mti->mti_max_cookie != NULL)) + if (likely(mti->mti_max_cookie != NULL)) mti->mti_max_cookie_size = max_cookie_size; } + if (likely(mti->mti_max_cookie != NULL)) + memset(mti->mti_max_cookie, 0, mti->mti_max_cookie_size); return mti->mti_max_cookie; } @@ -175,18 +177,19 @@ struct lu_object *mdd_object_alloc(const struct lu_env *env, } } -static int mdd_object_init(const struct lu_env *env, struct lu_object *o) +static int mdd_object_init(const struct lu_env *env, struct lu_object *o, + const struct lu_object_conf *_) { - struct mdd_device *d = lu2mdd_dev(o->lo_dev); - struct lu_object *below; + struct mdd_device *d = lu2mdd_dev(o->lo_dev); + struct lu_object *below; struct lu_device *under; ENTRY; - under = &d->mdd_child->dd_lu_dev; - below = under->ld_ops->ldo_object_alloc(env, o->lo_header, under); + under = &d->mdd_child->dd_lu_dev; + below = under->ld_ops->ldo_object_alloc(env, o->lo_header, under); mdd_pdlock_init(lu2mdd_obj(o)); if (below == NULL) - RETURN(-ENOMEM); + RETURN(-ENOMEM); lu_object_add(o, below); RETURN(0); @@ -203,20 +206,13 @@ static int mdd_object_start(const struct lu_env *env, struct lu_object *o) static void mdd_object_free(const struct lu_env *env, struct lu_object *o) { struct mdd_object *mdd = lu2mdd_obj(o); - + lu_object_fini(o); OBD_FREE_PTR(mdd); } -static int mdd_object_print(const struct lu_env *env, void *cookie, - lu_printer_t p, const struct lu_object *o) -{ - return (*p)(env, cookie, LUSTRE_MDD_NAME"-object@%p", o); -} - /* orphan handling is here */ -static void mdd_object_delete(const struct lu_env *env, - struct lu_object *o) +static void mdd_object_delete(const struct lu_env *env, struct lu_object *o) { struct mdd_object *mdd_obj = lu2mdd_obj(o); struct thandle *handle = NULL; @@ -232,7 +228,7 @@ static void mdd_object_delete(const struct lu_env *env, if (IS_ERR(handle)) CERROR("Cannot get thandle\n"); else { - mdd_write_lock(env, mdd_obj); + mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); /* let's remove obj from the orphan list */ __mdd_orphan_del(env, mdd_obj, handle); mdd_write_unlock(env, mdd_obj); @@ -242,11 +238,10 @@ static void mdd_object_delete(const struct lu_env *env, } } -static struct lu_object_operations mdd_lu_obj_ops = { - .loo_object_init = mdd_object_init, - .loo_object_start = mdd_object_start, - .loo_object_free = mdd_object_free, - .loo_object_print = mdd_object_print, +static const struct lu_object_operations mdd_lu_obj_ops = { + .loo_object_init = mdd_object_init, + .loo_object_start = mdd_object_start, + .loo_object_free = mdd_object_free, .loo_object_delete = mdd_object_delete }; @@ -254,21 +249,7 @@ struct mdd_object *mdd_object_find(const struct lu_env *env, struct mdd_device *d, const struct lu_fid *f) { - struct lu_object *o, *lo; - struct mdd_object *m; - ENTRY; - - o = lu_object_find(env, mdd2lu_dev(d)->ld_site, f); - if (IS_ERR(o)) - m = (struct mdd_object *)o; - else { - lo = lu_object_locate(o->lo_header, mdd2lu_dev(d)->ld_type); - /* remote object can't be located and should be put then */ - if (lo == NULL) - lu_object_put(env, o); - m = lu2mdd_obj(lo); - } - RETURN(m); + return md2mdd_obj(md_object_find_slice(env, &d->mdd_md_dev, f)); } int mdd_get_flags(const struct lu_env *env, struct mdd_object *obj) @@ -357,7 +338,7 @@ int mdd_lmm_get_locked(const struct lu_env *env, struct mdd_object *mdd_obj, int rc; ENTRY; - mdd_read_lock(env, mdd_obj); + mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); rc = __mdd_lmm_get(env, mdd_obj, ma); mdd_read_unlock(env, mdd_obj); RETURN(rc); @@ -404,7 +385,7 @@ static int mdd_attr_get_internal(const struct lu_env *env, #ifdef CONFIG_FS_POSIX_ACL if (rc == 0 && ma->ma_need & MA_ACL_DEF) { if (S_ISDIR(mdd_object_type(mdd_obj))) - rc = mdd_acl_def_get(env, mdd_obj, ma); + rc = mdd_def_acl_get(env, mdd_obj, ma); } #endif CDEBUG(D_INODE, "after getattr rc = %d, ma_valid = "LPX64"\n", @@ -419,7 +400,7 @@ int mdd_attr_get_internal_locked(const struct lu_env *env, int needlock = ma->ma_need & (MA_LOV | MA_LMV | MA_ACL_DEF); if (needlock) - mdd_read_lock(env, mdd_obj); + mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdd_attr_get_internal(env, mdd_obj, ma); if (needlock) mdd_read_unlock(env, mdd_obj); @@ -454,7 +435,7 @@ static int mdd_xattr_get(const struct lu_env *env, LASSERT(mdd_object_exists(mdd_obj)); - mdd_read_lock(env, mdd_obj); + mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdo_xattr_get(env, mdd_obj, buf, name, mdd_object_capa(env, mdd_obj)); mdd_read_unlock(env, mdd_obj); @@ -478,7 +459,7 @@ static int mdd_readlink(const struct lu_env *env, struct md_object *obj, LASSERT(mdd_object_exists(mdd_obj)); next = mdd_object_child(mdd_obj); - mdd_read_lock(env, mdd_obj); + mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); rc = next->do_body_ops->dbo_read(env, next, buf, &pos, mdd_object_capa(env, mdd_obj)); mdd_read_unlock(env, mdd_obj); @@ -496,7 +477,7 @@ static int mdd_xattr_list(const struct lu_env *env, struct md_object *obj, ENTRY; - mdd_read_lock(env, mdd_obj); + mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdo_xattr_list(env, mdd_obj, buf, mdd_object_capa(env, mdd_obj)); mdd_read_unlock(env, mdd_obj); @@ -599,7 +580,7 @@ static int mdd_attr_set_internal_locked(const struct lu_env *env, needacl = needacl && (attr->la_valid & LA_MODE); if (needacl) - mdd_write_lock(env, obj); + mdd_write_lock(env, obj, MOR_TGT_CHILD); rc = mdd_attr_set_internal(env, obj, attr, handle, needacl); if (needacl) mdd_write_unlock(env, obj); @@ -617,7 +598,7 @@ int mdd_attr_check_set_internal_locked(const struct lu_env *env, needacl = needacl && (attr->la_valid & LA_MODE); if (needacl) - mdd_write_lock(env, obj); + mdd_write_lock(env, obj, MOR_TGT_CHILD); rc = mdd_attr_check_set_internal(env, obj, attr, handle, needacl); if (needacl) mdd_write_unlock(env, obj); @@ -688,7 +669,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, la->la_valid &= ~LA_ATIME; RETURN(0); } - + /* Check if flags change. */ if (la->la_valid & LA_FLAGS) { unsigned int oldflags = 0; @@ -696,7 +677,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, (LUSTRE_IMMUTABLE_FL | LUSTRE_APPEND_FL); if ((uc->mu_fsuid != tmp_la->la_uid) && - !mdd_capable(uc, CAP_FOWNER)) + !mdd_capable(uc, CFS_CAP_FOWNER)) RETURN(-EPERM); /* XXX: the IMMUTABLE and APPEND_ONLY flags can @@ -704,9 +685,9 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, if (mdd_is_immutable(obj)) oldflags |= LUSTRE_IMMUTABLE_FL; if (mdd_is_append(obj)) - oldflags |= LUSTRE_APPEND_FL; + oldflags |= LUSTRE_APPEND_FL; if ((oldflags ^ newflags) && - !mdd_capable(uc, CAP_LINUX_IMMUTABLE)) + !mdd_capable(uc, CFS_CAP_LINUX_IMMUTABLE)) RETURN(-EPERM); if (!S_ISDIR(tmp_la->la_mode)) @@ -722,9 +703,10 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, if ((la->la_valid & (LA_MTIME | LA_ATIME | LA_CTIME)) && !(la->la_valid & ~(LA_MTIME | LA_ATIME | LA_CTIME))) { if ((uc->mu_fsuid != tmp_la->la_uid) && - !mdd_capable(uc, CAP_FOWNER)) { + !mdd_capable(uc, CFS_CAP_FOWNER)) { rc = mdd_permission_internal_locked(env, obj, tmp_la, - MAY_WRITE); + MAY_WRITE, + MOR_TGT_CHILD); if (rc) RETURN(rc); } @@ -735,8 +717,9 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, /* Bypass la_vaild == LA_MODE, * this is for changing file with SUID or SGID. */ if ((la->la_valid & ~LA_MODE) && + !(ma->ma_attr_flags & MDS_PERM_BYPASS) && (uc->mu_fsuid != tmp_la->la_uid) && - !mdd_capable(uc, CAP_FOWNER)) + !mdd_capable(uc, CFS_CAP_FOWNER)) RETURN(-EPERM); if (la->la_mode == (umode_t) -1) @@ -746,8 +729,9 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, (tmp_la->la_mode & ~S_IALLUGO); /* Also check the setgid bit! */ - if (!lustre_in_group_p(uc, (la->la_valid & LA_GID) ? la->la_gid : - tmp_la->la_gid) && !mdd_capable(uc, CAP_FSETID)) + if (!lustre_in_group_p(uc, (la->la_valid & LA_GID) ? + la->la_gid : tmp_la->la_gid) && + !mdd_capable(uc, CFS_CAP_FSETID)) la->la_mode &= ~S_ISGID; } else { la->la_mode = tmp_la->la_mode; @@ -759,7 +743,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, la->la_uid = tmp_la->la_uid; if (((uc->mu_fsuid != tmp_la->la_uid) || (la->la_uid != tmp_la->la_uid)) && - !mdd_capable(uc, CAP_CHOWN)) + !mdd_capable(uc, CFS_CAP_CHOWN)) RETURN(-EPERM); /* If the user or group of a non-directory has been @@ -785,7 +769,7 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, if (((uc->mu_fsuid != tmp_la->la_uid) || ((la->la_gid != tmp_la->la_gid) && !lustre_in_group_p(uc, la->la_gid))) && - !mdd_capable(uc, CAP_CHOWN)) + !mdd_capable(uc, CFS_CAP_CHOWN)) RETURN(-EPERM); /* Likewise, if the user or group of a non-directory @@ -827,7 +811,8 @@ static int mdd_fix_attr(const struct lu_env *env, struct mdd_object *obj, (uc->mu_fsuid == tmp_la->la_uid)) && !(ma->ma_attr_flags & MDS_PERM_BYPASS)) { rc = mdd_permission_internal_locked(env, obj, - tmp_la, MAY_WRITE); + tmp_la, MAY_WRITE, + MOR_TGT_CHILD); if (rc) RETURN(rc); } @@ -938,7 +923,7 @@ int mdd_xattr_set_txn(const struct lu_env *env, struct mdd_object *obj, int rc; ENTRY; - mdd_write_lock(env, obj); + mdd_write_lock(env, obj, MOR_TGT_CHILD); rc = __mdd_xattr_set(env, obj, buf, name, fl, handle); mdd_write_unlock(env, obj); @@ -960,7 +945,8 @@ static int mdd_xattr_sanity_check(const struct lu_env *env, if (rc) RETURN(rc); - if ((uc->mu_fsuid != tmp_la->la_uid) && !mdd_capable(uc, CAP_FOWNER)) + if ((uc->mu_fsuid != tmp_la->la_uid) && + !mdd_capable(uc, CFS_CAP_FOWNER)) RETURN(-EPERM); RETURN(rc); @@ -1017,7 +1003,7 @@ int mdd_xattr_del(const struct lu_env *env, struct md_object *obj, if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); - mdd_write_lock(env, mdd_obj); + mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdo_xattr_del(env, mdd_obj, name, handle, mdd_object_capa(env, mdd_obj)); mdd_write_unlock(env, mdd_obj); @@ -1054,7 +1040,7 @@ static int mdd_ref_del(const struct lu_env *env, struct md_object *obj, if (IS_ERR(handle)) RETURN(-ENOMEM); - mdd_write_lock(env, mdd_obj); + mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdd_unlink_sanity_check(env, NULL, mdd_obj, ma); if (rc) @@ -1127,7 +1113,7 @@ static int mdd_object_create(const struct lu_env *env, if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); - mdd_write_lock(env, mdd_obj); + mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdd_oc_sanity_check(env, mdd_obj, ma); if (rc) GOTO(unlock, rc); @@ -1176,9 +1162,9 @@ static int mdd_object_create(const struct lu_env *env, } EXIT; unlock: - mdd_write_unlock(env, mdd_obj); if (rc == 0) - rc = mdd_attr_get_internal_locked(env, mdd_obj, ma); + rc = mdd_attr_get_internal(env, mdd_obj, ma); + mdd_write_unlock(env, mdd_obj); mdd_trans_stop(env, mdd, rc, handle); return rc; @@ -1200,7 +1186,7 @@ static int mdd_ref_add(const struct lu_env *env, struct md_object *obj, if (IS_ERR(handle)) RETURN(-ENOMEM); - mdd_write_lock(env, mdd_obj); + mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdd_link_sanity_check(env, NULL, NULL, mdd_obj); if (rc == 0) __mdd_ref_add(env, mdd_obj, handle); @@ -1298,7 +1284,7 @@ static int mdd_open_sanity_check(const struct lu_env *env, if (uc && ((uc->mu_valid == UCRED_OLD) || (uc->mu_valid == UCRED_NEW)) && (uc->mu_fsuid != tmp_la->la_uid) && - !mdd_capable(uc, CAP_FOWNER)) + !mdd_capable(uc, CFS_CAP_FOWNER)) RETURN(-EPERM); } #endif @@ -1312,7 +1298,7 @@ static int mdd_open(const struct lu_env *env, struct md_object *obj, struct mdd_object *mdd_obj = md2mdd_obj(obj); int rc = 0; - mdd_write_lock(env, mdd_obj); + mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdd_open_sanity_check(env, mdd_obj, flags); if (rc == 0) @@ -1359,7 +1345,7 @@ static int mdd_close(const struct lu_env *env, struct md_object *obj, if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); - mdd_write_lock(env, mdd_obj); + mdd_write_lock(env, mdd_obj, MOR_TGT_CHILD); /* release open count */ mdd_obj->mod_count --; @@ -1368,7 +1354,7 @@ static int mdd_close(const struct lu_env *env, struct md_object *obj, rc = mdd_object_kill(env, mdd_obj, ma); else ma->ma_valid &= ~(MA_LOV | MA_COOKIE); - + mdd_write_unlock(env, mdd_obj); mdd_trans_stop(env, mdo2mdd(obj), rc, handle); RETURN(rc); @@ -1394,7 +1380,7 @@ static int mdd_readpage_sanity_check(const struct lu_env *env, } static int mdd_dir_page_build(const struct lu_env *env, int first, - void *area, int nob, struct dt_it_ops *iops, + void *area, int nob, const struct dt_it_ops *iops, struct dt_it *it, __u64 *start, __u64 *end, struct lu_dirent **last) { @@ -1468,7 +1454,7 @@ static int __mdd_readpage(const struct lu_env *env, struct mdd_object *obj, { struct dt_it *it; struct dt_object *next = mdd_object_child(obj); - struct dt_it_ops *iops; + const struct dt_it_ops *iops; struct page *pg; struct lu_dirent *last = NULL; int i; @@ -1563,7 +1549,7 @@ static int mdd_readpage(const struct lu_env *env, struct md_object *obj, LASSERT(mdd_object_exists(mdd_obj)); - mdd_read_lock(env, mdd_obj); + mdd_read_lock(env, mdd_obj, MOR_TGT_CHILD); rc = mdd_readpage_sanity_check(env, mdd_obj); if (rc) GOTO(out_unlock, rc); @@ -1602,7 +1588,17 @@ out_unlock: return rc; } -struct md_object_operations mdd_obj_ops = { +static int mdd_object_sync(const struct lu_env *env, struct md_object *obj) +{ + struct mdd_object *mdd_obj = md2mdd_obj(obj); + struct dt_object *next; + + LASSERT(mdd_object_exists(mdd_obj)); + next = mdd_object_child(mdd_obj); + return next->do_ops->do_object_sync(env, next); +} + +const struct md_object_operations mdd_obj_ops = { .moo_permission = mdd_permission, .moo_attr_get = mdd_attr_get, .moo_attr_set = mdd_attr_set, @@ -1617,5 +1613,6 @@ struct md_object_operations mdd_obj_ops = { .moo_close = mdd_close, .moo_readpage = mdd_readpage, .moo_readlink = mdd_readlink, - .moo_capa_get = mdd_capa_get + .moo_capa_get = mdd_capa_get, + .moo_object_sync = mdd_object_sync, };