#define LLAPI_LAYOUT_RAID0 0ULL
#define LLAPI_LAYOUT_MDT 2ULL
#define LLAPI_LAYOUT_OVERSTRIPING 4ULL
+#define LLAPI_LAYOUT_FOREIGN 8ULL
/**
* The layout includes a specific set of OSTs on which to allocate.
{ LCME_FL_PARITY, "parity" },
};
+/* HSM component flags table */
+static const struct hsm_flag_name {
+ enum hsm_states hfn_flag;
+ const char *hfn_name;
+} hsm_flags_table[] = {
+ { HS_NONE, "none" },
+ { HS_EXISTS, "exists" },
+ { HS_DIRTY, "dirty" },
+ { HS_RELEASED, "released" },
+ { HS_ARCHIVED, "archived" },
+ { HS_NORELEASE, "norelease" },
+ { HS_NOARCHIVE, "noarchive" },
+ { HS_LOST, "lost" },
+ { HS_PCCRW, "pccrw" },
+ { HS_PCCRO, "pccro" },
+};
+
/**
* Gets the attribute flags of the current component.
*/
LAYOUT_INTENT_TRUNC = 4, /** truncate file, for comp layout */
LAYOUT_INTENT_RELEASE = 5, /** reserved for HSM release */
LAYOUT_INTENT_RESTORE = 6, /** reserved for HSM restore */
+ LAYOUT_INTENT_PCCRO_SET = 7, /** set read-only layout for PCC */
+ LAYOUT_INTENT_PCCRO_CLEAR = 8, /** clear read-only layout */
};
/* enqueue layout lock with intent */
#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_ATTACH _IOW('f', 252, struct lu_pcc_attach)
#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)
**/
enum lustre_foreign_types {
LU_FOREIGN_TYPE_NONE = 0,
+ /* HSM copytool lhsm_posix */
+ LU_FOREIGN_TYPE_POSIX = 1,
+ /* Used for PCC-RW. PCCRW components are local to a single archive. */
+ LU_FOREIGN_TYPE_PCCRW = 2,
+ /* Used for PCC-RO. PCCRO components may be shared between archives. */
+ LU_FOREIGN_TYPE_PCCRO = 3,
+ /* Used for S3 */
+ LU_FOREIGN_TYPE_S3 = 4,
+ /* Used for DAOS */
LU_FOREIGN_TYPE_SYMLINK = 0xda05,
/* must be the max/last one */
- LU_FOREIGN_TYPE_UNKNOWN = 0xffffffff,
+ LU_FOREIGN_TYPE_UNKNOWN = 0xffffffff,
};
extern struct lustre_foreign_type lu_foreign_types[];
HS_NORELEASE = 0x00000010,
HS_NOARCHIVE = 0x00000020,
HS_LOST = 0x00000040,
+ HS_PCCRW = 0x00000080,
+ HS_PCCRO = 0x00000100,
};
/* HSM user-setable flags. */
LU_PCC_READWRITE = 0x01,
LU_PCC_READONLY = 0x02,
LU_PCC_TYPE_MASK = LU_PCC_READWRITE | LU_PCC_READONLY,
+ LU_PCC_FL_ASYNC = 0x10,
LU_PCC_MAX
};
PCC_STATE_FL_ATTR_VALID = 0x01,
/* The file is being attached into PCC */
PCC_STATE_FL_ATTACHING = 0x02,
+ /* The PCC copy is unlinked */
+ PCC_STATE_FL_UNLINKED = 0x04,
};
struct lu_pcc_state {
(long long)LAYOUT_INTENT_RELEASE);
LASSERTF(LAYOUT_INTENT_RESTORE == 6, "found %lld\n",
(long long)LAYOUT_INTENT_RESTORE);
+ LASSERTF(LAYOUT_INTENT_PCCRO_SET == 7, "found %lld\n",
+ (long long)LAYOUT_INTENT_PCCRO_SET);
+ LASSERTF(LAYOUT_INTENT_PCCRO_CLEAR == 8, "found %lld\n",
+ (long long)LAYOUT_INTENT_PCCRO_CLEAR);
/* Checks for struct hsm_action_item */
LASSERTF((int)sizeof(struct hsm_action_item) == 72, "found %lld\n",
}
static void
+check_lov_foreign_md(void)
+{
+ BLANK_LINE();
+ CHECK_STRUCT(lov_foreign_md);
+ CHECK_MEMBER(lov_foreign_md, lfm_magic);
+ CHECK_MEMBER(lov_foreign_md, lfm_length);
+ CHECK_MEMBER(lov_foreign_md, lfm_type);
+ CHECK_MEMBER(lov_foreign_md, lfm_flags);
+ CHECK_MEMBER(lov_foreign_md, lfm_value[0]);
+
+ CHECK_VALUE_X(LU_FOREIGN_TYPE_NONE);
+ CHECK_VALUE_X(LU_FOREIGN_TYPE_POSIX);
+ CHECK_VALUE_X(LU_FOREIGN_TYPE_PCCRW);
+ CHECK_VALUE_X(LU_FOREIGN_TYPE_PCCRO);
+ CHECK_VALUE_X(LU_FOREIGN_TYPE_S3);
+ CHECK_VALUE_X(LU_FOREIGN_TYPE_DAOS);
+ CHECK_VALUE_X(LU_FOREIGN_TYPE_UNKNOWN);
+
+ CHECK_CDEFINE(LOV_MAGIC_FOREIGN);
+ CHECK_VALUE_X(LOV_PATTERN_FOREIGN);
+}
+
+static void
check_lov_comp_md_entry_v1(void)
{
BLANK_LINE();
CHECK_VALUE(LAYOUT_INTENT_TRUNC);
CHECK_VALUE(LAYOUT_INTENT_RELEASE);
CHECK_VALUE(LAYOUT_INTENT_RESTORE);
+ CHECK_VALUE(LAYOUT_INTENT_PCCRO_SET);
+ CHECK_VALUE(LAYOUT_INTENT_PCCRO_CLEAR);
}
static void check_hsm_state_set(void)
check_lov_ost_data_v1();
check_lov_mds_md_v1();
check_lov_mds_md_v3();
+ check_lov_foreign_md();
check_lov_comp_md_entry_v1();
check_lov_comp_md_v1();
check_lmv_mds_md_v1();
LASSERTF(LOV_PATTERN_OVERSTRIPING == 0x00000200UL, "found 0x%.8xUL\n",
(unsigned)LOV_PATTERN_OVERSTRIPING);
+ /* Checks for struct lov_foreign_md */
+ LASSERTF((int)sizeof(struct lov_foreign_md) == 16, "found %lld\n",
+ (long long)(int)sizeof(struct lov_foreign_md));
+ LASSERTF((int)offsetof(struct lov_foreign_md, lfm_magic) == 0, "found %lld\n",
+ (long long)(int)offsetof(struct lov_foreign_md, lfm_magic));
+ LASSERTF((int)sizeof(((struct lov_foreign_md *)0)->lfm_magic) == 4, "found %lld\n",
+ (long long)(int)sizeof(((struct lov_foreign_md *)0)->lfm_magic));
+ LASSERTF((int)offsetof(struct lov_foreign_md, lfm_length) == 4, "found %lld\n",
+ (long long)(int)offsetof(struct lov_foreign_md, lfm_length));
+ LASSERTF((int)sizeof(((struct lov_foreign_md *)0)->lfm_length) == 4, "found %lld\n",
+ (long long)(int)sizeof(((struct lov_foreign_md *)0)->lfm_length));
+ LASSERTF((int)offsetof(struct lov_foreign_md, lfm_type) == 8, "found %lld\n",
+ (long long)(int)offsetof(struct lov_foreign_md, lfm_type));
+ LASSERTF((int)sizeof(((struct lov_foreign_md *)0)->lfm_type) == 4, "found %lld\n",
+ (long long)(int)sizeof(((struct lov_foreign_md *)0)->lfm_type));
+ LASSERTF((int)offsetof(struct lov_foreign_md, lfm_flags) == 12, "found %lld\n",
+ (long long)(int)offsetof(struct lov_foreign_md, lfm_flags));
+ LASSERTF((int)sizeof(((struct lov_foreign_md *)0)->lfm_flags) == 4, "found %lld\n",
+ (long long)(int)sizeof(((struct lov_foreign_md *)0)->lfm_flags));
+ LASSERTF((int)offsetof(struct lov_foreign_md, lfm_value) == 16, "found %lld\n",
+ (long long)(int)offsetof(struct lov_foreign_md, lfm_value));
+ LASSERTF(LU_FOREIGN_TYPE_NONE == 0, "found 0x%.8xUL\n",
+ (unsigned)LU_FOREIGN_TYPE_NONE);
+ LASSERTF(LU_FOREIGN_TYPE_POSIX == 1, "found 0x%.8xUL\n",
+ (unsigned)LU_FOREIGN_TYPE_POSIX);
+ LASSERTF(LU_FOREIGN_TYPE_PCCRW == 2, "found 0x%.8xUL\n",
+ (unsigned)LU_FOREIGN_TYPE_PCCRW);
+ LASSERTF(LU_FOREIGN_TYPE_PCCRO == 3, "found 0x%.8xUL\n",
+ (unsigned)LU_FOREIGN_TYPE_PCCRO);
+ LASSERTF(LU_FOREIGN_TYPE_S3 == 4, "found 0x%.8xUL\n",
+ (unsigned)LU_FOREIGN_TYPE_S3);
+ LASSERTF(LU_FOREIGN_TYPE_SYMLINK == 0x0000da05, "found 0x%.8xUL\n",
+ (unsigned)LU_FOREIGN_TYPE_SYMLINK);
+ BUILD_BUG_ON(LOV_MAGIC_FOREIGN != (0x0BD70000 | 0x0BD0));
+ LASSERTF(LOV_PATTERN_FOREIGN == 0x00000400, "found 0x%.8xUL\n",
+ (unsigned)LOV_PATTERN_FOREIGN);
+
/* Checks for struct lov_comp_md_entry_v1 */
LASSERTF((int)sizeof(struct lov_comp_md_entry_v1) == 48, "found %lld\n",
(long long)(int)sizeof(struct lov_comp_md_entry_v1));
(long long)LAYOUT_INTENT_RELEASE);
LASSERTF(LAYOUT_INTENT_RESTORE == 6, "found %lld\n",
(long long)LAYOUT_INTENT_RESTORE);
+ LASSERTF(LAYOUT_INTENT_PCCRO_SET == 7, "found %lld\n",
+ (long long)LAYOUT_INTENT_PCCRO_SET);
+ LASSERTF(LAYOUT_INTENT_PCCRO_CLEAR == 8, "found %lld\n",
+ (long long)LAYOUT_INTENT_PCCRO_CLEAR);
/* Checks for struct hsm_action_item */
LASSERTF((int)sizeof(struct hsm_action_item) == 72, "found %lld\n",