* 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/
* \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;
/* 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;
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;
* \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;
struct thandle *th;
struct ofd_object **batch;
struct lu_fid *fid = &info->fti_fid;
- obd_id 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;
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;
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;
}
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,
/* 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) &&
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);
&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));
}
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];
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);
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);
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);
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);
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;
/* 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);
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);
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);
{
struct ofd_device *ofd = ofd_obj2dev(fo);
struct thandle *th;
- int rc = 0;
+ int rc = 0;
+ int rc2;
ENTRY;
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
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);
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, 53, 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;
-#endif
+ rc = dt_attr_get(env, ofd_object_child(fo), la);
} else {
rc = -ENOENT;
}