Whamcloud - gitweb
LU-2714 hsm: limit MDT-side allocations for HSM RPCs
[fs/lustre-release.git] / lustre / include / lustre / lustre_user.h
index 1e8ecca..500082c 100644 (file)
@@ -109,6 +109,40 @@ struct obd_statfs {
         __u32           os_spare9;
 };
 
+/**
+ * File IDentifier.
+ *
+ * FID is a cluster-wide unique identifier of a file or an object (stripe).
+ * FIDs are never reused.
+ **/
+struct lu_fid {
+       /**
+       * FID sequence. Sequence is a unit of migration: all files (objects)
+       * with FIDs from a given sequence are stored on the same server.
+       * Lustre should support 2^64 objects, so even if each sequence
+       * has only a single object we can still enumerate 2^64 objects.
+       **/
+       __u64 f_seq;
+       /* FID number within sequence. */
+       __u32 f_oid;
+       /**
+        * FID version, used to distinguish different versions (in the sense
+        * of snapshots, etc.) of the same file system object. Not currently
+        * used.
+        **/
+       __u32 f_ver;
+};
+
+struct filter_fid {
+       struct lu_fid   ff_parent;  /* ff_parent.f_ver == file stripe number */
+       __u64      ff_objid;
+       __u64      ff_seq;
+};
+
+/* 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;
 
 /*
  * The ioctl naming rules:
@@ -163,6 +197,15 @@ struct obd_statfs {
 #define LL_IOC_HSM_PROGRESS            _IOW('f', 216, struct hsm_user_request)
 #define LL_IOC_HSM_REQUEST             _IOW('f', 217, struct hsm_user_request)
 #define LL_IOC_DATA_VERSION            _IOR('f', 218, struct ioc_data_version)
+#define LL_IOC_LOV_SWAP_LAYOUTS                _IOW('f', 219, \
+                                               struct lustre_swap_layouts)
+#define LL_IOC_HSM_ACTION              _IOR('f', 220, \
+                                               struct hsm_current_action)
+/* see <lustre_lib.h> for ioctl numbers 221-232 */
+
+#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_STATFS_LMV           1
 #define LL_STATFS_LOV           2
@@ -201,6 +244,9 @@ struct obd_statfs {
 #define LOV_USER_MAGIC_JOIN_V1 0x0BD20BD0
 #define LOV_USER_MAGIC_V3 0x0BD30BD0
 
+#define LMV_MAGIC_V1      0x0CD10CD0    /*normal stripe lmv magic */
+#define LMV_USER_MAGIC    0x0CD20CD0    /*default lmv magic*/
+
 #define LOV_PATTERN_RAID0 0x001
 #define LOV_PATTERN_RAID1 0x002
 #define LOV_PATTERN_FIRST 0x100
@@ -209,7 +255,7 @@ struct obd_statfs {
 #define LOV_POOLNAMEF "%.16s"
 
 #define LOV_MIN_STRIPE_BITS 16   /* maximum PAGE_SIZE (ia64), power of 2 */
-#define LOV_MIN_STRIPE_SIZE (1<<LOV_MIN_STRIPE_BITS)
+#define LOV_MIN_STRIPE_SIZE (1 << LOV_MIN_STRIPE_BITS)
 #define LOV_MAX_STRIPE_COUNT_OLD 160
 /* This calculation is crafted so that input of 4096 will result in 160
  * which in turn is equal to old maximal stripe count.
@@ -283,6 +329,41 @@ struct lov_user_mds_data_v3 {
 } __attribute__((packed));
 #endif
 
+/* keep this to be the same size as lov_user_ost_data_v1 */
+struct lmv_user_mds_data {
+       struct lu_fid   lum_fid;
+       __u32           lum_padding;
+       __u32           lum_mds;
+};
+
+/* lum_type */
+enum {
+       LMV_STRIPE_TYPE = 0,
+       LMV_DEFAULT_TYPE = 1,
+};
+
+#define lmv_user_md lmv_user_md_v1
+struct lmv_user_md_v1 {
+       __u32   lum_magic;       /* must be the first field */
+       __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_padding1;
+       __u32   lum_padding2;
+       __u32   lum_padding3;
+       char    lum_pool_name[LOV_MAXPOOLNAME];
+       struct  lmv_user_mds_data  lum_objects[0];
+};
+
+static inline int lmv_user_md_size(int stripes, int lmm_magic)
+{
+       return sizeof(struct lmv_user_md) +
+                     stripes * sizeof(struct lmv_user_mds_data);
+}
+
+extern void lustre_swab_lmv_user_md(struct lmv_user_md *lum);
+
 struct ll_recreate_obj {
         __u64 lrc_id;
         __u32 lrc_ost_idx;
@@ -345,41 +426,6 @@ static inline void obd_uuid2fsname(char *buf, char *uuid, int buflen)
            *p = '\0';
 }
 
-/**
- * File IDentifier.
- *
- * FID is a cluster-wide unique identifier of a file or an object (stripe).
- * FIDs are never reused.
- */
-struct lu_fid {
-        /**
-         * FID sequence. Sequence is a unit of migration: all files (objects)
-         * with FIDs from a given sequence are stored on the same server.
-         * Lustre should support 2^64 objects, so even if each sequence
-         * has only a single object we can still enumerate 2^64 objects.
-         */
-        __u64 f_seq;
-        /** FID number within sequence. */
-        __u32 f_oid;
-        /**
-         * FID version, used to distinguish different versions (in the sense
-         * of snapshots, etc.) of the same file system object. Not currently
-         * used.
-         */
-        __u32 f_ver;
-};
-
-struct filter_fid {
-        struct lu_fid   ff_parent;  /* ff_parent.f_ver == file stripe number */
-        __u64           ff_objid;
-        __u64           ff_seq;
-};
-
-/* 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;
-
 /* printf display format
    e.g. printf("file FID is "DFID"\n", PFID(fid)); */
 #define DFID_NOBRACE LPX64":0x%x:0x%x"
@@ -527,6 +573,12 @@ struct if_quotactl {
         struct obd_uuid         obd_uuid;
 };
 
+struct lustre_swap_layouts {
+       __u64   sl_flags;
+       __u32   sl_fd;
+       __u32   sl_gid;
+};
+
 
 /********* Changelogs **********/
 /** Changelog record types */
@@ -814,6 +866,19 @@ struct hsm_state_set_ioc {
        __u64           hssi_clearmask;
 };
 
+/*
+ * This structure describes the current in-progress action for a file.
+ * it is retuned to user space and send over the wire
+ */
+struct hsm_current_action {
+       /**  The current undergoing action, if there is one */
+       /* state is one of hsm_progress_states */
+       __u32                   hca_state;
+       /* action is one of hsm_user_action */
+       __u32                   hca_action;
+       struct hsm_extent       hca_location;
+};
+
 /***** HSM user requests ******/
 /* User-generated (lfs/ioctl) request types */
 enum hsm_user_action {
@@ -838,35 +903,50 @@ static inline char *hsm_user_action2name(enum hsm_user_action  a)
         }
 }
 
+/*
+ * List of hr_flags (bit field)
+ */
+#define HSM_FORCE_ACTION 0x0001
+/* used by CT, connot be set by user */
+#define HSM_GHOST_COPY   0x0002
+
+/**
+ * Contains all the fixed part of struct hsm_user_request.
+ *
+ */
+struct hsm_request {
+       __u32 hr_action;        /* enum hsm_user_action */
+       __u32 hr_archive_id;    /* archive id, used only with HUA_ARCHIVE */
+       __u64 hr_flags;         /* request flags */
+       __u32 hr_itemcount;     /* item count in hur_user_item vector */
+       __u32 hr_data_len;
+};
+
 struct hsm_user_item {
        lustre_fid        hui_fid;
        struct hsm_extent hui_extent;
 } __attribute__((packed));
 
 struct hsm_user_request {
-        __u32 hur_action;    /* enum hsm_user_action */
-        __u32 hur_archive_num; /* archive number, used only with HUA_ARCHIVE */
-        __u32 hur_itemcount;
-        __u32 hur_data_len;
-        struct hsm_user_item hur_user_item[0];
-        /* extra data blob at end of struct (after all
-         * hur_user_items), only use helpers to access it
-         */
+       struct hsm_request      hur_request;
+       struct hsm_user_item    hur_user_item[0];
+       /* extra data blob at end of struct (after all
+        * hur_user_items), only use helpers to access it
+        */
 } __attribute__((packed));
 
 /** Return pointer to data field in a hsm user request */
 static inline void *hur_data(struct hsm_user_request *hur)
 {
-        return &(hur->hur_user_item[hur->hur_itemcount]);
+       return &(hur->hur_user_item[hur->hur_request.hr_itemcount]);
 }
 
 /** Compute the current length of the provided hsm_user_request. */
 static inline int hur_len(struct hsm_user_request *hur)
 {
-        int data_offset;
-
-        data_offset = hur_data(hur) - (void *)hur;
-        return (data_offset + hur->hur_data_len);
+       return offsetof(struct hsm_user_request,
+                       hur_user_item[hur->hur_request.hr_itemcount]) +
+               hur->hur_request.hr_data_len;
 }
 
 /****** HSM RPCs to copytool *****/
@@ -946,7 +1026,7 @@ struct hsm_action_list {
        __u32 hal_count;       /* number of hai's to follow */
        __u64 hal_compound_id; /* returned by coordinator */
        __u64 hal_flags;
-       __u32 hal_archive_num; /* which archive backend */
+       __u32 hal_archive_id; /* which archive backend */
        __u32 padding1;
        char  hal_fsname[0];   /* null-terminated */
        /* struct hsm_action_item[hal_count] follows, aligned on 8-byte