X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fofd%2Fofd_objects.c;h=7f328eeeb667113a5bfb5cf4f912b7c738b9f8f6;hb=c26a4d72445c7ce02e370cc84932d7cc89416966;hp=631c6f5fa8e9eda016e852ae056da452abeac728;hpb=520631764c0e9d1bf5c70f8d060b81a2f322d5dc;p=fs%2Flustre-release.git diff --git a/lustre/ofd/ofd_objects.c b/lustre/ofd/ofd_objects.c index 631c6f5..7f328ee 100644 --- a/lustre/ofd/ofd_objects.c +++ b/lustre/ofd/ofd_objects.c @@ -23,7 +23,7 @@ * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2012, 2014 Intel Corporation. + * Copyright (c) 2012, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -121,7 +121,7 @@ struct ofd_object *ofd_object_find(const struct lu_env *env, * Get FID of parent MDT object. * * This function reads extended attribute XATTR_NAME_FID of OFD object which - * contains the MDT parent object FID and saves it in ofd_object::ofo_pfid. + * contains the MDT parent object FID and saves it in ofd_object::ofo_ff. * * The filter_fid::ff_parent::f_ver field currently holds * the OST-object index in the parent MDT-object's layout EA, @@ -137,13 +137,12 @@ struct ofd_object *ofd_object_find(const struct lu_env *env, */ int ofd_object_ff_load(const struct lu_env *env, struct ofd_object *fo) { - struct ofd_thread_info *info = ofd_info(env); - struct filter_fid_old *ff = &info->fti_mds_fid_old; - struct lu_buf *buf = &info->fti_buf; - struct lu_fid *pfid = &fo->ofo_pfid; - int rc = 0; + struct ofd_thread_info *info = ofd_info(env); + struct filter_fid *ff = &fo->ofo_ff; + struct lu_buf *buf = &info->fti_buf; + int rc = 0; - if (fid_is_sane(pfid)) + if (fid_is_sane(&ff->ff_parent)) return 0; buf->lb_buf = ff; @@ -152,31 +151,18 @@ int ofd_object_ff_load(const struct lu_env *env, struct ofd_object *fo) if (rc < 0) return rc; - if (rc < sizeof(struct lu_fid)) { - fid_zero(pfid); + if (unlikely(rc < sizeof(struct lu_fid))) { + fid_zero(&ff->ff_parent); return -ENODATA; } - pfid->f_seq = le64_to_cpu(ff->ff_parent.f_seq); - pfid->f_oid = le32_to_cpu(ff->ff_parent.f_oid); - pfid->f_stripe_idx = le32_to_cpu(ff->ff_parent.f_stripe_idx); + filter_fid_le_to_cpu(ff, ff, rc); return 0; } /** - * Put OFD object reference. - * - * \param[in] env execution environment - * \param[in] fo OFD object - */ -void ofd_object_put(const struct lu_env *env, struct ofd_object *fo) -{ - lu_object_put(env, &fo->ofo_obj.do_lu); -} - -/** * Precreate the given number \a nr of objects in the given sequence \a oseq. * * This function precreates new OST objects in the given sequence. @@ -212,11 +198,12 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, struct thandle *th; struct ofd_object **batch; struct lu_fid *fid = &info->fti_fid; - u64 tmp; - int rc; - int i; - int objects = 0; - int nr_saved = nr; + u64 tmp; + int rc; + int rc2; + int i; + int objects = 0; + int nr_saved = nr; ENTRY; @@ -349,12 +336,11 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, /* Only the new created objects need to be recorded. */ if (ofd->ofd_osd->dd_record_fid_accessed) { - struct lfsck_request *lr = &ofd_info(env)->fti_lr; + struct lfsck_req_local *lrl = &ofd_info(env)->fti_lrl; - lfsck_pack_rfa(lr, lu_object_fid(&fo->ofo_obj.do_lu), - LE_FID_ACCESSED, - LFSCK_TYPE_LAYOUT); - lfsck_in_notify(env, ofd->ofd_osd, lr, NULL); + lfsck_pack_rfa(lrl, lu_object_fid(&fo->ofo_obj.do_lu), + LEL_FID_ACCESSED, LFSCK_TYPE_LAYOUT); + lfsck_in_notify_local(env, ofd->ofd_osd, lrl, NULL); } if (likely(!ofd_object_exists(fo) && @@ -396,7 +382,12 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, } trans_stop: - ofd_trans_stop(env, ofd, th, rc); + rc2 = ofd_trans_stop(env, ofd, th, rc); + if (rc2) + CERROR("%s: failed to stop transaction: rc = %d\n", + ofd_name(ofd), rc2); + if (!rc) + rc = rc2; out: for (i = 0; i < nr_saved; i++) { fo = batch[i]; @@ -419,9 +410,9 @@ out: * * If the object still has SUID+SGID bits set, meaning that it was precreated * by the MDT before it was assigned to any file, (see ofd_precreate_objects()) - * then we will accept the UID+GID if sent by the client for initializing the - * ownership of this object. We only allow this to happen once (so clear these - * bits) and later only allow setattr. + * then we will accept the UID/GID/PROJID if sent by the client for initializing + * the ownership of this object. We only allow this to happen once (so clear + * these bits) and later only allow setattr. * * \param[in] env execution environment * \param[in] fo OFD object @@ -431,7 +422,7 @@ out: * \retval 0 if successful * \retval negative value on error */ -int ofd_attr_handle_ugid(const struct lu_env *env, struct ofd_object *fo, +int ofd_attr_handle_id(const struct lu_env *env, struct ofd_object *fo, struct lu_attr *la, int is_setattr) { struct ofd_thread_info *info = ofd_info(env); @@ -441,7 +432,8 @@ int ofd_attr_handle_ugid(const struct lu_env *env, struct ofd_object *fo, ENTRY; - if (!(la->la_valid & LA_UID) && !(la->la_valid & LA_GID)) + if (!(la->la_valid & LA_UID) && !(la->la_valid & LA_GID) && + !(la->la_valid & LA_PROJID)) RETURN(0); rc = dt_attr_get(env, ofd_object_child(fo), ln); @@ -450,13 +442,19 @@ int ofd_attr_handle_ugid(const struct lu_env *env, struct ofd_object *fo, LASSERT(ln->la_valid & LA_MODE); + /* + * Only allow setattr to change UID/GID/PROJID, if + * SUID+SGID is not set which means this is not + * initialization of this objects. + */ if (!is_setattr) { if (!(ln->la_mode & S_ISUID)) - la->la_valid &= ~LA_UID; + la->la_valid &= ~(LA_UID | LA_PROJID); if (!(ln->la_mode & S_ISGID)) - la->la_valid &= ~LA_GID; + la->la_valid &= ~(LA_GID | LA_PROJID); } + /* Initialize ownership of this object, clear SUID+SGID bits*/ if ((la->la_valid & LA_UID) && (ln->la_mode & S_ISUID)) mask |= S_ISUID; if ((la->la_valid & LA_GID) && (ln->la_mode & S_ISGID)) @@ -495,8 +493,9 @@ int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo, struct ofd_device *ofd = ofd_obj2dev(fo); struct thandle *th; struct ofd_mod_data *fmd; - int ff_needed = 0; - int rc; + int ff_needed = 0; + int rc; + int rc2; ENTRY; ofd_write_lock(env, fo); @@ -515,7 +514,7 @@ int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo, if (rc) GOTO(unlock, rc); - rc = ofd_attr_handle_ugid(env, fo, la, 1 /* is_setattr */); + rc = ofd_attr_handle_id(env, fo, la, 1 /* is_setattr */); if (rc != 0) GOTO(unlock, rc); @@ -536,6 +535,11 @@ int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo, GOTO(stop, rc); if (ff_needed) { + if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_UNMATCHED_PAIR1)) + ff->ff_parent.f_oid = cpu_to_le32(1UL << 31); + else if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_UNMATCHED_PAIR2)) + le32_add_cpu(&ff->ff_parent.f_oid, -1); + info->fti_buf.lb_buf = ff; info->fti_buf.lb_len = sizeof(*ff); rc = dt_declare_xattr_set(env, ofd_object_child(fo), @@ -554,24 +558,25 @@ int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo, GOTO(stop, rc); if (ff_needed) { + if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_NOPFID)) + GOTO(stop, rc); + rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th); - if (rc == 0) { - fo->ofo_pfid.f_seq = le64_to_cpu(ff->ff_parent.f_seq); - fo->ofo_pfid.f_oid = le32_to_cpu(ff->ff_parent.f_oid); - /* Currently, the filter_fid::ff_parent::f_ver is not - * the real parent MDT-object's FID::f_ver, instead it - * is the OST-object index in its parent MDT-object's - * layout EA. */ - fo->ofo_pfid.f_stripe_idx = - le32_to_cpu(ff->ff_parent.f_stripe_idx); - } + if (!rc) + filter_fid_le_to_cpu(&fo->ofo_ff, ff, sizeof(*ff)); } GOTO(stop, rc); stop: - ofd_trans_stop(env, ofd, th, rc); + rc2 = ofd_trans_stop(env, ofd, th, rc); + if (rc2) + CERROR("%s: failed to stop transaction: rc = %d\n", + ofd_name(ofd), rc2); + if (!rc) + rc = rc2; + unlock: ofd_write_unlock(env, fo); @@ -606,8 +611,9 @@ int ofd_object_punch(const struct lu_env *env, struct ofd_object *fo, struct ofd_mod_data *fmd; struct dt_object *dob = ofd_object_child(fo); struct thandle *th; - int ff_needed = 0; - int rc; + int ff_needed = 0; + int rc; + int rc2; ENTRY; @@ -634,7 +640,7 @@ int ofd_object_punch(const struct lu_env *env, struct ofd_object *fo, if (rc) GOTO(unlock, rc); - rc = ofd_attr_handle_ugid(env, fo, la, 0 /* !is_setattr */); + rc = ofd_attr_handle_id(env, fo, la, 0 /* !is_setattr */); if (rc != 0) GOTO(unlock, rc); @@ -659,6 +665,11 @@ int ofd_object_punch(const struct lu_env *env, struct ofd_object *fo, GOTO(stop, rc); if (ff_needed) { + if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_UNMATCHED_PAIR1)) + ff->ff_parent.f_oid = cpu_to_le32(1UL << 31); + else if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_UNMATCHED_PAIR2)) + le32_add_cpu(&ff->ff_parent.f_oid, -1); + info->fti_buf.lb_buf = ff; info->fti_buf.lb_len = sizeof(*ff); rc = dt_declare_xattr_set(env, ofd_object_child(fo), @@ -681,24 +692,24 @@ int ofd_object_punch(const struct lu_env *env, struct ofd_object *fo, GOTO(stop, rc); if (ff_needed) { + if (OBD_FAIL_CHECK(OBD_FAIL_LFSCK_NOPFID)) + GOTO(stop, rc); + rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf, XATTR_NAME_FID, 0, th); - if (rc == 0) { - fo->ofo_pfid.f_seq = le64_to_cpu(ff->ff_parent.f_seq); - fo->ofo_pfid.f_oid = le32_to_cpu(ff->ff_parent.f_oid); - /* Currently, the filter_fid::ff_parent::f_ver is not - * the real parent MDT-object's FID::f_ver, instead it - * is the OST-object index in its parent MDT-object's - * layout EA. */ - fo->ofo_pfid.f_stripe_idx = - le32_to_cpu(ff->ff_parent.f_stripe_idx); - } + if (!rc) + filter_fid_le_to_cpu(&fo->ofo_ff, ff, sizeof(*ff)); } GOTO(stop, rc); stop: - ofd_trans_stop(env, ofd, th, rc); + rc2 = ofd_trans_stop(env, ofd, th, rc); + if (rc2 != 0) + CERROR("%s: failed to stop transaction: rc = %d\n", + ofd_name(ofd), rc2); + if (!rc) + rc = rc2; unlock: ofd_write_unlock(env, fo); @@ -719,12 +730,13 @@ unlock: * \retval 0 if successful * \retval negative value on error */ -int ofd_object_destroy(const struct lu_env *env, struct ofd_object *fo, +int ofd_destroy(const struct lu_env *env, struct ofd_object *fo, int orphan) { struct ofd_device *ofd = ofd_obj2dev(fo); struct thandle *th; - int rc = 0; + int rc = 0; + int rc2; ENTRY; @@ -756,7 +768,12 @@ int ofd_object_destroy(const struct lu_env *env, struct ofd_object *fo, dt_ref_del(env, ofd_object_child(fo), th); dt_destroy(env, ofd_object_child(fo), th); stop: - ofd_trans_stop(env, ofd, th, rc); + rc2 = ofd_trans_stop(env, ofd, th, rc); + if (rc2) + CERROR("%s failed to stop transaction: %d\n", + ofd_name(ofd), rc2); + if (!rc) + rc = rc2; unlock: ofd_write_unlock(env, fo); RETURN(rc);