Whamcloud - gitweb
LU-3569 ofd: packing ost_idx in IDIF
[fs/lustre-release.git] / lustre / include / lustre / lustre_idl.h
index 370899c..4b1f06f 100644 (file)
@@ -634,7 +634,7 @@ static inline obd_seq ostid_seq(const struct ost_id *ostid)
        if (fid_seq_is_mdt0(ostid->oi.oi_seq))
                return FID_SEQ_OST_MDT0;
 
-       if (fid_seq_is_default(ostid->oi.oi_seq))
+       if (unlikely(fid_seq_is_default(ostid->oi.oi_seq)))
                return FID_SEQ_LOV_DEFAULT;
 
        if (fid_is_idif(&ostid->oi_fid))
@@ -646,9 +646,12 @@ static inline obd_seq ostid_seq(const struct ost_id *ostid)
 /* extract OST objid from a wire ost_id (id/seq) pair */
 static inline obd_id ostid_id(const struct ost_id *ostid)
 {
-       if (fid_seq_is_mdt0(ostid_seq(ostid)))
+       if (fid_seq_is_mdt0(ostid->oi.oi_seq))
                return ostid->oi.oi_id & IDIF_OID_MASK;
 
+       if (unlikely(fid_seq_is_default(ostid->oi.oi_seq)))
+               return ostid->oi.oi_id;
+
        if (fid_is_idif(&ostid->oi_fid))
                return fid_idif_id(fid_seq(&ostid->oi_fid),
                                   fid_oid(&ostid->oi_fid), 0);
@@ -691,13 +694,23 @@ static inline void ostid_set_seq_llog(struct ost_id *oi)
  */
 static inline void ostid_set_id(struct ost_id *oi, __u64 oid)
 {
-       if (fid_seq_is_mdt0(ostid_seq(oi))) {
+       if (fid_seq_is_mdt0(oi->oi.oi_seq)) {
                if (oid >= IDIF_MAX_OID) {
                        CERROR("Bad "LPU64" to set "DOSTID"\n",
                                oid, POSTID(oi));
                        return;
                }
                oi->oi.oi_id = oid;
+       } else if (fid_is_idif(&oi->oi_fid)) {
+               if (oid >= IDIF_MAX_OID) {
+                       CERROR("Bad "LPU64" to set "DOSTID"\n",
+                               oid, POSTID(oi));
+                       return;
+               }
+               oi->oi_fid.f_seq = fid_idif_seq(oid,
+                                               fid_idif_ost_idx(&oi->oi_fid));
+               oi->oi_fid.f_oid = oid;
+               oi->oi_fid.f_ver = oid >> 48;
        } else {
                if (oid > OBIF_MAX_OID) {
                        CERROR("Bad "LPU64" to set "DOSTID"\n",
@@ -708,25 +721,31 @@ static inline void ostid_set_id(struct ost_id *oi, __u64 oid)
        }
 }
 
-static inline void ostid_inc_id(struct ost_id *oi)
+static inline int fid_set_id(struct lu_fid *fid, __u64 oid)
 {
-       if (fid_seq_is_mdt0(ostid_seq(oi))) {
-               if (unlikely(ostid_id(oi) + 1 > IDIF_MAX_OID)) {
-                       CERROR("Bad inc "DOSTID"\n", POSTID(oi));
-                       return;
+       if (unlikely(fid_seq_is_igif(fid->f_seq))) {
+               CERROR("bad IGIF, "DFID"\n", PFID(fid));
+               return -EBADF;
+       }
+
+       if (fid_is_idif(fid)) {
+               if (oid >= IDIF_MAX_OID) {
+                       CERROR("Bad "LPU64" to set "DFID"\n",
+                               oid, PFID(fid));
+                       return -EBADF;
                }
-               oi->oi.oi_id++;
+               fid->f_seq = fid_idif_seq(oid, fid_idif_ost_idx(fid));
+               fid->f_oid = oid;
+               fid->f_ver = oid >> 48;
        } else {
-               oi->oi_fid.f_oid++;
+               if (oid > OBIF_MAX_OID) {
+                       CERROR("Bad "LPU64" to set "DFID"\n",
+                               oid, PFID(fid));
+                       return -EBADF;
+               }
+               fid->f_oid = oid;
        }
-}
-
-static inline void ostid_dec_id(struct ost_id *oi)
-{
-       if (fid_seq_is_mdt0(ostid_seq(oi)))
-               oi->oi.oi_id--;
-       else
-               oi->oi_fid.f_oid--;
+       return 0;
 }
 
 /**
@@ -738,36 +757,41 @@ static inline void ostid_dec_id(struct ost_id *oi)
  * struct lu_fid fields without loss.  For reference see:
  * http://arch.lustre.org/index.php?title=Interoperability_fids_zfs
  */
-static inline int ostid_to_fid(struct lu_fid *fid, struct ost_id *ostid,
+static inline int ostid_to_fid(struct lu_fid *fid, const struct ost_id *ostid,
                               __u32 ost_idx)
 {
+       obd_seq seq = ostid_seq(ostid);
+
        if (ost_idx > 0xffff) {
                CERROR("bad ost_idx, "DOSTID" ost_idx:%u\n", POSTID(ostid),
                       ost_idx);
                return -EBADF;
        }
 
-       if (fid_seq_is_mdt0(ostid_seq(ostid))) {
+       if (fid_seq_is_mdt0(seq)) {
+               obd_id oid = ostid_id(ostid);
+
                /* This is a "legacy" (old 1.x/2.early) OST object in "group 0"
                 * that we map into the IDIF namespace.  It allows up to 2^48
                 * objects per OST, as this is the object namespace that has
                 * been in production for years.  This can handle create rates
                 * of 1M objects/s/OST for 9 years, or combinations thereof. */
-               if (ostid_id(ostid) >= IDIF_MAX_OID) {
+               if (oid >= IDIF_MAX_OID) {
                         CERROR("bad MDT0 id, "DOSTID" ost_idx:%u\n",
                                POSTID(ostid), ost_idx);
                         return -EBADF;
                }
-               fid->f_seq = fid_idif_seq(ostid_id(ostid), ost_idx);
+               fid->f_seq = fid_idif_seq(oid, ost_idx);
                /* truncate to 32 bits by assignment */
-               fid->f_oid = ostid_id(ostid);
+               fid->f_oid = oid;
                /* in theory, not currently used */
-               fid->f_ver = ostid_id(ostid) >> 48;
-       } else /* if (fid_seq_is_idif(seq) || fid_seq_is_norm(seq)) */ {
-              /* This is either an IDIF object, which identifies objects across
-               * all OSTs, or a regular FID.  The IDIF namespace maps legacy
-               * OST objects into the FID namespace.  In both cases, we just
-               * pass the FID through, no conversion needed. */
+               fid->f_ver = oid >> 48;
+       } else if (likely(!fid_seq_is_default(seq)))
+               /* if (fid_seq_is_idif(seq) || fid_seq_is_norm(seq)) */ {
+               /* This is either an IDIF object, which identifies objects across
+                * all OSTs, or a regular FID.  The IDIF namespace maps legacy
+                * OST objects into the FID namespace.  In both cases, we just
+                * pass the FID through, no conversion needed. */
                if (ostid->oi_fid.f_ver != 0) {
                        CERROR("bad MDT0 id, "DOSTID" ost_idx:%u\n",
                                POSTID(ostid), ost_idx);
@@ -776,7 +800,7 @@ static inline int ostid_to_fid(struct lu_fid *fid, struct ost_id *ostid,
                *fid = ostid->oi_fid;
        }
 
-        return 0;
+       return 0;
 }
 
 /* pack any OST FID into an ostid (id/seq) for the wire/disk */
@@ -1619,6 +1643,11 @@ static inline void lmm_oi_set_seq(struct ost_id *oi, __u64 seq)
        oi->oi.oi_seq = seq;
 }
 
+static inline void lmm_oi_set_id(struct ost_id *oi, __u64 oid)
+{
+       oi->oi.oi_id = oid;
+}
+
 static inline __u64 lmm_oi_id(struct ost_id *oi)
 {
        return oi->oi.oi_id;