Whamcloud - gitweb
LU-9276 kernel: kernel update [SLES12 SP1 3.12.69-60.64.35]
[fs/lustre-release.git] / lustre / obdclass / obdo.c
index 45cb2f4..73075da 100644 (file)
  *
  * You should have received a copy of the GNU General Public License
  * version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
  *
  * GPL HEADER END
  */
@@ -48,6 +44,7 @@
 #endif
 #include <obd_class.h>
 #include <lustre/lustre_idl.h>
+#include <lustre_obdo.h>
 
 void obdo_set_parent_fid(struct obdo *dst, const struct lu_fid *parent)
 {
@@ -58,6 +55,13 @@ void obdo_set_parent_fid(struct obdo *dst, const struct lu_fid *parent)
 }
 EXPORT_SYMBOL(obdo_set_parent_fid);
 
+void obdo_set_o_projid(struct obdo *dst, u32 projid)
+{
+       dst->o_projid = projid;
+       dst->o_valid |= OBD_MD_FLPROJID;
+}
+EXPORT_SYMBOL(obdo_set_o_projid);
+
 /* WARNING: the file systems must take care not to tinker with
    attributes they don't manage (such as blocks). */
 void obdo_from_inode(struct obdo *dst, struct inode *src, u64 valid)
@@ -65,7 +69,7 @@ void obdo_from_inode(struct obdo *dst, struct inode *src, u64 valid)
        u64 newvalid = 0;
 
        if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
-               CDEBUG(D_INODE, "valid "LPX64", new time %lu/%lu\n",
+               CDEBUG(D_INODE, "valid %#llx, new time %lu/%lu\n",
                        valid, LTIME_S(src->i_mtime),
                        LTIME_S(src->i_ctime));
 
@@ -121,7 +125,7 @@ EXPORT_SYMBOL(obdo_from_inode);
 
 void obdo_cpy_md(struct obdo *dst, const struct obdo *src, u64 valid)
 {
-        CDEBUG(D_INODE, "src obdo "DOSTID" valid "LPX64", dst obdo "DOSTID"\n",
+       CDEBUG(D_INODE, "src obdo "DOSTID" valid %#llx, dst obdo "DOSTID"\n",
                POSTID(&src->o_oi), src->o_valid, POSTID(&dst->o_oi));
         if (valid & OBD_MD_FLATIME)
                 dst->o_atime = src->o_atime;
@@ -169,3 +173,56 @@ void obdo_to_ioobj(const struct obdo *oa, struct obd_ioobj *ioobj)
        ioobj->ioo_max_brw = 0;
 }
 EXPORT_SYMBOL(obdo_to_ioobj);
+
+/**
+ * Create an obdo to send over the wire
+ */
+void lustre_set_wire_obdo(const struct obd_connect_data *ocd,
+                                struct obdo *wobdo,
+                                const struct obdo *lobdo)
+{
+       *wobdo = *lobdo;
+       wobdo->o_flags &= ~OBD_FL_LOCAL_MASK;
+       if (ocd == NULL)
+               return;
+
+       if (unlikely(!(ocd->ocd_connect_flags & OBD_CONNECT_FID)) &&
+           fid_seq_is_echo(ostid_seq(&lobdo->o_oi))) {
+               /* Currently OBD_FL_OSTID will only be used when 2.4 echo
+                * client communicate with pre-2.4 server */
+               wobdo->o_oi.oi.oi_id = fid_oid(&lobdo->o_oi.oi_fid);
+               wobdo->o_oi.oi.oi_seq = fid_seq(&lobdo->o_oi.oi_fid);
+       }
+}
+EXPORT_SYMBOL(lustre_set_wire_obdo);
+
+/**
+ * Create a local obdo from a wire based odbo
+ */
+void lustre_get_wire_obdo(const struct obd_connect_data *ocd,
+                                struct obdo *lobdo,
+                                const struct obdo *wobdo)
+{
+       __u32 local_flags = 0;
+
+       if (lobdo->o_valid & OBD_MD_FLFLAGS)
+               local_flags = lobdo->o_flags & OBD_FL_LOCAL_MASK;
+
+       *lobdo = *wobdo;
+       if (local_flags != 0) {
+               lobdo->o_valid |= OBD_MD_FLFLAGS;
+               lobdo->o_flags &= ~OBD_FL_LOCAL_MASK;
+               lobdo->o_flags |= local_flags;
+       }
+       if (ocd == NULL)
+               return;
+
+       if (unlikely(!(ocd->ocd_connect_flags & OBD_CONNECT_FID)) &&
+           fid_seq_is_echo(wobdo->o_oi.oi.oi_seq)) {
+               /* see above */
+               lobdo->o_oi.oi_fid.f_seq = wobdo->o_oi.oi.oi_seq;
+               lobdo->o_oi.oi_fid.f_oid = wobdo->o_oi.oi.oi_id;
+               lobdo->o_oi.oi_fid.f_ver = 0;
+       }
+}
+EXPORT_SYMBOL(lustre_get_wire_obdo);