Whamcloud - gitweb
LU-10822 utils: stop bogus buffer overflow errors
[fs/lustre-release.git] / lustre / include / uapi / linux / lustre / lustre_user.h
index 17c985a..65f718a 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2010, 2016, Intel Corporation.
+ * Copyright (c) 2010, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -42,6 +42,7 @@
  * @{
  */
 
+#include <linux/kernel.h>
 #include <linux/types.h>
 
 #ifdef __KERNEL__
 # include <linux/lustre/lustre_fiemap.h>
 #endif /* __KERNEL__ */
 
+/* Handle older distros */
+#ifndef __ALIGN_KERNEL
+# define __ALIGN_KERNEL(x, a)   __ALIGN_KERNEL_MASK(x, (typeof(x))(a) - 1)
+# define __ALIGN_KERNEL_MASK(x, mask)   (((x) + (mask)) & ~(mask))
+#endif
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
 /*
  * This is a temporary solution of adding quota type.
  * Should be removed as soon as system header is updated.
 };
 #define PRJQUOTA 2
 
-#if defined(__x86_64__) || defined(__ia64__) || defined(__ppc64__) || \
-    defined(__craynv) || defined(__mips64__) || defined(__powerpc64__) || \
-    defined(__aarch64__)
-typedef struct stat    lstat_t;
-# define lstat_f       lstat
-# define fstat_f       fstat
-# define fstatat_f     fstatat
-# define HAVE_LOV_USER_MDS_DATA
-#elif defined(__USE_LARGEFILE64) || defined(__KERNEL__)
-typedef struct stat64  lstat_t;
-# define lstat_f       lstat64
-# define fstat_f       fstat64
-# define fstatat_f     fstatat64
-# define HAVE_LOV_USER_MDS_DATA
+/*
+ * We need to always use 64bit version because the structure
+ * is shared across entire cluster where 32bit and 64bit machines
+ * are co-existing.
+ */
+#if __BITS_PER_LONG != 64 || defined(__ARCH_WANT_STAT64)
+typedef struct stat64   lstat_t;
+#define lstat_f  lstat64
+#define fstat_f         fstat64
+#define fstatat_f       fstatat64
+#else
+typedef struct stat     lstat_t;
+#define lstat_f  lstat
+#define fstat_f         fstat
+#define fstatat_f       fstatat
 #endif
 
+#define HAVE_LOV_USER_MDS_DATA
+
 #define LUSTRE_EOF 0xffffffffffffffffULL
 
 /* for statfs() */
@@ -116,29 +130,30 @@ enum obd_statfs_state {
        OS_STATE_ENOINO         = 0x00000040, /**< not enough inodes */
 };
 
+/** filesystem statistics/attributes for target device */
 struct obd_statfs {
-       __u64           os_type;
-       __u64           os_blocks;
-       __u64           os_bfree;
-       __u64           os_bavail;
-       __u64           os_files;
-       __u64           os_ffree;
-       __u8            os_fsid[40];
-       __u32           os_bsize;
-       __u32           os_namelen;
-       __u64           os_maxbytes;
-       __u32           os_state;       /**< obd_statfs_state OS_STATE_* flag */
-       __u32           os_fprecreated; /* objs available now to the caller */
+       __u64           os_type;        /* EXT4_SUPER_MAGIC, UBERBLOCK_MAGIC */
+       __u64           os_blocks;      /* total size in #os_bsize blocks */
+       __u64           os_bfree;       /* number of unused blocks */
+       __u64           os_bavail;      /* blocks available for allocation */
+       __u64           os_files;       /* total number of objects */
+       __u64           os_ffree;       /* # objects that could be created */
+       __u8            os_fsid[40];    /* identifier for filesystem */
+       __u32           os_bsize;       /* block size in bytes for os_blocks */
+       __u32           os_namelen;     /* maximum length of filename in bytes*/
+       __u64           os_maxbytes;    /* maximum object size in bytes */
+       __u32           os_state;       /**< obd_statfs_state OS_STATE_* flag */
+       __u32           os_fprecreated; /* objs available now to the caller */
                                        /* used in QoS code to find preferred
                                         * OSTs */
-       __u32           os_spare2;
-       __u32           os_spare3;
-       __u32           os_spare4;
-       __u32           os_spare5;
-       __u32           os_spare6;
-       __u32           os_spare7;
-       __u32           os_spare8;
-       __u32           os_spare9;
+       __u32           os_spare2;      /* Unused padding fields.  Remember */
+       __u32           os_spare3;      /* to fix lustre_swab_obd_statfs() */
+       __u32           os_spare4;
+       __u32           os_spare5;
+       __u32           os_spare6;
+       __u32           os_spare7;
+       __u32           os_spare8;
+       __u32           os_spare9;
 };
 
 /**
@@ -193,12 +208,15 @@ struct filter_fid_old {
 struct filter_fid {
        struct lu_fid           ff_parent;
        struct ost_layout       ff_layout;
+       __u32                   ff_layout_version;
+       __u32                   ff_range; /* range of layout version that
+                                          * write are allowed */
 } __attribute__((packed));
 
 /* Userspace should treat lu_fid as opaque, and only use the following methods
  * to print or parse them.  Other functions (e.g. compare, swab) could be moved
  * here from lustre_idl.h if needed. */
-typedef struct lu_fid lustre_fid;
+struct lu_fid;
 
 enum lma_compat {
        LMAC_HSM         = 0x00000001,
@@ -208,6 +226,7 @@ enum lma_compat {
                                       * under /O/<seq>/d<x>. */
        LMAC_STRIPE_INFO = 0x00000010, /* stripe info in the LMA EA. */
        LMAC_COMP_INFO   = 0x00000020, /* Component info in the LMA EA. */
+       LMAC_IDX_BACKUP  = 0x00000040, /* Has index backup. */
 };
 
 /**
@@ -274,6 +293,17 @@ struct lustre_ost_attrs {
  */
 #define LMA_OLD_SIZE (sizeof(struct lustre_mdt_attrs) + 5 * sizeof(__u64))
 
+enum {
+       LSOM_FL_VALID = 1 << 0,
+};
+
+struct lustre_som_attrs {
+       __u16   lsa_valid;
+       __u16   lsa_reserved[3];
+       __u64   lsa_size;
+       __u64   lsa_blocks;
+};
+
 /**
  * OST object IDentifier.
  */
@@ -301,6 +331,33 @@ struct ll_futimes_3 {
 };
 
 /*
+ * Maximum number of mirrors currently implemented.
+ */
+#define LUSTRE_MIRROR_COUNT_MAX                16
+
+/* Lease types for use as arg and return of LL_IOC_{GET,SET}_LEASE ioctl. */
+enum ll_lease_mode {
+       LL_LEASE_RDLCK  = 0x01,
+       LL_LEASE_WRLCK  = 0x02,
+       LL_LEASE_UNLCK  = 0x04,
+};
+
+enum ll_lease_flags {
+       LL_LEASE_RESYNC         = 0x1,
+       LL_LEASE_RESYNC_DONE    = 0x2,
+       LL_LEASE_LAYOUT_MERGE   = 0x4,
+       LL_LEASE_LAYOUT_SPLIT   = 0x8,
+};
+
+#define IOC_IDS_MAX    4096
+struct ll_ioc_lease {
+       __u32           lil_mode;
+       __u32           lil_flags;
+       __u32           lil_count;
+       __u32           lil_ids[0];
+};
+
+/*
  * The ioctl naming rules:
  * LL_*     - works on the currently opened filehandle instead of parent dir
  * *_OBD_*  - gets data for both OSC or MDC (LOV, LMV indirectly)
@@ -339,6 +396,7 @@ struct ll_futimes_3 {
 #define LL_IOC_GET_CONNECT_FLAGS        _IOWR('f', 174, __u64 *)
 #define LL_IOC_GET_MDTIDX               _IOR ('f', 175, int)
 #define LL_IOC_FUTIMES_3               _IOWR('f', 176, struct ll_futimes_3)
+#define LL_IOC_FLR_SET_MIRROR          _IOW ('f', 177, long)
 /*     lustre_ioctl.h                  177-210 */
 #define LL_IOC_HSM_STATE_GET           _IOR('f', 211, struct hsm_user_state)
 #define LL_IOC_HSM_STATE_SET           _IOW('f', 212, struct hsm_state_set)
@@ -356,7 +414,8 @@ struct ll_futimes_3 {
 #define LL_IOC_LMV_SETSTRIPE           _IOWR('f', 240, struct lmv_user_md)
 #define LL_IOC_LMV_GETSTRIPE           _IOWR('f', 241, struct lmv_user_md)
 #define LL_IOC_REMOVE_ENTRY            _IOWR('f', 242, __u64)
-#define LL_IOC_SET_LEASE               _IOWR('f', 243, long)
+#define LL_IOC_SET_LEASE               _IOWR('f', 243, struct ll_ioc_lease)
+#define LL_IOC_SET_LEASE_OLD           _IOWR('f', 243, long)
 #define LL_IOC_GET_LEASE               _IO('f', 244)
 #define LL_IOC_HSM_IMPORT              _IOWR('f', 245, struct hsm_user_import)
 #define LL_IOC_LMV_SET_DEFAULT_STRIPE  _IOWR('f', 246, struct lmv_user_md)
@@ -381,15 +440,9 @@ struct fsxattr {
 #endif
 #define LL_IOC_FSGETXATTR              FS_IOC_FSGETXATTR
 #define LL_IOC_FSSETXATTR              FS_IOC_FSSETXATTR
+#define LL_PROJINHERIT_FL              0x20000000
 
 
-/* Lease types for use as arg and return of LL_IOC_{GET,SET}_LEASE ioctl. */
-enum ll_lease_type {
-       LL_LEASE_RDLCK  = 0x1,
-       LL_LEASE_WRLCK  = 0x2,
-       LL_LEASE_UNLCK  = 0x4,
-};
-
 #define LL_STATFS_LMV          1
 #define LL_STATFS_LOV          2
 #define LL_STATFS_NODELAY      4
@@ -427,21 +480,25 @@ enum ll_lease_type {
 #define LOV_USER_MAGIC_SPECIFIC 0x0BD50BD0     /* for specific OSTs */
 #define LOV_USER_MAGIC_COMP_V1 0x0BD60BD0
 
-#define LMV_USER_MAGIC    0x0CD30CD0    /*default lmv magic*/
+#define LMV_USER_MAGIC         0x0CD30CD0    /* default lmv magic */
+#define LMV_USER_MAGIC_V0      0x0CD20CD0    /* old default lmv magic*/
+#define LMV_USER_MAGIC_SPECIFIC        0x0CD40CD0
 
+#define LOV_PATTERN_NONE       0x000
 #define LOV_PATTERN_RAID0      0x001
 #define LOV_PATTERN_RAID1      0x002
-#define LOV_PATTERN_FIRST      0x100
+#define LOV_PATTERN_MDT                0x100
 #define LOV_PATTERN_CMOBD      0x200
 
 #define LOV_PATTERN_F_MASK     0xffff0000
 #define LOV_PATTERN_F_HOLE     0x40000000 /* there is hole in LOV EA */
 #define LOV_PATTERN_F_RELEASED 0x80000000 /* HSM released file */
+#define LOV_PATTERN_DEFAULT    0xffffffff
 
 static inline bool lov_pattern_supported(__u32 pattern)
 {
-       return pattern == LOV_PATTERN_RAID0 ||
-              pattern == (LOV_PATTERN_RAID0 | LOV_PATTERN_F_RELEASED);
+       return (pattern & ~LOV_PATTERN_F_RELEASED) == LOV_PATTERN_RAID0 ||
+              (pattern & ~LOV_PATTERN_F_RELEASED) == LOV_PATTERN_MDT;
 }
 
 #define LOV_MAXPOOLNAME 15
@@ -510,7 +567,7 @@ struct lu_extent {
        __u64   e_end;
 };
 
-#define DEXT "[ %#llx , %#llx )"
+#define DEXT "[%#llx, %#llx)"
 #define PEXT(ext) (ext)->e_start, (ext)->e_end
 
 static inline bool lu_extent_is_overlapped(struct lu_extent *e1,
@@ -519,17 +576,30 @@ static inline bool lu_extent_is_overlapped(struct lu_extent *e1,
        return e1->e_start < e2->e_end && e2->e_start < e1->e_end;
 }
 
+static inline bool lu_extent_is_whole(struct lu_extent *e)
+{
+       return e->e_start == 0 && e->e_end == LUSTRE_EOF;
+}
+
 enum lov_comp_md_entry_flags {
-       LCME_FL_PRIMARY = 0x00000001,   /* Not used */
-       LCME_FL_STALE   = 0x00000002,   /* Not used */
-       LCME_FL_OFFLINE = 0x00000004,   /* Not used */
-       LCME_FL_PREFERRED = 0x00000008, /* Not used */
+       LCME_FL_STALE   = 0x00000001,   /* FLR: stale data */
+       LCME_FL_PREF_RD = 0x00000002,   /* FLR: preferred for reading */
+       LCME_FL_PREF_WR = 0x00000004,   /* FLR: preferred for writing */
+       LCME_FL_PREF_RW = LCME_FL_PREF_RD | LCME_FL_PREF_WR,
+       LCME_FL_OFFLINE = 0x00000008,   /* Not used */
        LCME_FL_INIT    = 0x00000010,   /* instantiated */
        LCME_FL_NEG     = 0x80000000    /* used to indicate a negative flag,
                                           won't be stored on disk */
 };
 
-#define LCME_KNOWN_FLAGS       (LCME_FL_NEG | LCME_FL_INIT)
+#define LCME_KNOWN_FLAGS       (LCME_FL_NEG | LCME_FL_INIT | LCME_FL_STALE | \
+                                LCME_FL_PREF_RW)
+/* The flags can be set by users at mirror creation time. */
+#define LCME_USER_FLAGS                (LCME_FL_PREF_RW)
+
+/* the highest bit in obdo::o_layout_version is used to mark if the file is
+ * being resynced. */
+#define LU_LAYOUT_RESYNC       LCME_FL_NEG
 
 /* lcme_id can be specified as certain flags, and the the first
  * bit of lcme_id is used to indicate that the ID is representing
@@ -554,7 +624,33 @@ struct lov_comp_md_entry_v1 {
        __u64                   lcme_padding[2];
 } __attribute__((packed));
 
-enum lov_comp_md_flags;
+#define SEQ_ID_MAX             0x0000FFFF
+#define SEQ_ID_MASK            SEQ_ID_MAX
+/* bit 30:16 of lcme_id is used to store mirror id */
+#define MIRROR_ID_MASK         0x7FFF0000
+#define MIRROR_ID_SHIFT                16
+
+static inline __u32 pflr_id(__u16 mirror_id, __u16 seqid)
+{
+       return ((mirror_id << MIRROR_ID_SHIFT) & MIRROR_ID_MASK) | seqid;
+}
+
+static inline __u16 mirror_id_of(__u32 id)
+{
+       return (id & MIRROR_ID_MASK) >> MIRROR_ID_SHIFT;
+}
+
+/**
+ * on-disk data for lcm_flags. Valid if lcm_magic is LOV_MAGIC_COMP_V1.
+ */
+enum lov_comp_md_flags {
+       /* the least 2 bits are used by FLR to record file state */
+       LCM_FL_NONE          = 0,
+       LCM_FL_RDONLY           = 1,
+       LCM_FL_WRITE_PENDING    = 2,
+       LCM_FL_SYNC_PENDING     = 3,
+       LCM_FL_FLR_MASK         = 0x3,
+};
 
 struct lov_comp_md_v1 {
        __u32   lcm_magic;      /* LOV_USER_MAGIC_COMP_V1 */
@@ -562,7 +658,10 @@ struct lov_comp_md_v1 {
        __u32   lcm_layout_gen;
        __u16   lcm_flags;
        __u16   lcm_entry_count;
-       __u64   lcm_padding1;
+       /* lcm_mirror_count stores the number of actual mirrors minus 1,
+        * so that non-flr files will have value 0 meaning 1 mirror. */
+       __u16   lcm_mirror_count;
+       __u16   lcm_padding1[3];
        __u64   lcm_padding2;
        struct lov_comp_md_entry_v1 lcm_entries[0];
 } __attribute__((packed));
@@ -588,11 +687,6 @@ struct lov_user_mds_data_v1 {
        lstat_t lmd_st;                 /* MDS stat struct */
        struct lov_user_md_v1 lmd_lmm;  /* LOV EA V1 user data */
 } __attribute__((packed));
-
-struct lov_user_mds_data_v3 {
-       lstat_t lmd_st;                 /* MDS stat struct */
-       struct lov_user_md_v3 lmd_lmm;  /* LOV EA V3 user data */
-} __attribute__((packed));
 #endif
 
 struct lmv_user_mds_data {
@@ -797,14 +891,14 @@ struct identity_downcall_data {
 #endif /* !__KERNEL__ */
 
 /* lustre volatile file support
- * file name header: .^L^S^T^R:volatile"
+ * file name header: ".^L^S^T^R:volatile"
  */
 #define LUSTRE_VOLATILE_HDR    ".\x0c\x13\x14\x12:VOLATILE"
 #define LUSTRE_VOLATILE_HDR_LEN        14
 
-typedef enum lustre_quota_version {
+enum lustre_quota_version {
        LUSTRE_QUOTA_V2 = 1
-} lustre_quota_version_t;
+};
 
 /* XXX: same as if_dqinfo struct in kernel */
 struct obd_dqinfo {
@@ -865,6 +959,85 @@ struct lustre_swap_layouts {
        __u64   sl_dv2;
 };
 
+/** Bit-mask of valid attributes */
+/* The LA_* flags are written to disk as part of the ChangeLog records
+ * so they are part of the on-disk and network protocol, and cannot be changed.
+ * Only the first 12 bits are currently saved.
+ */
+enum la_valid {
+       LA_ATIME = 1 << 0,
+       LA_MTIME = 1 << 1,
+       LA_CTIME = 1 << 2,
+       LA_SIZE  = 1 << 3,
+       LA_MODE  = 1 << 4,
+       LA_UID   = 1 << 5,
+       LA_GID   = 1 << 6,
+       LA_BLOCKS = 1 << 7,
+       LA_TYPE   = 1 << 8,
+       LA_FLAGS  = 1 << 9,
+       LA_NLINK  = 1 << 10,
+       LA_RDEV   = 1 << 11,
+       LA_BLKSIZE = 1 << 12,
+       LA_KILL_SUID = 1 << 13,
+       LA_KILL_SGID = 1 << 14,
+       LA_PROJID    = 1 << 15,
+       LA_LAYOUT_VERSION = 1 << 16,
+       /**
+        * Attributes must be transmitted to OST objects
+        */
+       LA_REMOTE_ATTR_SET = (LA_UID | LA_GID | LA_PROJID | LA_LAYOUT_VERSION)
+};
+
+#define MDS_FMODE_READ           00000001
+#define MDS_FMODE_WRITE          00000002
+
+#define MDS_FMODE_CLOSED         00000000
+#define MDS_FMODE_EXEC           00000004
+/*     MDS_FMODE_EPOCH          01000000 obsolete since 2.8.0 */
+/*     MDS_FMODE_TRUNC          02000000 obsolete since 2.8.0 */
+/*     MDS_FMODE_SOM            04000000 obsolete since 2.8.0 */
+
+#define MDS_OPEN_CREATED         00000010
+#define MDS_OPEN_CROSS           00000020
+
+#define MDS_OPEN_CREAT           00000100
+#define MDS_OPEN_EXCL            00000200
+#define MDS_OPEN_TRUNC           00001000
+#define MDS_OPEN_APPEND          00002000
+#define MDS_OPEN_SYNC            00010000
+#define MDS_OPEN_DIRECTORY       00200000
+
+#define MDS_OPEN_BY_FID                040000000 /* open_by_fid for known object */
+#define MDS_OPEN_DELAY_CREATE  0100000000 /* delay initial object create */
+#define MDS_OPEN_OWNEROVERRIDE 0200000000 /* NFSD rw-reopen ro file for owner */
+#define MDS_OPEN_JOIN_FILE     0400000000 /* open for join file.
+                                          * We do not support JOIN FILE
+                                          * anymore, reserve this flags
+                                          * just for preventing such bit
+                                          * to be reused. */
+
+#define MDS_OPEN_LOCK         04000000000 /* This open requires open lock */
+#define MDS_OPEN_HAS_EA      010000000000 /* specify object create pattern */
+#define MDS_OPEN_HAS_OBJS    020000000000 /* Just set the EA the obj exist */
+#define MDS_OPEN_NORESTORE  0100000000000ULL /* Do not restore file at open */
+#define MDS_OPEN_NEWSTRIPE  0200000000000ULL /* New stripe needed (restripe or
+                                             * hsm restore) */
+#define MDS_OPEN_VOLATILE   0400000000000ULL /* File is volatile = created
+                                               unlinked */
+#define MDS_OPEN_LEASE    01000000000000ULL /* Open the file and grant lease
+                                             * delegation, succeed if it's not
+                                             * being opened with conflict mode.
+                                             */
+#define MDS_OPEN_RELEASE   02000000000000ULL /* Open the file for HSM release */
+
+#define MDS_OPEN_RESYNC    04000000000000ULL /* FLR: file resync */
+
+/* lustre internal open flags, which should not be set from user space */
+#define MDS_OPEN_FL_INTERNAL (MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS |    \
+                             MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK |  \
+                             MDS_OPEN_BY_FID | MDS_OPEN_LEASE |        \
+                             MDS_OPEN_RELEASE | MDS_OPEN_RESYNC)
+
 
 /********* Changelogs **********/
 /** Changelog record types */
@@ -884,12 +1057,17 @@ enum changelog_rec_type {
        CL_LAYOUT   = 12, /* file layout/striping modified */
        CL_TRUNC    = 13,
        CL_SETATTR  = 14,
-       CL_XATTR    = 15,
+       CL_SETXATTR = 15,
+       CL_XATTR    = CL_SETXATTR, /* Deprecated name */
        CL_HSM      = 16, /* HSM specific events, see flags */
        CL_MTIME    = 17, /* Precedence: setattr > mtime > ctime > atime */
        CL_CTIME    = 18,
        CL_ATIME    = 19,
        CL_MIGRATE  = 20,
+       CL_FLRW     = 21, /* FLR: file was firstly written */
+       CL_RESYNC   = 22, /* FLR: file was resync-ed */
+       CL_GETXATTR = 23,
+       CL_DN_OPEN  = 24, /* denied open */
        CL_LAST
 };
 
@@ -897,7 +1075,8 @@ 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", "LYOUT", "TRUNC",
-               "SATTR", "XATTR", "HSM",   "MTIME", "CTIME", "ATIME", "MIGRT"
+               "SATTR", "XATTR", "HSM",   "MTIME", "CTIME", "ATIME", "MIGRT",
+               "FLRW",  "RESYNC","GXATR", "NOPEN",
        };
 
        if (type >= 0 && type < CL_LAST)
@@ -913,7 +1092,8 @@ enum changelog_rec_flags {
        CLF_VERSION     = 0x1000,
        CLF_RENAME      = 0x2000,
        CLF_JOBID       = 0x4000,
-       CLF_SUPPORTED   = CLF_VERSION | CLF_RENAME | CLF_JOBID
+       CLF_EXTRA_FLAGS = 0x8000,
+       CLF_SUPPORTED   = CLF_VERSION | CLF_RENAME | CLF_JOBID | CLF_EXTRA_FLAGS
 };
 
 
@@ -998,28 +1178,52 @@ static inline void hsm_set_cl_error(int *flags, int error)
        *flags |= (error << CLF_HSM_ERR_L);
 }
 
+enum changelog_rec_extra_flags {
+       CLFE_INVALID    = 0,
+       CLFE_UIDGID     = 0x0001,
+       CLFE_NID        = 0x0002,
+       CLFE_OPEN       = 0x0004,
+       CLFE_XATTR      = 0x0008,
+       CLFE_SUPPORTED  = CLFE_UIDGID | CLFE_NID | CLFE_OPEN | CLFE_XATTR
+};
+
 enum changelog_send_flag {
        /* Not yet implemented */
-       CHANGELOG_FLAG_FOLLOW   = 0x01,
+       CHANGELOG_FLAG_FOLLOW      = 0x01,
        /* Blocking IO makes sense in case of slow user parsing of the records,
         * but it also prevents us from cleaning up if the records are not
         * consumed. */
-       CHANGELOG_FLAG_BLOCK    = 0x02,
+       CHANGELOG_FLAG_BLOCK       = 0x02,
        /* Pack jobid into the changelog records if available. */
-       CHANGELOG_FLAG_JOBID    = 0x04,
+       CHANGELOG_FLAG_JOBID       = 0x04,
+       /* Pack additional flag bits into the changelog record */
+       CHANGELOG_FLAG_EXTRA_FLAGS = 0x08,
 };
 
-#define CR_MAXSIZE cfs_size_round(2 * NAME_MAX + 2 + \
-                                 changelog_rec_offset(CLF_SUPPORTED))
+enum changelog_send_extra_flag {
+       /* Pack uid/gid into the changelog record */
+       CHANGELOG_EXTRA_FLAG_UIDGID = 0x01,
+       /* Pack nid into the changelog record */
+       CHANGELOG_EXTRA_FLAG_NID    = 0x02,
+       /* Pack open mode into the changelog record */
+       CHANGELOG_EXTRA_FLAG_OMODE  = 0x04,
+       /* Pack xattr name into the changelog record */
+       CHANGELOG_EXTRA_FLAG_XATTR  = 0x08,
+};
+
+#define CR_MAXSIZE __ALIGN_KERNEL(2 * NAME_MAX + 2 + \
+                                 changelog_rec_offset(CLF_SUPPORTED, \
+                                                      CLFE_SUPPORTED), 8)
 
 /* 31 usable bytes string + null terminator. */
 #define LUSTRE_JOBID_SIZE      32
 
 /* This is the minimal changelog record. It can contain extensions
  * such as rename fields or process jobid. Its exact content is described
- * by the cr_flags.
+ * by the cr_flags and cr_extra_flags.
  *
- * Extensions are packed in the same order as their corresponding flags.
+ * Extensions are packed in the same order as their corresponding flags,
+ * then in the same order as their corresponding extra flags.
  */
 struct changelog_rec {
        __u16                   cr_namelen;
@@ -1029,16 +1233,16 @@ struct changelog_rec {
        __u64                   cr_prev;  /**< last index for this target fid */
        __u64                   cr_time;
        union {
-               lustre_fid      cr_tfid;        /**< target fid */
+               struct lu_fid   cr_tfid;        /**< target fid */
                __u32           cr_markerflags; /**< CL_MARK flags */
        };
-       lustre_fid              cr_pfid;        /**< parent fid */
+       struct lu_fid           cr_pfid;        /**< parent fid */
 };
 
 /* Changelog extension for RENAME. */
 struct changelog_ext_rename {
-       lustre_fid              cr_sfid;     /**< source fid, or zero */
-       lustre_fid              cr_spfid;    /**< source parent fid, or zero */
+       struct lu_fid           cr_sfid;     /**< source fid, or zero */
+       struct lu_fid           cr_spfid;    /**< source parent fid, or zero */
 };
 
 /* Changelog extension to include JOBID. */
@@ -1046,8 +1250,41 @@ struct changelog_ext_jobid {
        char    cr_jobid[LUSTRE_JOBID_SIZE];    /**< zero-terminated string. */
 };
 
+/* Changelog extension to include additional flags. */
+struct changelog_ext_extra_flags {
+       __u64 cr_extra_flags; /* Additional CLFE_* flags */
+};
+
+/* Changelog extra extension to include UID/GID. */
+struct changelog_ext_uidgid {
+       __u64   cr_uid;
+       __u64   cr_gid;
+};
+
+/* Changelog extra extension to include NID. */
+struct changelog_ext_nid {
+       /* have __u64 instead of lnet_nid_t type for use by client api */
+       __u64 cr_nid;
+       /* for use when IPv6 support is added */
+       __u64 extra;
+       __u32 padding;
+};
+
+/* Changelog extra extension to include OPEN mode. */
+struct changelog_ext_openmode {
+       __u32 cr_openflags;
+};
+
+/* Changelog extra extension to include xattr */
+struct changelog_ext_xattr {
+       char cr_xattr[XATTR_NAME_MAX + 1]; /**< zero-terminated string. */
+};
+
+static inline struct changelog_ext_extra_flags *changelog_rec_extra_flags(
+       const struct changelog_rec *rec);
 
-static inline size_t changelog_rec_offset(enum changelog_rec_flags crf)
+static inline size_t changelog_rec_offset(enum changelog_rec_flags crf,
+                                         enum changelog_rec_extra_flags cref)
 {
        size_t size = sizeof(struct changelog_rec);
 
@@ -1057,12 +1294,29 @@ static inline size_t changelog_rec_offset(enum changelog_rec_flags crf)
        if (crf & CLF_JOBID)
                size += sizeof(struct changelog_ext_jobid);
 
+       if (crf & CLF_EXTRA_FLAGS) {
+               size += sizeof(struct changelog_ext_extra_flags);
+               if (cref & CLFE_UIDGID)
+                       size += sizeof(struct changelog_ext_uidgid);
+               if (cref & CLFE_NID)
+                       size += sizeof(struct changelog_ext_nid);
+               if (cref & CLFE_OPEN)
+                       size += sizeof(struct changelog_ext_openmode);
+               if (cref & CLFE_XATTR)
+                       size += sizeof(struct changelog_ext_xattr);
+       }
+
        return size;
 }
 
 static inline size_t changelog_rec_size(const struct changelog_rec *rec)
 {
-       return changelog_rec_offset(rec->cr_flags);
+       enum changelog_rec_extra_flags cref = CLFE_INVALID;
+
+       if (rec->cr_flags & CLF_EXTRA_FLAGS)
+               cref = changelog_rec_extra_flags(rec)->cr_extra_flags;
+
+       return changelog_rec_offset(rec->cr_flags, cref);
 }
 
 static inline size_t changelog_rec_varsize(const struct changelog_rec *rec)
@@ -1076,7 +1330,8 @@ struct changelog_ext_rename *changelog_rec_rename(const struct changelog_rec *re
        enum changelog_rec_flags crf = rec->cr_flags & CLF_VERSION;
 
        return (struct changelog_ext_rename *)((char *)rec +
-                                              changelog_rec_offset(crf));
+                                              changelog_rec_offset(crf,
+                                                                CLFE_INVALID));
 }
 
 /* The jobid follows the rename extension, if present */
@@ -1087,14 +1342,96 @@ struct changelog_ext_jobid *changelog_rec_jobid(const struct changelog_rec *rec)
                                        (CLF_VERSION | CLF_RENAME);
 
        return (struct changelog_ext_jobid *)((char *)rec +
-                                             changelog_rec_offset(crf));
+                                             changelog_rec_offset(crf,
+                                                                CLFE_INVALID));
 }
 
-/* The name follows the rename and jobid extensions, if present */
+/* The additional flags follow the rename and jobid extensions, if present */
+static inline
+struct changelog_ext_extra_flags *changelog_rec_extra_flags(
+       const struct changelog_rec *rec)
+{
+       enum changelog_rec_flags crf = rec->cr_flags &
+               (CLF_VERSION | CLF_RENAME | CLF_JOBID);
+
+       return (struct changelog_ext_extra_flags *)((char *)rec +
+                                                changelog_rec_offset(crf,
+                                                                CLFE_INVALID));
+}
+
+/* The uid/gid is the first extra extension */
+static inline
+struct changelog_ext_uidgid *changelog_rec_uidgid(
+       const struct changelog_rec *rec)
+{
+       enum changelog_rec_flags crf = rec->cr_flags &
+               (CLF_VERSION | CLF_RENAME | CLF_JOBID | CLF_EXTRA_FLAGS);
+
+       return (struct changelog_ext_uidgid *)((char *)rec +
+                                              changelog_rec_offset(crf,
+                                                                CLFE_INVALID));
+}
+
+/* The nid is the second extra extension */
+static inline
+struct changelog_ext_nid *changelog_rec_nid(const struct changelog_rec *rec)
+{
+       enum changelog_rec_flags crf = rec->cr_flags &
+               (CLF_VERSION | CLF_RENAME | CLF_JOBID | CLF_EXTRA_FLAGS);
+       enum changelog_rec_extra_flags cref = CLFE_INVALID;
+
+       if (rec->cr_flags & CLF_EXTRA_FLAGS)
+               cref = changelog_rec_extra_flags(rec)->cr_extra_flags &
+                      CLFE_UIDGID;
+
+       return (struct changelog_ext_nid *)((char *)rec +
+                                           changelog_rec_offset(crf, cref));
+}
+
+/* The OPEN mode is the third extra extension */
+static inline
+struct changelog_ext_openmode *changelog_rec_openmode(
+       const struct changelog_rec *rec)
+{
+       enum changelog_rec_flags crf = rec->cr_flags &
+               (CLF_VERSION | CLF_RENAME | CLF_JOBID | CLF_EXTRA_FLAGS);
+       enum changelog_rec_extra_flags cref = CLFE_INVALID;
+
+       if (rec->cr_flags & CLF_EXTRA_FLAGS)
+               cref = changelog_rec_extra_flags(rec)->cr_extra_flags &
+                      (CLFE_UIDGID | CLFE_NID);
+
+       return (struct changelog_ext_openmode *)((char *)rec +
+                                              changelog_rec_offset(crf, cref));
+}
+
+/* The xattr name is the fourth extra extension */
+static inline
+struct changelog_ext_xattr *changelog_rec_xattr(
+       const struct changelog_rec *rec)
+{
+       enum changelog_rec_flags crf = rec->cr_flags &
+               (CLF_VERSION | CLF_RENAME | CLF_JOBID | CLF_EXTRA_FLAGS);
+       enum changelog_rec_extra_flags cref = CLFE_INVALID;
+
+       if (rec->cr_flags & CLF_EXTRA_FLAGS)
+               cref = changelog_rec_extra_flags(rec)->cr_extra_flags &
+                       (CLFE_UIDGID | CLFE_NID | CLFE_OPEN);
+
+       return (struct changelog_ext_xattr *)((char *)rec +
+                                             changelog_rec_offset(crf, cref));
+}
+
+/* The name follows the rename, jobid  and extra flags extns, if present */
 static inline char *changelog_rec_name(const struct changelog_rec *rec)
 {
-       return (char *)rec + changelog_rec_offset(rec->cr_flags &
-                                                 CLF_SUPPORTED);
+       enum changelog_rec_extra_flags cref = CLFE_INVALID;
+
+       if (rec->cr_flags & CLF_EXTRA_FLAGS)
+               cref = changelog_rec_extra_flags(rec)->cr_extra_flags;
+
+       return (char *)rec + changelog_rec_offset(rec->cr_flags & CLF_SUPPORTED,
+                                                 cref & CLFE_SUPPORTED);
 }
 
 static inline size_t changelog_rec_snamelen(const struct changelog_rec *rec)
@@ -1124,32 +1461,101 @@ static inline char *changelog_rec_sname(const struct changelog_rec *rec)
  * The following assumptions are being made:
  *   - CLF_RENAME will not be removed
  *   - CLF_JOBID will not be added without CLF_RENAME being added too
+ *   - CLF_EXTRA_FLAGS will not be added without CLF_JOBID being added too
  *
  * @param[in,out]  rec         The record to remap.
  * @param[in]      crf_wanted  Flags describing the desired extensions.
+ * @param[in]      cref_want   Flags describing the desired extra extensions.
  */
 static inline void changelog_remap_rec(struct changelog_rec *rec,
-                                      enum changelog_rec_flags crf_wanted)
+                                      enum changelog_rec_flags crf_wanted,
+                                      enum changelog_rec_extra_flags cref_want)
 {
+       char *xattr_mov = NULL;
+       char *omd_mov = NULL;
+       char *nid_mov = NULL;
+       char *uidgid_mov = NULL;
+       char *ef_mov;
        char *jid_mov;
        char *rnm_mov;
+       enum changelog_rec_extra_flags cref = CLFE_INVALID;
 
        crf_wanted &= CLF_SUPPORTED;
-
-       if ((rec->cr_flags & CLF_SUPPORTED) == crf_wanted)
-               return;
+       cref_want &= CLFE_SUPPORTED;
+
+       if ((rec->cr_flags & CLF_SUPPORTED) == crf_wanted) {
+               if (!(rec->cr_flags & CLF_EXTRA_FLAGS) ||
+                   (rec->cr_flags & CLF_EXTRA_FLAGS &&
+                   (changelog_rec_extra_flags(rec)->cr_extra_flags &
+                                                       CLFE_SUPPORTED) ==
+                                                                    cref_want))
+                       return;
+       }
 
        /* First move the variable-length name field */
-       memmove((char *)rec + changelog_rec_offset(crf_wanted),
+       memmove((char *)rec + changelog_rec_offset(crf_wanted, cref_want),
                changelog_rec_name(rec), rec->cr_namelen);
 
-       /* Locations of jobid and rename extensions in the remapped record */
+       /* Locations of extensions in the remapped record */
+       if (rec->cr_flags & CLF_EXTRA_FLAGS) {
+               xattr_mov = (char *)rec +
+                       changelog_rec_offset(crf_wanted & CLF_SUPPORTED,
+                                            cref_want & ~CLFE_XATTR);
+               omd_mov = (char *)rec +
+                       changelog_rec_offset(crf_wanted & CLF_SUPPORTED,
+                                            cref_want & ~(CLFE_OPEN |
+                                                          CLFE_XATTR));
+               nid_mov = (char *)rec +
+                       changelog_rec_offset(crf_wanted & CLF_SUPPORTED,
+                                            cref_want & ~(CLFE_NID |
+                                                          CLFE_OPEN |
+                                                          CLFE_XATTR));
+               uidgid_mov = (char *)rec +
+                       changelog_rec_offset(crf_wanted & CLF_SUPPORTED,
+                                            cref_want & ~(CLFE_UIDGID |
+                                                          CLFE_NID |
+                                                          CLFE_OPEN |
+                                                          CLFE_XATTR));
+               cref = changelog_rec_extra_flags(rec)->cr_extra_flags;
+       }
+
+       ef_mov  = (char *)rec +
+                 changelog_rec_offset(crf_wanted & ~CLF_EXTRA_FLAGS,
+                                      CLFE_INVALID);
        jid_mov = (char *)rec +
-                 changelog_rec_offset(crf_wanted & ~CLF_JOBID);
+                 changelog_rec_offset(crf_wanted &
+                                      ~(CLF_EXTRA_FLAGS | CLF_JOBID),
+                                      CLFE_INVALID);
        rnm_mov = (char *)rec +
-                 changelog_rec_offset(crf_wanted & ~(CLF_JOBID | CLF_RENAME));
+                 changelog_rec_offset(crf_wanted &
+                                      ~(CLF_EXTRA_FLAGS |
+                                        CLF_JOBID |
+                                        CLF_RENAME),
+                                      CLFE_INVALID);
 
        /* Move the extension fields to the desired positions */
+       if ((crf_wanted & CLF_EXTRA_FLAGS) &&
+           (rec->cr_flags & CLF_EXTRA_FLAGS)) {
+               if ((cref_want & CLFE_XATTR) && (cref & CLFE_XATTR))
+                       memmove(xattr_mov, changelog_rec_xattr(rec),
+                               sizeof(struct changelog_ext_xattr));
+
+               if ((cref_want & CLFE_OPEN) && (cref & CLFE_OPEN))
+                       memmove(omd_mov, changelog_rec_openmode(rec),
+                               sizeof(struct changelog_ext_openmode));
+
+               if ((cref_want & CLFE_NID) && (cref & CLFE_NID))
+                       memmove(nid_mov, changelog_rec_nid(rec),
+                               sizeof(struct changelog_ext_nid));
+
+               if ((cref_want & CLFE_UIDGID) && (cref & CLFE_UIDGID))
+                       memmove(uidgid_mov, changelog_rec_uidgid(rec),
+                               sizeof(struct changelog_ext_uidgid));
+
+               memmove(ef_mov, changelog_rec_extra_flags(rec),
+                       sizeof(struct changelog_ext_extra_flags));
+       }
+
        if ((crf_wanted & CLF_JOBID) && (rec->cr_flags & CLF_JOBID))
                memmove(jid_mov, changelog_rec_jobid(rec),
                        sizeof(struct changelog_ext_jobid));
@@ -1159,6 +1565,26 @@ static inline void changelog_remap_rec(struct changelog_rec *rec,
                        sizeof(struct changelog_ext_rename));
 
        /* Clear newly added fields */
+       if (xattr_mov && (cref_want & CLFE_XATTR) &&
+           !(cref & CLFE_XATTR))
+               memset(xattr_mov, 0, sizeof(struct changelog_ext_xattr));
+
+       if (omd_mov && (cref_want & CLFE_OPEN) &&
+           !(cref & CLFE_OPEN))
+               memset(omd_mov, 0, sizeof(struct changelog_ext_openmode));
+
+       if (nid_mov && (cref_want & CLFE_NID) &&
+           !(cref & CLFE_NID))
+               memset(nid_mov, 0, sizeof(struct changelog_ext_nid));
+
+       if (uidgid_mov && (cref_want & CLFE_UIDGID) &&
+           !(cref & CLFE_UIDGID))
+               memset(uidgid_mov, 0, sizeof(struct changelog_ext_uidgid));
+
+       if ((crf_wanted & CLF_EXTRA_FLAGS) &&
+           !(rec->cr_flags & CLF_EXTRA_FLAGS))
+               memset(ef_mov, 0, sizeof(struct changelog_ext_extra_flags));
+
        if ((crf_wanted & CLF_JOBID) && !(rec->cr_flags & CLF_JOBID))
                memset(jid_mov, 0, sizeof(struct changelog_ext_jobid));
 
@@ -1167,6 +1593,10 @@ static inline void changelog_remap_rec(struct changelog_rec *rec,
 
        /* Update the record's flags accordingly */
        rec->cr_flags = (rec->cr_flags & CLF_FLAGMASK) | crf_wanted;
+       if (rec->cr_flags & CLF_EXTRA_FLAGS)
+               changelog_rec_extra_flags(rec)->cr_extra_flags =
+                       changelog_rec_extra_flags(rec)->cr_extra_flags |
+                       cref_want;
 }
 
 enum changelog_message_type {
@@ -1177,11 +1607,15 @@ enum changelog_message_type {
 /********* Misc **********/
 
 struct ioc_data_version {
-       __u64 idv_version;
-       __u64 idv_flags;     /* See LL_DV_xxx */
+       __u64   idv_version;
+       __u32   idv_layout_version; /* FLR: layout version for OST objects */
+       __u32   idv_flags;      /* enum ioc_data_version_flags */
+};
+
+enum ioc_data_version_flags {
+       LL_DV_RD_FLUSH  = (1 << 0), /* Flush dirty pages from clients */
+       LL_DV_WR_FLUSH  = (1 << 1), /* Flush all caching pages from clients */
 };
-#define LL_DV_RD_FLUSH (1 << 0) /* Flush dirty pages from clients */
-#define LL_DV_WR_FLUSH (1 << 1) /* Flush all caching pages from clients */
 
 #ifndef offsetof
 #define offsetof(typ, memb)     ((unsigned long)((char *)&(((typ *)0)->memb)))
@@ -1323,7 +1757,7 @@ struct hsm_request {
 };
 
 struct hsm_user_item {
-       lustre_fid        hui_fid;
+       struct lu_fid        hui_fid;
        struct hsm_extent hui_extent;
 } __attribute__((packed));
 
@@ -1393,8 +1827,8 @@ static inline const char *hsm_copytool_action2name(enum hsm_copytool_action  a)
 struct hsm_action_item {
        __u32      hai_len;     /* valid size of this struct */
        __u32      hai_action;  /* hsm_copytool_action, but use known size */
-       lustre_fid hai_fid;     /* Lustre FID to operate on */
-       lustre_fid hai_dfid;    /* fid used for data access */
+       struct lu_fid hai_fid;     /* Lustre FID to operate on */
+       struct lu_fid hai_dfid;    /* fid used for data access */
        struct hsm_extent hai_extent;  /* byte range to operate on */
        __u64      hai_cookie;  /* action cookie from coordinator */
        __u64      hai_gid;     /* grouplock id */
@@ -1446,27 +1880,20 @@ struct hsm_action_list {
           boundaries. See hai_zero */
 } __attribute__((packed));
 
-#ifndef HAVE_CFS_SIZE_ROUND
-static inline int cfs_size_round (int val)
-{
-       return (val + 7) & (~0x7);
-}
-#define HAVE_CFS_SIZE_ROUND
-#endif
-
 /* Return pointer to first hai in action list */
 static inline struct hsm_action_item *hai_first(struct hsm_action_list *hal)
 {
-       return (struct hsm_action_item *)(hal->hal_fsname +
-                                         cfs_size_round(strlen(hal-> \
-                                                               hal_fsname)
-                                                        + 1));
+       size_t offset = __ALIGN_KERNEL(strlen(hal->hal_fsname) + 1, 8);
+
+       return (struct hsm_action_item *)(hal->hal_fsname + offset);
 }
+
 /* Return pointer to next hai */
 static inline struct hsm_action_item * hai_next(struct hsm_action_item *hai)
 {
-       return (struct hsm_action_item *)((char *)hai +
-                                         cfs_size_round(hai->hai_len));
+       size_t offset = __ALIGN_KERNEL(hai->hai_len, 8);
+
+       return (struct hsm_action_item *)((char *)hai + offset);
 }
 
 /* Return size of an hsm_action_list */
@@ -1476,10 +1903,10 @@ static inline size_t hal_size(struct hsm_action_list *hal)
        size_t sz;
        struct hsm_action_item *hai;
 
-       sz = sizeof(*hal) + cfs_size_round(strlen(hal->hal_fsname) + 1);
+       sz = sizeof(*hal) + __ALIGN_KERNEL(strlen(hal->hal_fsname) + 1, 8);
        hai = hai_first(hal);
        for (i = 0; i < hal->hal_count ; i++, hai = hai_next(hai))
-               sz += cfs_size_round(hai->hai_len);
+               sz += __ALIGN_KERNEL(hai->hai_len, 8);
 
        return sz;
 }
@@ -1504,7 +1931,7 @@ struct hsm_user_import {
 #define HP_FLAG_RETRY     0x02
 
 struct hsm_progress {
-       lustre_fid              hp_fid;
+       struct lu_fid           hp_fid;
        __u64                   hp_cookie;
        struct hsm_extent       hp_extent;
        __u16                   hp_flags;
@@ -1549,11 +1976,16 @@ enum lu_ladvise_type {
        LU_LADVISE_INVALID      = 0,
        LU_LADVISE_WILLREAD     = 1,
        LU_LADVISE_DONTNEED     = 2,
+       LU_LADVISE_LOCKNOEXPAND = 3,
+       LU_LADVISE_LOCKAHEAD    = 4,
+       LU_LADVISE_MAX
 };
 
 #define LU_LADVISE_NAMES {                                             \
-       [LU_LADVISE_WILLREAD]   = "willread",                           \
-       [LU_LADVISE_DONTNEED]   = "dontneed",                           \
+       [LU_LADVISE_WILLREAD]           = "willread",                   \
+       [LU_LADVISE_DONTNEED]           = "dontneed",                   \
+       [LU_LADVISE_LOCKNOEXPAND]       = "locknoexpand",               \
+       [LU_LADVISE_LOCKAHEAD]          = "lockahead",                  \
 }
 
 /* This is the userspace argument for ladvise.  It is currently the same as
@@ -1571,10 +2003,20 @@ struct llapi_lu_ladvise {
 
 enum ladvise_flag {
        LF_ASYNC        = 0x00000001,
+       LF_UNSET        = 0x00000002,
 };
 
 #define LADVISE_MAGIC 0x1ADF1CE0
-#define LF_MASK LF_ASYNC
+/* Masks of valid flags for each advice */
+#define LF_LOCKNOEXPAND_MASK LF_UNSET
+/* Flags valid for all advices not explicitly specified */
+#define LF_DEFAULT_MASK LF_ASYNC
+/* All flags */
+#define LF_MASK (LF_ASYNC | LF_UNSET)
+
+#define lla_lockahead_mode   lla_value1
+#define lla_peradvice_flags    lla_value2
+#define lla_lockahead_result lla_value3
 
 /* This is the userspace argument for ladvise, corresponds to ladvise_hdr which
  * is used on the wire.  It is defined separately as we may need info which is
@@ -1617,5 +2059,27 @@ struct sk_hmac_type {
        size_t   sht_bytes;
 };
 
+enum lock_mode_user {
+       MODE_READ_USER = 1,
+       MODE_WRITE_USER,
+       MODE_MAX_USER,
+};
+
+#define LOCK_MODE_NAMES { \
+       [MODE_READ_USER]  = "READ",\
+       [MODE_WRITE_USER] = "WRITE"\
+}
+
+enum lockahead_results {
+       LLA_RESULT_SENT = 0,
+       LLA_RESULT_DIFFERENT,
+       LLA_RESULT_SAME,
+};
+
+#if defined(__cplusplus)
+}
+#endif
+
 /** @} lustreuser */
+
 #endif /* _LUSTRE_USER_H */