Whamcloud - gitweb
LU-3569 ofd: packing ost_idx in IDIF
[fs/lustre-release.git] / lustre / ofd / ofd_objects.c
index c8fe60c..ee9ebe2 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2012, Intel Corporation.
+ * Copyright (c) 2012, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -42,6 +42,7 @@
 #define DEBUG_SUBSYSTEM S_FILTER
 
 #include <dt_object.h>
+#include <lustre/lustre_idl.h>
 
 #include "ofd_internal.h"
 
@@ -83,7 +84,8 @@ struct ofd_object *ofd_object_find(const struct lu_env *env,
        if (likely(!IS_ERR(o)))
                fo = ofd_obj(o);
        else
-               fo = (struct ofd_object *)o; /* return error */
+               fo = ERR_CAST(o); /* return error */
+
        RETURN(fo);
 }
 
@@ -102,7 +104,7 @@ struct ofd_object *ofd_object_find_or_create(const struct lu_env *env,
 
        dto = dt_find_or_create(env, ofd->ofd_osd, fid, &info->fti_dof, attr);
        if (IS_ERR(dto))
-               RETURN((struct ofd_object *)dto);
+               RETURN(ERR_CAST(dto));
 
        fo_obj = lu_object_locate(dto->do_lu.lo_header,
                                  ofd->ofd_dt_dev.dd_lu_dev.ld_type);
@@ -111,8 +113,7 @@ struct ofd_object *ofd_object_find_or_create(const struct lu_env *env,
 
 int ofd_object_ff_check(const struct lu_env *env, struct ofd_object *fo)
 {
-       struct ofd_thread_info  *info = ofd_info(env);
-       int                      rc = 0;
+       int rc = 0;
 
        ENTRY;
 
@@ -121,9 +122,7 @@ int ofd_object_ff_check(const struct lu_env *env, struct ofd_object *fo)
                 * This actually means that we don't know whether the object
                 * has the "fid" EA or not.
                 */
-               info->fti_buf.lb_buf = &info->fti_mds_fid2;
-               info->fti_buf.lb_len = sizeof(info->fti_mds_fid2);
-               rc = dt_xattr_get(env, ofd_object_child(fo), &info->fti_buf,
+               rc = dt_xattr_get(env, ofd_object_child(fo), &LU_BUF_NULL,
                                  XATTR_NAME_FID, BYPASS_CAPA);
                if (rc >= 0 || rc == -ENODATA) {
                        /*
@@ -146,13 +145,14 @@ void ofd_object_put(const struct lu_env *env, struct ofd_object *fo)
 }
 
 int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
-                         obd_id id, obd_seq seq, int nr)
+                         obd_id id, struct ofd_seq *oseq, int nr, int sync)
 {
        struct ofd_thread_info  *info = ofd_info(env);
        struct ofd_object       *fo = NULL;
        struct dt_object        *next;
        struct thandle          *th;
        struct ofd_object       **batch;
+       struct lu_fid           *fid = &info->fti_fid;
        obd_id                   tmp;
        int                      rc;
        int                      i;
@@ -162,14 +162,15 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
        ENTRY;
 
        /* Don't create objects beyond the valid range for this SEQ */
-       if (unlikely(fid_seq_is_mdt0(seq) && (id + nr) >= IDIF_MAX_OID)) {
-               CERROR("%s:"POSTID" hit the IDIF_MAX_OID (1<<48)!\n",
-                      ofd_name(ofd), id, seq);
+       if (unlikely(fid_seq_is_mdt0(ostid_seq(&oseq->os_oi)) &&
+                    (id + nr) >= IDIF_MAX_OID)) {
+               CERROR("%s:"DOSTID" hit the IDIF_MAX_OID (1<<48)!\n",
+                      ofd_name(ofd), id, ostid_seq(&oseq->os_oi));
                RETURN(rc = -ENOSPC);
-       } else if (unlikely(!fid_seq_is_mdt0(seq) &&
-                  (id + nr) >= OBIF_MAX_OID)) {
-               CERROR("%s:"POSTID" hit the OBIF_MAX_OID (1<<32)!\n",
-                      ofd_name(ofd), id, seq);
+       } else if (unlikely(!fid_seq_is_mdt0(ostid_seq(&oseq->os_oi)) &&
+                           (id + nr) >= OBIF_MAX_OID)) {
+               CERROR("%s:"DOSTID" hit the OBIF_MAX_OID (1<<32)!\n",
+                      ofd_name(ofd), id, ostid_seq(&oseq->os_oi));
                RETURN(rc = -ENOSPC);
        }
 
@@ -194,21 +195,21 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
        info->fti_attr.la_mtime = 0;
        info->fti_attr.la_ctime = 0;
 
+       LASSERT(id != 0);
+
        /* prepare objects */
+       *fid = *lu_object_fid(&oseq->os_lastid_obj->do_lu);
        for (i = 0; i < nr; i++) {
-               info->fti_ostid.oi_id = id + i;
-               info->fti_ostid.oi_seq = seq;
-
-               rc = fid_ostid_unpack(&info->fti_fid, &info->fti_ostid, 0);
-               if (rc) {
+               rc = fid_set_id(fid, id + i);
+               if (rc != 0) {
                        if (i == 0)
-                               GOTO(out, rc = PTR_ERR(fo));
+                               GOTO(out, rc);
 
                        nr = i;
                        break;
                }
 
-               fo = ofd_object_find(env, ofd, &info->fti_fid);
+               fo = ofd_object_find(env, ofd, fid);
                if (IS_ERR(fo)) {
                        if (i == 0)
                                GOTO(out, rc = PTR_ERR(fo));
@@ -228,8 +229,10 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
        if (IS_ERR(th))
                GOTO(out, rc = PTR_ERR(th));
 
-       rc = dt_declare_record_write(env, ofd->ofd_lastid_obj[seq],
-                                    sizeof(tmp), info->fti_off, th);
+       th->th_sync |= sync;
+
+       rc = dt_declare_record_write(env, oseq->os_lastid_obj, sizeof(tmp),
+                                    info->fti_off, th);
        if (rc)
                GOTO(trans_stop, rc);
 
@@ -239,8 +242,9 @@ 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 "LPD64"/"LPD64" exists: "
-                              DFID"\n", seq, id, PFID(&info->fti_fid));
+                       CDEBUG(D_INODE, "object "LPX64"/"LPX64" exists: "
+                              DFID"\n", ostid_seq(&oseq->os_oi), id,
+                              PFID(lu_object_fid(&fo->ofo_obj.do_lu)));
                        continue;
                }
 
@@ -259,7 +263,8 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
        if (rc)
                GOTO(trans_stop, rc);
 
-       CDEBUG(D_OTHER, "create new object "DFID"\n", PFID(&info->fti_fid));
+       CDEBUG(D_OTHER, "%s: create new object "DFID" nr %d\n",
+              ofd_name(ofd), PFID(fid), nr);
 
        for (i = 0; i < nr; i++) {
                fo = batch[i];
@@ -275,13 +280,13 @@ int ofd_precreate_objects(const struct lu_env *env, struct ofd_device *ofd,
                                break;
                        LASSERT(ofd_object_exists(fo));
                }
-               ofd_last_id_set(ofd, id + i, seq);
+               ofd_seq_last_oid_set(oseq, id + i);
        }
 
        objects = i;
        if (objects > 0) {
-               tmp = cpu_to_le64(ofd_last_id(ofd, seq));
-               rc = dt_record_write(env, ofd->ofd_lastid_obj[seq],
+               tmp = cpu_to_le64(ofd_seq_last_oid(oseq));
+               rc = dt_record_write(env, oseq->os_lastid_obj,
                                     &info->fti_buf, &info->fti_off, th);
        }
 trans_stop: