X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fofd%2Fofd_objects.c;h=631c6f5fa8e9eda016e852ae056da452abeac728;hb=c632d6094c5a228c86c898400192e81b03833fc5;hp=4db3f1a18f47547f9f35d43e70c9514e4aa28123;hpb=617134bd0528ae04f9290ce20863fc955235762f;p=fs%2Flustre-release.git diff --git a/lustre/ofd/ofd_objects.c b/lustre/ofd/ofd_objects.c index 4db3f1a..631c6f5 100644 --- a/lustre/ofd/ofd_objects.c +++ b/lustre/ofd/ofd_objects.c @@ -60,14 +60,14 @@ * \retval 0 if version matches * \retval -EOVERFLOW on version mismatch */ -int ofd_version_get_check(struct ofd_thread_info *info, - struct ofd_object *fo) +static int ofd_version_get_check(struct ofd_thread_info *info, + struct ofd_object *fo) { dt_obj_version_t curr_version; LASSERT(ofd_object_exists(fo)); - if (info->fti_exp) + if (info->fti_exp == NULL) RETURN(0); curr_version = dt_version_get(info->fti_env, ofd_object_child(fo)); @@ -76,7 +76,7 @@ int ofd_version_get_check(struct ofd_thread_info *info, /* VBR: version is checked always because costs nothing */ if (info->fti_pre_version != 0 && info->fti_pre_version != curr_version) { - CDEBUG(D_INODE, "Version mismatch "LPX64" != "LPX64"\n", + CDEBUG(D_INODE, "Version mismatch %#llx != %#llx\n", info->fti_pre_version, curr_version); spin_lock(&info->fti_exp->exp_lock); info->fti_exp->exp_vbr_failed = 1; @@ -148,8 +148,7 @@ int ofd_object_ff_load(const struct lu_env *env, struct ofd_object *fo) buf->lb_buf = ff; buf->lb_len = sizeof(*ff); - rc = dt_xattr_get(env, ofd_object_child(fo), buf, XATTR_NAME_FID, - BYPASS_CAPA); + rc = dt_xattr_get(env, ofd_object_child(fo), buf, XATTR_NAME_FID); if (rc < 0) return rc; @@ -205,7 +204,7 @@ void ofd_object_put(const struct lu_env *env, struct ofd_object *fo) * \retval negative value on error */ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, - obd_id id, struct ofd_seq *oseq, int nr, int sync) + u64 id, struct ofd_seq *oseq, int nr, int sync) { struct ofd_thread_info *info = ofd_info(env); struct ofd_object *fo = NULL; @@ -213,7 +212,7 @@ 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; - obd_id tmp; + u64 tmp; int rc; int i; int objects = 0; @@ -294,7 +293,7 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, if (unlikely(ofd_object_exists(fo))) { /* object may exist being re-created by write replay */ - CDEBUG(D_INODE, "object "LPX64"/"LPX64" exists: " + CDEBUG(D_INODE, "object %#llx/%#llx exists: " DFID"\n", ostid_seq(&oseq->os_oi), id, PFID(lu_object_fid(&fo->ofo_obj.do_lu))); continue; @@ -305,7 +304,10 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, rc = dt_declare_create(env, next, &info->fti_attr, NULL, &info->fti_dof, th); - if (rc) { + if (rc < 0) { + if (i == 0) + GOTO(trans_stop, rc); + nr = i; break; } @@ -318,8 +320,6 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, CDEBUG(D_OTHER, "%s: create new object "DFID" nr %d\n", ofd_name(ofd), PFID(fid), nr); - LASSERT(nr > 0); - /* When the LFSCK scanning the whole device to verify the LAST_ID file * consistency, it will load the last_id into RAM firstly, and compare * the last_id with each OST-object's ID. If the later one is larger, @@ -349,10 +349,12 @@ 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) { - lfsck_pack_rfa(&ofd_info(env)->fti_lr, - lu_object_fid(&fo->ofo_obj.do_lu)); - lfsck_in_notify(env, ofd->ofd_osd, - &ofd_info(env)->fti_lr); + struct lfsck_request *lr = &ofd_info(env)->fti_lr; + + 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); } if (likely(!ofd_object_exists(fo) && @@ -362,8 +364,13 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, rc = dt_create(env, next, &info->fti_attr, NULL, &info->fti_dof, th); - if (rc) + if (rc < 0) { + if (i == 0) + GOTO(trans_stop, rc); + + rc = 0; break; + } LASSERT(ofd_object_exists(fo)); } ofd_seq_last_oid_set(oseq, id + i); @@ -382,8 +389,8 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd, &info->fti_buf, &info->fti_off, th); dt_write_unlock(env, oseq->os_lastid_obj); if (rc1 != 0) - CERROR("%s: fail to reset the LAST_ID for seq ("LPX64 - ") from "LPU64" to "LPU64"\n", ofd_name(ofd), + CERROR("%s: fail to reset the LAST_ID for seq (%#llx" + ") from %llu to %llu\n", ofd_name(ofd), ostid_seq(&oseq->os_oi), id + nr - 1, ofd_seq_last_oid(oseq)); } @@ -437,7 +444,7 @@ int ofd_attr_handle_ugid(const struct lu_env *env, struct ofd_object *fo, if (!(la->la_valid & LA_UID) && !(la->la_valid & LA_GID)) RETURN(0); - rc = dt_attr_get(env, ofd_object_child(fo), ln, BYPASS_CAPA); + rc = dt_attr_get(env, ofd_object_child(fo), ln); if (rc != 0) RETURN(rc); @@ -542,14 +549,13 @@ int ofd_attr_set(const struct lu_env *env, struct ofd_object *fo, if (rc) GOTO(stop, rc); - rc = dt_attr_set(env, ofd_object_child(fo), la, th, - ofd_object_capa(env, fo)); + rc = dt_attr_set(env, ofd_object_child(fo), la, th); if (rc) GOTO(stop, rc); if (ff_needed) { rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf, - XATTR_NAME_FID, 0, th, BYPASS_CAPA); + 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); @@ -608,12 +614,12 @@ int ofd_object_punch(const struct lu_env *env, struct ofd_object *fo, /* we support truncate, not punch yet */ LASSERT(end == OBD_OBJECT_EOF); + ofd_write_lock(env, fo); fmd = ofd_fmd_get(info->fti_exp, &fo->ofo_header.loh_fid); if (fmd && fmd->fmd_mactime_xid < info->fti_xid) fmd->fmd_mactime_xid = info->fti_xid; ofd_fmd_put(info->fti_exp, fmd); - ofd_write_lock(env, fo); if (!ofd_object_exists(fo)) GOTO(unlock, rc = -ENOENT); @@ -666,18 +672,17 @@ int ofd_object_punch(const struct lu_env *env, struct ofd_object *fo, if (rc) GOTO(stop, rc); - rc = dt_punch(env, dob, start, OBD_OBJECT_EOF, th, - ofd_object_capa(env, fo)); + rc = dt_punch(env, dob, start, OBD_OBJECT_EOF, th); if (rc) GOTO(stop, rc); - rc = dt_attr_set(env, dob, la, th, ofd_object_capa(env, fo)); + rc = dt_attr_set(env, dob, la, th); if (rc) GOTO(stop, rc); if (ff_needed) { rc = dt_xattr_set(env, ofd_object_child(fo), &info->fti_buf, - XATTR_NAME_FID, 0, th, BYPASS_CAPA); + 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); @@ -731,8 +736,14 @@ int ofd_object_destroy(const struct lu_env *env, struct ofd_object *fo, if (IS_ERR(th)) GOTO(unlock, rc = PTR_ERR(th)); - dt_declare_ref_del(env, ofd_object_child(fo), th); - dt_declare_destroy(env, ofd_object_child(fo), th); + rc = dt_declare_ref_del(env, ofd_object_child(fo), th); + if (rc < 0) + GOTO(stop, rc); + + rc = dt_declare_destroy(env, ofd_object_child(fo), th); + if (rc < 0) + GOTO(stop, rc); + if (orphan) rc = dt_trans_start_local(env, ofd->ofd_osd, th); else @@ -772,25 +783,7 @@ int ofd_attr_get(const struct lu_env *env, struct ofd_object *fo, ENTRY; if (ofd_object_exists(fo)) { - rc = dt_attr_get(env, ofd_object_child(fo), la, - ofd_object_capa(env, fo)); - -#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 7, 50, 0) - /* Try to correct for a bug in 2.1.0 (LU-221) that caused - * negative timestamps to appear to be in the far future, - * due old timestamp being stored on disk as an unsigned value. - * This fixes up any bad values stored on disk before - * returning them to the client, and ensures any timestamp - * updates are correct. LU-1042 */ - if (unlikely(la->la_atime == LU221_BAD_TIME)) - la->la_atime = 0; - if (unlikely(la->la_mtime == LU221_BAD_TIME)) - la->la_mtime = 0; - if (unlikely(la->la_ctime == LU221_BAD_TIME)) - la->la_ctime = 0; -#else -#warning "remove old LU-221/LU-1042 workaround code" -#endif + rc = dt_attr_get(env, ofd_object_child(fo), la); } else { rc = -ENOENT; }