Whamcloud - gitweb
LU-3345 llapi: add user space method for lov_user_md
[fs/lustre-release.git] / lustre / include / lustre / lustre_user.h
index ef02f90..9de0815 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2010, 2012, Intel Corporation.
+ * Copyright (c) 2010, 2013, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -134,9 +134,14 @@ struct lu_fid {
 };
 
 struct filter_fid {
-       struct lu_fid   ff_parent;  /* ff_parent.f_ver == file stripe number */
-       __u64      ff_objid;
-       __u64      ff_seq;
+       struct lu_fid   ff_parent;  /* ff_parent.f_ver == file stripe number */
+};
+
+/* keep this one for compatibility */
+struct filter_fid_old {
+       struct lu_fid   ff_parent;
+       __u64           ff_objid;
+       __u64           ff_seq;
 };
 
 /* Userspace should treat lu_fid as opaque, and only use the following methods
@@ -144,6 +149,50 @@ struct filter_fid {
  * here from lustre_idl.h if needed. */
 typedef struct lu_fid lustre_fid;
 
+/**
+ * Following struct for object attributes, that will be kept inode's EA.
+ * Introduced in 2.0 release (please see b15993, for details)
+ * Added to all objects since Lustre 2.4 as contains self FID
+ */
+struct lustre_mdt_attrs {
+       /**
+        * Bitfield for supported data in this structure. From enum lma_compat.
+        * lma_self_fid and lma_flags are always available.
+        */
+       __u32   lma_compat;
+       /**
+        * Per-file incompat feature list. Lustre version should support all
+        * flags set in this field. The supported feature mask is available in
+        * LMA_INCOMPAT_SUPP.
+        */
+       __u32   lma_incompat;
+       /** FID of this inode */
+       struct lu_fid  lma_self_fid;
+};
+
+/**
+ * Prior to 2.4, the LMA structure also included SOM attributes which has since
+ * been moved to a dedicated xattr
+ * lma_flags was also removed because of lma_compat/incompat fields.
+ */
+#define LMA_OLD_SIZE (sizeof(struct lustre_mdt_attrs) + 5 * sizeof(__u64))
+
+/**
+ * OST object IDentifier.
+ */
+struct ost_id {
+       union {
+               struct ostid {
+                       __u64   oi_id;
+                       __u64   oi_seq;
+               } oi;
+               struct lu_fid oi_fid;
+       };
+};
+
+#define DOSTID LPX64":"LPU64
+#define POSTID(oi) ostid_seq(oi), ostid_id(oi)
+
 /*
  * The ioctl naming rules:
  * LL_*     - works on the currently opened filehandle instead of parent dir
@@ -272,18 +321,16 @@ typedef struct lu_fid lustre_fid;
 
 #define lov_user_ost_data lov_user_ost_data_v1
 struct lov_user_ost_data_v1 {     /* per-stripe data structure */
-        __u64 l_object_id;        /* OST object ID */
-        __u64 l_object_seq;       /* OST object seq number */
-        __u32 l_ost_gen;          /* generation of this OST index */
-        __u32 l_ost_idx;          /* OST index in LOV */
+       struct ost_id l_ost_oi;   /* OST object ID */
+       __u32 l_ost_gen;          /* generation of this OST index */
+       __u32 l_ost_idx;          /* OST index in LOV */
 } __attribute__((packed));
 
 #define lov_user_md lov_user_md_v1
 struct lov_user_md_v1 {           /* LOV EA user data (host-endian) */
        __u32 lmm_magic;          /* magic number = LOV_USER_MAGIC_V1 */
        __u32 lmm_pattern;        /* LOV_PATTERN_RAID0, LOV_PATTERN_RAID1 */
-       __u64 lmm_object_id;      /* LOV object ID */
-       __u64 lmm_object_seq;     /* LOV object seq */
+       struct ost_id lmm_oi;     /* LOV object ID */
        __u32 lmm_stripe_size;    /* size of stripe in bytes */
        __u16 lmm_stripe_count;   /* num stripes in use for this object */
        union {
@@ -298,8 +345,7 @@ struct lov_user_md_v1 {           /* LOV EA user data (host-endian) */
 struct lov_user_md_v3 {           /* LOV EA user data (host-endian) */
        __u32 lmm_magic;          /* magic number = LOV_USER_MAGIC_V3 */
        __u32 lmm_pattern;        /* LOV_PATTERN_RAID0, LOV_PATTERN_RAID1 */
-       __u64 lmm_object_id;      /* LOV object ID */
-       __u64 lmm_object_seq;     /* LOV object seq */
+       struct ost_id lmm_oi;     /* LOV object ID */
        __u32 lmm_stripe_size;    /* size of stripe in bytes */
        __u16 lmm_stripe_count;   /* num stripes in use for this object */
        union {
@@ -312,6 +358,16 @@ struct lov_user_md_v3 {           /* LOV EA user data (host-endian) */
        struct lov_user_ost_data_v1 lmm_objects[0]; /* per-stripe data */
 } __attribute__((packed));
 
+static inline __u32 lov_user_md_size(__u16 stripes, __u32 lmm_magic)
+{
+       if (lmm_magic == LOV_USER_MAGIC_V3)
+               return sizeof(struct lov_user_md_v3) +
+                               stripes * sizeof(struct lov_user_ost_data_v1);
+       else
+               return sizeof(struct lov_user_md_v1) +
+                               stripes * sizeof(struct lov_user_ost_data_v1);
+}
+
 /* Compile with -D_LARGEFILE64_SOURCE or -D_GNU_SOURCE (or #define) to
  * use this.  It is unsafe to #define those values in this header as it
  * is possible the application has already #included <sys/stat.h>. */
@@ -427,6 +483,8 @@ static inline void obd_uuid2fsname(char *buf, char *uuid, int buflen)
 
 /* printf display format
    e.g. printf("file FID is "DFID"\n", PFID(fid)); */
+#define FID_NOBRACE_LEN 40
+#define FID_LEN (FID_NOBRACE_LEN + 2)
 #define DFID_NOBRACE LPX64":0x%x:0x%x"
 #define DFID "["DFID_NOBRACE"]"
 #define PFID(fid)     \
@@ -601,22 +659,24 @@ enum changelog_rec_type {
         CL_EXT      = 9,  /* namespace extended record (2nd half of rename) */
         CL_OPEN     = 10, /* not currently used */
         CL_CLOSE    = 11, /* may be written to log only with mtime change */
-        CL_IOCTL    = 12,
-        CL_TRUNC    = 13,
-        CL_SETATTR  = 14,
-        CL_XATTR    = 15,
-        CL_HSM      = 16, /* HSM specific events, see flags */
-        CL_MTIME    = 17, /* Precedence: setattr > mtime > ctime > atime */
-        CL_CTIME    = 18,
-        CL_ATIME    = 19,
-        CL_LAST
+       CL_LAYOUT   = 12, /* file layout/striping modified */
+       CL_TRUNC    = 13,
+       CL_SETATTR  = 14,
+       CL_XATTR    = 15,
+       CL_HSM      = 16, /* HSM specific events, see flags */
+       CL_MTIME    = 17, /* Precedence: setattr > mtime > ctime > atime */
+       CL_CTIME    = 18,
+       CL_ATIME    = 19,
+       CL_LAST
 };
 
 static inline const char *changelog_type2str(int type) {
        static const char *changelog_str[] = {
                "MARK",  "CREAT", "MKDIR", "HLINK", "SLINK", "MKNOD", "UNLNK",
-               "RMDIR", "RENME", "RNMTO", "OPEN",  "CLOSE", "IOCTL", "TRUNC",
-               "SATTR", "XATTR", "HSM",   "MTIME", "CTIME", "ATIME"  };
+               "RMDIR", "RENME", "RNMTO", "OPEN",  "CLOSE", "LYOUT", "TRUNC",
+               "SATTR", "XATTR", "HSM",   "MTIME", "CTIME", "ATIME",
+       };
+
        if (type >= 0 && type < CL_LAST)
                return changelog_str[type];
        return NULL;