Whamcloud - gitweb
LU-7117 osp: set ptlrpc_request::rq_allow_replay properly
[fs/lustre-release.git] / lustre / obdclass / obdo.c
index 69960e7..dffd029 100644 (file)
 
 #define DEBUG_SUBSYSTEM S_CLASS
 
+#include <linux/user_namespace.h>
+#ifdef HAVE_UIDGID_HEADER
+# include <linux/uidgid.h>
+#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)
 {
@@ -56,14 +61,14 @@ EXPORT_SYMBOL(obdo_set_parent_fid);
 
 /* 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, u32 valid)
+void obdo_from_inode(struct obdo *dst, struct inode *src, u64 valid)
 {
-       u32 newvalid = 0;
+       u64 newvalid = 0;
 
-        if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
-                CDEBUG(D_INODE, "valid %x, new time %lu/%lu\n",
-                       valid, LTIME_S(src->i_mtime),
-                       LTIME_S(src->i_ctime));
+       if (valid & (OBD_MD_FLCTIME | OBD_MD_FLMTIME))
+               CDEBUG(D_INODE, "valid "LPX64", new time %lu/%lu\n",
+                       valid, LTIME_S(src->i_mtime),
+                       LTIME_S(src->i_ctime));
 
         if (valid & OBD_MD_FLATIME) {
                 dst->o_atime = LTIME_S(src->i_atime);
@@ -115,7 +120,7 @@ void obdo_from_inode(struct obdo *dst, struct inode *src, u32 valid)
 }
 EXPORT_SYMBOL(obdo_from_inode);
 
-void obdo_cpy_md(struct obdo *dst, const struct obdo *src, u32 valid)
+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",
                POSTID(&src->o_oi), src->o_valid, POSTID(&dst->o_oi));
@@ -149,8 +154,6 @@ void obdo_cpy_md(struct obdo *dst, const struct obdo *src, u32 valid)
                 dst->o_parent_oid = src->o_parent_oid;
         if (valid & OBD_MD_FLHANDLE)
                 dst->o_handle = src->o_handle;
-        if (valid & OBD_MD_FLCOOKIE)
-                dst->o_lcookie = src->o_lcookie;
 
         dst->o_valid |= valid;
 }
@@ -167,3 +170,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);