Whamcloud - gitweb
LU-12349 llite: console message for disabled flock call
[fs/lustre-release.git] / lustre / include / uapi / linux / lustre / lustre_user.h
index b75f0c6..66c8fd1 100644 (file)
@@ -55,6 +55,7 @@
 # include <limits.h>
 # include <stdbool.h>
 # include <stdio.h> /* snprintf() */
+# include <stdint.h>
 # include <string.h>
 # define NEED_QUOTA_DEFS
 /* # include <sys/quota.h> - this causes complaints about caddr_t */
@@ -131,6 +132,7 @@ enum obd_statfs_state {
        OS_STATE_ENOSPC         = 0x00000020, /**< not enough free space */
        OS_STATE_ENOINO         = 0x00000040, /**< not enough inodes */
        OS_STATE_SUM            = 0x00000100, /**< aggregated for all tagrets */
+       OS_STATE_NONROT         = 0x00000200, /**< non-rotational device */
 };
 
 /** filesystem statistics/attributes for target device */
@@ -391,6 +393,7 @@ enum ll_lease_flags {
        LL_LEASE_RESYNC_DONE    = 0x2,
        LL_LEASE_LAYOUT_MERGE   = 0x4,
        LL_LEASE_LAYOUT_SPLIT   = 0x8,
+       LL_LEASE_PCC_ATTACH     = 0x10,
 };
 
 #define IOC_IDS_MAX    4096
@@ -477,6 +480,11 @@ struct ll_ioc_lease_id {
 #define LL_IOC_FID2MDTIDX              _IOWR('f', 248, struct lu_fid)
 #define LL_IOC_GETPARENT               _IOWR('f', 249, struct getparent)
 #define LL_IOC_LADVISE                 _IOR('f', 250, struct llapi_lu_ladvise)
+#define LL_IOC_HEAT_GET                        _IOWR('f', 251, struct lu_heat)
+#define LL_IOC_HEAT_SET                        _IOW('f', 251, __u64)
+#define LL_IOC_PCC_DETACH              _IOW('f', 252, struct lu_pcc_detach)
+#define LL_IOC_PCC_DETACH_BY_FID       _IOW('f', 252, struct lu_pcc_detach_fid)
+#define LL_IOC_PCC_STATE               _IOR('f', 252, struct lu_pcc_state)
 
 #ifndef        FS_IOC_FSGETXATTR
 /*
@@ -530,6 +538,7 @@ struct fsxattr {
 #define LL_FILE_READAHEA        0x00000004
 #define LL_FILE_LOCKED_DIRECTIO 0x00000008 /* client-side locks with dio */
 #define LL_FILE_LOCKLESS_IO     0x00000010 /* server-side locks with cio */
+#define LL_FILE_FLOCK_WARNING   0x00000020 /* warned about disabled flock */
 
 #define LOV_USER_MAGIC_V1      0x0BD10BD0
 #define LOV_USER_MAGIC         LOV_USER_MAGIC_V1
@@ -538,28 +547,44 @@ struct fsxattr {
 /* 0x0BD40BD0 is occupied by LOV_MAGIC_MIGRATE */
 #define LOV_USER_MAGIC_SPECIFIC 0x0BD50BD0     /* for specific OSTs */
 #define LOV_USER_MAGIC_COMP_V1 0x0BD60BD0
+#define LOV_USER_MAGIC_FOREIGN 0x0BD70BD0
 
 #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_MDT                0x100
-#define LOV_PATTERN_CMOBD      0x200
+#define LOV_PATTERN_NONE               0x000
+#define LOV_PATTERN_RAID0              0x001
+#define LOV_PATTERN_RAID1              0x002
+#define LOV_PATTERN_MDT                        0x100
+#define LOV_PATTERN_OVERSTRIPING       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
 
+#define LOV_OFFSET_DEFAULT      ((__u16)-1)
+
 static inline bool lov_pattern_supported(__u32 pattern)
 {
        return (pattern & ~LOV_PATTERN_F_RELEASED) == LOV_PATTERN_RAID0 ||
+              (pattern & ~LOV_PATTERN_F_RELEASED) ==
+                       (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING) ||
               (pattern & ~LOV_PATTERN_F_RELEASED) == LOV_PATTERN_MDT;
 }
 
+/* RELEASED and MDT patterns are not valid in many places, so rather than
+ * having many extra checks on lov_pattern_supported, we have this separate
+ * check for non-released, non-DOM components
+ */
+static inline bool lov_pattern_supported_normal_comp(__u32 pattern)
+{
+       return pattern == LOV_PATTERN_RAID0 ||
+              pattern == (LOV_PATTERN_RAID0 | LOV_PATTERN_OVERSTRIPING);
+
+}
+
 #define LOV_MAXPOOLNAME 15
 #define LOV_POOLNAMEF "%.15s"
 
@@ -575,7 +600,7 @@ static inline bool lov_pattern_supported(__u32 pattern)
  * allocation that is sufficient for the current generation of systems.
  *
  * (max buffer size - lov+rpc header) / sizeof(struct lov_ost_data_v1) */
-#define LOV_MAX_STRIPE_COUNT 2000  /* ((12 * 4096 - 256) / 24) */
+#define LOV_MAX_STRIPE_COUNT 2000  /* ~((12 * 4096 - 256) / 24) */
 #define LOV_ALL_STRIPES       0xffff /* only valid for directories */
 #define LOV_V1_INSANE_STRIPE_COUNT 65532 /* maximum stripe count bz13933 */
 
@@ -621,6 +646,21 @@ 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));
 
+struct lov_foreign_md {
+       __u32 lfm_magic;        /* magic number = LOV_MAGIC_FOREIGN */
+       __u32 lfm_length;       /* length of lfm_value */
+       __u32 lfm_type;         /* type, see LU_FOREIGN_TYPE_ */
+       __u32 lfm_flags;        /* flags, type specific */
+       char lfm_value[];
+};
+
+#define foreign_size(lfm) (((struct lov_foreign_md *)lfm)->lfm_length + \
+                          offsetof(struct lov_foreign_md, lfm_value))
+
+#define foreign_size_le(lfm) \
+       (le32_to_cpu(((struct lov_foreign_md *)lfm)->lfm_length) + \
+       offsetof(struct lov_foreign_md, lfm_value))
+
 struct lu_extent {
        __u64   e_start;
        __u64   e_end;
@@ -698,6 +738,7 @@ struct lov_comp_md_entry_v1 {
 #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_NEG          0x8000
 #define MIRROR_ID_SHIFT                16
 
 static inline __u32 pflr_id(__u16 mirror_id, __u16 seqid)
@@ -769,14 +810,36 @@ enum lmv_hash_type {
        LMV_HASH_TYPE_UNKNOWN   = 0,    /* 0 is reserved for testing purpose */
        LMV_HASH_TYPE_ALL_CHARS = 1,
        LMV_HASH_TYPE_FNV_1A_64 = 2,
+       LMV_HASH_TYPE_SPACE     = 3,    /*
+                                        * distribute subdirs among all MDTs
+                                        * with balanced space usage.
+                                        */
        LMV_HASH_TYPE_MAX,
 };
 
 #define LMV_HASH_NAME_ALL_CHARS        "all_char"
 #define LMV_HASH_NAME_FNV_1A_64        "fnv_1a_64"
+#define LMV_HASH_NAME_SPACE    "space"
 
 extern char *mdt_hash_name[LMV_HASH_TYPE_MAX];
 
+struct lustre_foreign_type {
+       uint32_t lft_type;
+       const char *lft_name;
+};
+
+/**
+ * LOV/LMV foreign types
+ **/
+enum lustre_foreign_types {
+       LU_FOREIGN_TYPE_NONE = 0,
+       LU_FOREIGN_TYPE_DAOS = 0xda05,
+       /* must be the max/last one */
+       LU_FOREIGN_TYPE_UNKNOWN = 0xffffffff,
+};
+
+extern struct lustre_foreign_type lu_foreign_types[];
+
 /* Got this according to how get LOV_MAX_STRIPE_COUNT, see above,
  * (max buffer size - lmv+rpc header) / sizeof(struct lmv_user_mds_data) */
 #define LMV_MAX_STRIPE_COUNT 2000  /* ((12 * 4096 - 256) / 24) */
@@ -786,7 +849,7 @@ struct lmv_user_md_v1 {
        __u32   lum_stripe_count;  /* dirstripe count */
        __u32   lum_stripe_offset; /* MDT idx for default dirstripe */
        __u32   lum_hash_type;     /* Dir stripe policy */
-       __u32   lum_type;         /* LMV type: default or normal */
+       __u32   lum_type;         /* LMV type: default */
        __u32   lum_padding1;
        __u32   lum_padding2;
        __u32   lum_padding3;
@@ -794,6 +857,25 @@ struct lmv_user_md_v1 {
        struct  lmv_user_mds_data  lum_objects[0];
 } __attribute__((packed));
 
+static inline __u32 lmv_foreign_to_md_stripes(__u32 size)
+{
+       if (size <= sizeof(struct lmv_user_md))
+               return 0;
+
+       size -= sizeof(struct lmv_user_md);
+       return (size + sizeof(struct lmv_user_mds_data) - 1) /
+              sizeof(struct lmv_user_mds_data);
+}
+
+/*
+ * NB, historically default layout didn't set type, but use XATTR name to differ
+ * from normal layout, for backward compatibility, define LMV_TYPE_DEFAULT 0x0,
+ * and still use the same method.
+ */
+enum lmv_type {
+       LMV_TYPE_DEFAULT = 0x0000,
+};
+
 static inline int lmv_user_md_size(int stripes, int lmm_magic)
 {
        int size = sizeof(struct lmv_user_md);
@@ -1137,12 +1219,15 @@ enum la_valid {
 #define MDS_OPEN_RELEASE   02000000000000ULL /* Open the file for HSM release */
 
 #define MDS_OPEN_RESYNC    04000000000000ULL /* FLR: file resync */
+#define MDS_OPEN_PCC      010000000000000ULL /* PCC: auto RW-PCC cache attach
+                                             * for newly created file */
 
 /* 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)
+                             MDS_OPEN_RELEASE | MDS_OPEN_RESYNC |      \
+                             MDS_OPEN_PCC)
 
 
 /********* Changelogs **********/
@@ -2185,6 +2270,94 @@ enum lockahead_results {
        LLA_RESULT_SAME,
 };
 
+enum lu_heat_flag_bit {
+       LU_HEAT_FLAG_BIT_INVALID = 0,
+       LU_HEAT_FLAG_BIT_OFF,
+       LU_HEAT_FLAG_BIT_CLEAR,
+};
+
+enum lu_heat_flag {
+       LU_HEAT_FLAG_OFF        = 1ULL << LU_HEAT_FLAG_BIT_OFF,
+       LU_HEAT_FLAG_CLEAR      = 1ULL << LU_HEAT_FLAG_BIT_CLEAR,
+};
+
+enum obd_heat_type {
+       OBD_HEAT_READSAMPLE     = 0,
+       OBD_HEAT_WRITESAMPLE    = 1,
+       OBD_HEAT_READBYTE       = 2,
+       OBD_HEAT_WRITEBYTE      = 3,
+       OBD_HEAT_COUNT
+};
+
+#define LU_HEAT_NAMES {                                        \
+       [OBD_HEAT_READSAMPLE]   = "readsample",         \
+       [OBD_HEAT_WRITESAMPLE]  = "writesample",        \
+       [OBD_HEAT_READBYTE]     = "readbyte",           \
+       [OBD_HEAT_WRITEBYTE]    = "writebyte",          \
+}
+
+struct lu_heat {
+       __u32 lh_count;
+       __u32 lh_flags;
+       __u64 lh_heat[0];
+};
+
+enum lu_pcc_type {
+       LU_PCC_NONE = 0,
+       LU_PCC_READWRITE,
+       LU_PCC_MAX
+};
+
+static inline const char *pcc_type2string(enum lu_pcc_type type)
+{
+       switch (type) {
+       case LU_PCC_NONE:
+               return "none";
+       case LU_PCC_READWRITE:
+               return "readwrite";
+       default:
+               return "fault";
+       }
+}
+
+struct lu_pcc_attach {
+       __u32 pcca_type; /* PCC type */
+       __u32 pcca_id; /* archive ID for readwrite, group ID for readonly */
+};
+
+enum lu_pcc_detach_opts {
+       PCC_DETACH_OPT_NONE = 0, /* Detach only, keep the PCC copy */
+       PCC_DETACH_OPT_UNCACHE, /* Remove the cached file after detach */
+};
+
+struct lu_pcc_detach_fid {
+       /* fid of the file to detach */
+       struct lu_fid   pccd_fid;
+       __u32           pccd_opt;
+};
+
+struct lu_pcc_detach {
+       __u32           pccd_opt;
+};
+
+enum lu_pcc_state_flags {
+       PCC_STATE_FL_NONE               = 0x0,
+       /* The inode attr is cached locally */
+       PCC_STATE_FL_ATTR_VALID         = 0x01,
+       /* The file is being attached into PCC */
+       PCC_STATE_FL_ATTACHING          = 0x02,
+       /* Allow to auto attach at open */
+       PCC_STATE_FL_OPEN_ATTACH        = 0x04,
+};
+
+struct lu_pcc_state {
+       __u32   pccs_type; /* enum lu_pcc_type */
+       __u32   pccs_open_count;
+       __u32   pccs_flags; /* enum lu_pcc_state_flags */
+       __u32   pccs_padding;
+       char    pccs_path[PATH_MAX];
+};
+
 #if defined(__cplusplus)
 }
 #endif