From 3344e648236778565a8838ca85c655446ee7028c Mon Sep 17 00:00:00 2001 From: James Simmons Date: Thu, 23 Mar 2017 11:09:30 -0400 Subject: [PATCH] LU-6401 uapi: split lustre_disk.h into two headers The header lustre_disk.h is used by both user and kernel space but it contains kernel specific material. Split out the material that is used by both user land and kernel space into a new header. Change the utilities over to using this new UAPI header while the lustre kernel code keeps using the kernel version of lustre_disk.h. Change-Id: I2cc75e4e465e17cc45bebb3b61e2e16d4bd615f0 Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/25194 Tested-by: Jenkins Reviewed-by: Dmitry Eremin Reviewed-by: John L. Hammond Reviewed-by: Lai Siyao Tested-by: Maloo Reviewed-by: Oleg Drokin --- config/lustre-build.m4 | 2 +- lustre/autoconf/lustre-core.m4 | 1 + lustre/include/Makefile.am | 4 +- lustre/include/lustre_disk.h | 498 ++++++++------------------------ lustre/include/uapi/linux/.gitignore | 1 + lustre/include/uapi/linux/Makefile.am | 33 +++ lustre/include/uapi/linux/lustre_disk.h | 229 +++++++++++++++ lustre/mgs/mgs_llog.c | 26 +- lustre/obdclass/genops.c | 2 + lustre/target/tgt_lastrcvd.c | 19 +- lustre/utils/lr_reader.c | 3 +- lustre/utils/mkfs_lustre.c | 26 +- lustre/utils/mount_utils.c | 1 - lustre/utils/mount_utils.h | 33 ++- lustre/utils/mount_utils_ldiskfs.c | 2 +- lustre/utils/wirecheck.c | 2 +- lustre/utils/wirehdr.c | 2 +- lustre/utils/wiretest.c | 2 +- 18 files changed, 491 insertions(+), 395 deletions(-) create mode 100644 lustre/include/uapi/linux/.gitignore create mode 100644 lustre/include/uapi/linux/Makefile.am create mode 100644 lustre/include/uapi/linux/lustre_disk.h diff --git a/config/lustre-build.m4 b/config/lustre-build.m4 index d2db823..69f77e5 100644 --- a/config/lustre-build.m4 +++ b/config/lustre-build.m4 @@ -329,7 +329,7 @@ AS_IF([test $target_cpu = powerpc64], [ CC="$CC -m64" ]) -CPPFLAGS="-I$PWD/$LIBCFS_INCLUDE_DIR -I$PWD/lnet/include -I$PWD/lustre/include $CPPFLAGS" +CPPFLAGS="-I$PWD/$LIBCFS_INCLUDE_DIR -I$PWD/lnet/include -I$PWD/lustre/include -I$PWD/lustre/include/uapi $CPPFLAGS" CCASFLAGS="-Wall -fPIC -D_GNU_SOURCE" AC_SUBST(CCASFLAGS) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 818a4c9..6a8c7e6 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -2773,6 +2773,7 @@ lustre/contrib/Makefile lustre/doc/Makefile lustre/include/Makefile lustre/include/lustre/Makefile +lustre/include/uapi/linux/Makefile lustre/kernel_patches/targets/3.10-rhel7.target lustre/kernel_patches/targets/2.6-rhel6.8.target lustre/kernel_patches/targets/2.6-rhel6.7.target diff --git a/lustre/include/Makefile.am b/lustre/include/Makefile.am index 0ca7327..5bbaf4a 100644 --- a/lustre/include/Makefile.am +++ b/lustre/include/Makefile.am @@ -32,9 +32,9 @@ # Lustre is a trademark of Sun Microsystems, Inc. # -SUBDIRS = lustre +SUBDIRS = lustre uapi/linux -DIST_SUBDIRS = lustre +DIST_SUBDIRS = lustre uapi/linux EXTRA_DIST = \ cl_object.h \ diff --git a/lustre/include/lustre_disk.h b/lustre/include/lustre_disk.h index 90e6629..14f363d 100644 --- a/lustre/include/lustre_disk.h +++ b/lustre/include/lustre_disk.h @@ -45,189 +45,31 @@ */ #include #include -#include -#ifdef __KERNEL__ +#include #include -#else -#include -#include -#endif -#include - -/****************** on-disk files *********************/ - -#define MDT_LOGS_DIR "LOGS" /* COMPAT_146 */ -#define MOUNT_CONFIGS_DIR "CONFIGS" -#define CONFIGS_FILE "mountdata" -/** Persistent mount data are stored on the disk in this file. */ -#define MOUNT_DATA_FILE MOUNT_CONFIGS_DIR"/"CONFIGS_FILE -#define LAST_RCVD "last_rcvd" -#define REPLY_DATA "reply_data" -#define LOV_OBJID "lov_objid" -#define LOV_OBJSEQ "lov_objseq" -#define HEALTH_CHECK "health_check" -#define CAPA_KEYS "capa_keys" -#define CHANGELOG_USERS "changelog_users" -#define MGS_NIDTBL_DIR "NIDTBL_VERSIONS" -#define QMT_DIR "quota_master" -#define QSD_DIR "quota_slave" -#define HSM_ACTIONS "hsm_actions" -#define LFSCK_DIR "LFSCK" -#define LFSCK_BOOKMARK "lfsck_bookmark" -#define LFSCK_LAYOUT "lfsck_layout" -#define LFSCK_NAMESPACE "lfsck_namespace" - -/****************** persistent mount data *********************/ - -#define LDD_F_SV_TYPE_MDT 0x0001 -#define LDD_F_SV_TYPE_OST 0x0002 -#define LDD_F_SV_TYPE_MGS 0x0004 -#define LDD_F_SV_TYPE_MASK (LDD_F_SV_TYPE_MDT | \ - LDD_F_SV_TYPE_OST | \ - LDD_F_SV_TYPE_MGS) -#define LDD_F_SV_ALL 0x0008 -/** need an index assignment */ -#define LDD_F_NEED_INDEX 0x0010 -/** never registered */ -#define LDD_F_VIRGIN 0x0020 -/** update the config logs for this server */ -#define LDD_F_UPDATE 0x0040 -/** rewrite the LDD */ -#define LDD_F_REWRITE_LDD 0x0080 -/** regenerate config logs for this fs or server */ -#define LDD_F_WRITECONF 0x0100 -/** COMPAT_14 */ -#define LDD_F_UPGRADE14 0x0200 -/** process as lctl conf_param */ -#define LDD_F_PARAM 0x0400 -/** all nodes are specified as service nodes */ -#define LDD_F_NO_PRIMNODE 0x1000 -/** IR enable flag */ -#define LDD_F_IR_CAPABLE 0x2000 -/** the MGS refused to register the target. */ -#define LDD_F_ERROR 0x4000 -/** process at lctl conf_param */ -#define LDD_F_PARAM2 0x8000 - -/* opc for target register */ -#define LDD_F_OPC_REG 0x10000000 -#define LDD_F_OPC_UNREG 0x20000000 -#define LDD_F_OPC_READY 0x40000000 -#define LDD_F_OPC_MASK 0xf0000000 - -#define LDD_F_ONDISK_MASK (LDD_F_SV_TYPE_MASK) - -#define LDD_F_MASK 0xFFFF - -#define XATTR_TARGET_RENAME "trusted.rename_tgt" - -enum ldd_mount_type { - LDD_MT_EXT3 = 0, - LDD_MT_LDISKFS, - LDD_MT_SMFS, - LDD_MT_REISERFS, - LDD_MT_LDISKFS2, - LDD_MT_ZFS, - LDD_MT_LAST -}; - -static inline char *mt_str(enum ldd_mount_type mt) -{ - static char *mount_type_string[] = { - "ext3", - "ldiskfs", - "smfs", - "reiserfs", - "ldiskfs2", - "zfs", - }; - return mount_type_string[mt]; -} - -static inline char *mt_type(enum ldd_mount_type mt) -{ - static char *mount_type_string[] = { - "osd-ldiskfs", - "osd-ldiskfs", - "osd-smfs", - "osd-reiserfs", - "osd-ldiskfs", - "osd-zfs", - }; - return mount_type_string[mt]; -} - -#define LDD_INCOMPAT_SUPP 0 -#define LDD_ROCOMPAT_SUPP 0 - -#define LDD_MAGIC 0x1dd00001 - -/* On-disk configuration file. In host-endian order. */ -struct lustre_disk_data { - __u32 ldd_magic; - __u32 ldd_feature_compat; /* compatible feature flags */ - __u32 ldd_feature_rocompat;/* read-only compatible feature flags */ - __u32 ldd_feature_incompat;/* incompatible feature flags */ - - __u32 ldd_config_ver; /* config rewrite count - not used */ - __u32 ldd_flags; /* LDD_SV_TYPE */ - __u32 ldd_svindex; /* server index (0001), must match - svname */ - __u32 ldd_mount_type; /* target fs type LDD_MT_* */ - char ldd_fsname[64]; /* filesystem this server is part of, - MTI_NAME_MAXLEN */ - char ldd_svname[64]; /* this server's name (lustre-mdt0001)*/ - __u8 ldd_uuid[40]; /* server UUID (COMPAT_146) */ - -/*200*/ char ldd_userdata[1024 - 200]; /* arbitrary user string */ -/*1024*/__u8 ldd_padding[4096 - 1024]; -/*4096*/char ldd_mount_opts[4096]; /* target fs mount opts */ -/*8192*/char ldd_params[4096]; /* key=value pairs */ -}; - +#include +#include #define IS_MDT(data) ((data)->lsi_flags & LDD_F_SV_TYPE_MDT) #define IS_OST(data) ((data)->lsi_flags & LDD_F_SV_TYPE_OST) #define IS_MGS(data) ((data)->lsi_flags & LDD_F_SV_TYPE_MGS) -#define IS_SEPARATED_MGS(data) ((data)->ldd_flags == LDD_F_SV_TYPE_MGS) #define IS_SERVER(data) ((data)->lsi_flags & (LDD_F_SV_TYPE_MGS | \ - LDD_F_SV_TYPE_MDT | LDD_F_SV_TYPE_OST)) + LDD_F_SV_TYPE_MDT | \ + LDD_F_SV_TYPE_OST)) #define MT_STR(data) mt_str((data)->ldd_mount_type) -/* Make the mdt/ost server obd name based on the filesystem name */ -static inline bool server_make_name(__u32 flags, __u16 index, char *fs, - char *name) -{ - bool invalid_flag = false; - - if (flags & (LDD_F_SV_TYPE_MDT | LDD_F_SV_TYPE_OST)) { - if (!(flags & LDD_F_SV_ALL)) - sprintf(name, "%.8s%c%s%04x", fs, - (flags & LDD_F_VIRGIN) ? ':' : - ((flags & LDD_F_WRITECONF) ? '=' : '-'), - (flags & LDD_F_SV_TYPE_MDT) ? "MDT" : "OST", - index); - } else if (flags & LDD_F_SV_TYPE_MGS) { - sprintf(name, "MGS"); - } else { - CERROR("unknown server type %#x\n", flags); - invalid_flag = true; - } - return invalid_flag; -} - /****************** mount command *********************/ /* The lmd is only used internally by Lustre; mount simply passes - everything as string options */ - + * everything as string options + */ #define LMD_MAGIC 0xbdacbd03 #define LMD_PARAMS_MAXLEN 4096 /* gleaned from the mount command - no persistent info here */ struct lustre_mount_data { - __u32 lmd_magic; - __u32 lmd_flags; /* lustre mount flags */ + u32 lmd_magic; + u32 lmd_flags; /* lustre mount flags */ int lmd_mgs_failnodes; /* mgs failover node count */ int lmd_exclude_count; int lmd_recovery_time_soft; @@ -239,7 +81,7 @@ struct lustre_mount_data { char *lmd_opts; /* lustre mount options (as opposed to * device_ mount options) */ char *lmd_params; /* lustre params */ - __u32 *lmd_exclude; /* array of OSTs to ignore */ + u32 *lmd_exclude; /* array of OSTs to ignore */ char *lmd_mgs; /* MGS nid */ char *lmd_osd_type; /* OSD type */ char *lmd_nidnet; /* network to restrict this client to */ @@ -266,21 +108,46 @@ struct lustre_mount_data { #define lmd_is_client(x) ((x)->lmd_flags & LMD_FLG_CLIENT) +/****************** superblock additional info *********************/ +struct ll_sb_info; + +struct lustre_sb_info { + int lsi_flags; + struct obd_device *lsi_mgc; /* mgc obd */ + struct lustre_mount_data *lsi_lmd; /* mount command info */ + struct ll_sb_info *lsi_llsbi; /* add'l client sbi info */ + struct dt_device *lsi_dt_dev; /* dt device to access disk fs*/ + atomic_t lsi_mounts; /* references to the srv_mnt */ + char lsi_svname[MTI_NAME_MAXLEN]; + char lsi_osd_obdname[64]; + char lsi_osd_uuid[64]; + struct obd_export *lsi_osd_exp; + char lsi_osd_type[16]; + char lsi_fstype[16]; + struct backing_dev_info lsi_bdi; /* each client mountpoint needs + own backing_dev_info */ + struct list_head lsi_lwp_list; + spinlock_t lsi_lwp_lock; + unsigned long lsi_lwp_started:1; +}; -/****************** last_rcvd file *********************/ +#define LSI_UMOUNT_FAILOVER 0x00200000 +#define LSI_BDI_INITIALIZED 0x00400000 -/** version recovery epoch */ -#define LR_EPOCH_BITS 32 -#define lr_epoch(a) ((a) >> LR_EPOCH_BITS) -#define LR_EXPIRE_INTERVALS 16 /**< number of intervals to track transno */ -#define ENOENT_VERSION 1 /** 'virtual' version of non-existent object */ +#define s2lsi(sb) ((struct lustre_sb_info *)((sb)->s_fs_info)) +#define s2lsi_nocast(sb) ((sb)->s_fs_info) -#define LR_SERVER_SIZE 512 -#define LR_CLIENT_START 8192 -#define LR_CLIENT_SIZE 128 -#if LR_CLIENT_START < LR_SERVER_SIZE -#error "Can't have LR_CLIENT_START < LR_SERVER_SIZE" -#endif +#define get_profile_name(sb) (s2lsi(sb)->lsi_lmd->lmd_profile) +#define get_mount_fileset(sb) (s2lsi(sb)->lsi_lmd->lmd_fileset) + +# ifdef HAVE_SERVER_SUPPORT +/* opc for target register */ +#define LDD_F_OPC_REG 0x10000000 +#define LDD_F_OPC_UNREG 0x20000000 +#define LDD_F_OPC_READY 0x40000000 +#define LDD_F_OPC_MASK 0xf0000000 + +#define LDD_F_MASK 0xFFFF /* * This limit is arbitrary (131072 clients on x86), but it is convenient to use @@ -322,7 +189,7 @@ struct lustre_mount_data { #define OBD_INCOMPAT_IAM_DIR 0x00000040 /** LMA attribute contains per-inode incompatible flags */ #define OBD_INCOMPAT_LMA 0x00000080 -/** lmm_stripe_count has been shrunk from __u32 to __u16 and the remaining 16 +/** lmm_stripe_count has been shrunk from u32 to u16 and the remaining 16 * bits are now used to store a generation. Once we start changing the layout * and bumping the generation, old versions expecting a 32-bit lmm_stripe_count * will be confused by interpreting stripe_count | gen << 16 as the actual @@ -333,237 +200,115 @@ struct lustre_mount_data { /** multiple RPCs in flight */ #define OBD_INCOMPAT_MULTI_RPCS 0x00000400 -/* Data stored per server at the head of the last_rcvd file. In le32 order. - This should be common to filter_internal.h, lustre_mds.h */ -struct lr_server_data { - __u8 lsd_uuid[40]; /* server UUID */ - __u64 lsd_last_transno; /* last completed transaction ID */ - __u64 lsd_compat14; /* reserved - compat with old last_rcvd */ - __u64 lsd_mount_count; /* incarnation number */ - __u32 lsd_feature_compat; /* compatible feature flags */ - __u32 lsd_feature_rocompat;/* read-only compatible feature flags */ - __u32 lsd_feature_incompat;/* incompatible feature flags */ - __u32 lsd_server_size; /* size of server data area */ - __u32 lsd_client_start; /* start of per-client data area */ - __u16 lsd_client_size; /* size of per-client data area */ - __u16 lsd_subdir_count; /* number of subdirectories for objects */ - __u64 lsd_catalog_oid; /* recovery catalog object id */ - __u32 lsd_catalog_ogen; /* recovery catalog inode generation */ - __u8 lsd_peeruuid[40]; /* UUID of MDS associated with this OST */ - __u32 lsd_osd_index; /* index number of OST in LOV */ - __u32 lsd_padding1; /* was lsd_mdt_index, unused in 2.4.0 */ - __u32 lsd_start_epoch; /* VBR: start epoch from last boot */ - /** transaction values since lsd_trans_table_time */ - __u64 lsd_trans_table[LR_EXPIRE_INTERVALS]; - /** start point of transno table below */ - __u32 lsd_trans_table_time; /* time of first slot in table above */ - __u32 lsd_expire_intervals; /* LR_EXPIRE_INTERVALS */ - __u8 lsd_padding[LR_SERVER_SIZE - 288]; -}; - -/* Data stored per client in the last_rcvd file. In le32 order. */ -struct lsd_client_data { - __u8 lcd_uuid[40]; /* client UUID */ - __u64 lcd_last_transno; /* last completed transaction ID */ - __u64 lcd_last_xid; /* xid for the last transaction */ - __u32 lcd_last_result; /* result from last RPC */ - __u32 lcd_last_data; /* per-op data (disposition for open &c.) */ - /* for MDS_CLOSE requests */ - __u64 lcd_last_close_transno; /* last completed transaction ID */ - __u64 lcd_last_close_xid; /* xid for the last transaction */ - __u32 lcd_last_close_result; /* result from last RPC */ - __u32 lcd_last_close_data; /* per-op data */ - /* VBR: last versions */ - __u64 lcd_pre_versions[4]; - __u32 lcd_last_epoch; - /* generation counter of client slot in last_rcvd */ - __u32 lcd_generation; - __u8 lcd_padding[LR_CLIENT_SIZE - 128]; -}; - - -/* Data stored in each slot of the reply_data file. - * - * The lrd_client_gen field is assigned with lcd_generation value - * to allow identify which client the reply data belongs to. - */ -struct lsd_reply_data { - __u64 lrd_transno; /* transaction number */ - __u64 lrd_xid; /* transmission id */ - __u64 lrd_data; /* per-operation data */ - __u32 lrd_result; /* request result */ - __u32 lrd_client_gen; /* client generation */ -}; - -/* Header of the reply_data file */ -#define LRH_MAGIC 0xbdabda01 -struct lsd_reply_header { - __u32 lrh_magic; - __u32 lrh_header_size; - __u32 lrh_reply_size; - __u8 lrh_pad[sizeof(struct lsd_reply_data) - 12]; -}; - - -/* bug20354: the lcd_uuid for export of clients may be wrong */ -static inline void check_lcd(char *obd_name, int index, - struct lsd_client_data *lcd) -{ - size_t length = sizeof(lcd->lcd_uuid); - if (strnlen((char*)lcd->lcd_uuid, length) == length) { - lcd->lcd_uuid[length - 1] = '\0'; - - LCONSOLE_ERROR("the client UUID (%s) on %s for exports" - "stored in last_rcvd(index = %d) is bad!\n", - lcd->lcd_uuid, obd_name, index); - } -} - /* last_rcvd handling */ static inline void lsd_le_to_cpu(struct lr_server_data *buf, struct lr_server_data *lsd) { int i; + memcpy(lsd->lsd_uuid, buf->lsd_uuid, sizeof(lsd->lsd_uuid)); - lsd->lsd_last_transno = __le64_to_cpu(buf->lsd_last_transno); - lsd->lsd_compat14 = __le64_to_cpu(buf->lsd_compat14); - lsd->lsd_mount_count = __le64_to_cpu(buf->lsd_mount_count); - lsd->lsd_feature_compat = __le32_to_cpu(buf->lsd_feature_compat); - lsd->lsd_feature_rocompat = __le32_to_cpu(buf->lsd_feature_rocompat); - lsd->lsd_feature_incompat = __le32_to_cpu(buf->lsd_feature_incompat); - lsd->lsd_server_size = __le32_to_cpu(buf->lsd_server_size); - lsd->lsd_client_start = __le32_to_cpu(buf->lsd_client_start); - lsd->lsd_client_size = __le16_to_cpu(buf->lsd_client_size); - lsd->lsd_subdir_count = __le16_to_cpu(buf->lsd_subdir_count); - lsd->lsd_catalog_oid = __le64_to_cpu(buf->lsd_catalog_oid); - lsd->lsd_catalog_ogen = __le32_to_cpu(buf->lsd_catalog_ogen); + lsd->lsd_last_transno = le64_to_cpu(buf->lsd_last_transno); + lsd->lsd_compat14 = le64_to_cpu(buf->lsd_compat14); + lsd->lsd_mount_count = le64_to_cpu(buf->lsd_mount_count); + lsd->lsd_feature_compat = le32_to_cpu(buf->lsd_feature_compat); + lsd->lsd_feature_rocompat = le32_to_cpu(buf->lsd_feature_rocompat); + lsd->lsd_feature_incompat = le32_to_cpu(buf->lsd_feature_incompat); + lsd->lsd_server_size = le32_to_cpu(buf->lsd_server_size); + lsd->lsd_client_start = le32_to_cpu(buf->lsd_client_start); + lsd->lsd_client_size = le16_to_cpu(buf->lsd_client_size); + lsd->lsd_subdir_count = le16_to_cpu(buf->lsd_subdir_count); + lsd->lsd_catalog_oid = le64_to_cpu(buf->lsd_catalog_oid); + lsd->lsd_catalog_ogen = le32_to_cpu(buf->lsd_catalog_ogen); memcpy(lsd->lsd_peeruuid, buf->lsd_peeruuid, sizeof(lsd->lsd_peeruuid)); - lsd->lsd_osd_index = __le32_to_cpu(buf->lsd_osd_index); - lsd->lsd_padding1 = __le32_to_cpu(buf->lsd_padding1); - lsd->lsd_start_epoch = __le32_to_cpu(buf->lsd_start_epoch); + lsd->lsd_osd_index = le32_to_cpu(buf->lsd_osd_index); + lsd->lsd_padding1 = le32_to_cpu(buf->lsd_padding1); + lsd->lsd_start_epoch = le32_to_cpu(buf->lsd_start_epoch); for (i = 0; i < LR_EXPIRE_INTERVALS; i++) - lsd->lsd_trans_table[i] = __le64_to_cpu(buf->lsd_trans_table[i]); - lsd->lsd_trans_table_time = __le32_to_cpu(buf->lsd_trans_table_time); - lsd->lsd_expire_intervals = __le32_to_cpu(buf->lsd_expire_intervals); + lsd->lsd_trans_table[i] = le64_to_cpu(buf->lsd_trans_table[i]); + lsd->lsd_trans_table_time = le32_to_cpu(buf->lsd_trans_table_time); + lsd->lsd_expire_intervals = le32_to_cpu(buf->lsd_expire_intervals); } static inline void lsd_cpu_to_le(struct lr_server_data *lsd, struct lr_server_data *buf) { int i; + memcpy(buf->lsd_uuid, lsd->lsd_uuid, sizeof(buf->lsd_uuid)); - buf->lsd_last_transno = __cpu_to_le64(lsd->lsd_last_transno); - buf->lsd_compat14 = __cpu_to_le64(lsd->lsd_compat14); - buf->lsd_mount_count = __cpu_to_le64(lsd->lsd_mount_count); - buf->lsd_feature_compat = __cpu_to_le32(lsd->lsd_feature_compat); - buf->lsd_feature_rocompat = __cpu_to_le32(lsd->lsd_feature_rocompat); - buf->lsd_feature_incompat = __cpu_to_le32(lsd->lsd_feature_incompat); - buf->lsd_server_size = __cpu_to_le32(lsd->lsd_server_size); - buf->lsd_client_start = __cpu_to_le32(lsd->lsd_client_start); - buf->lsd_client_size = __cpu_to_le16(lsd->lsd_client_size); - buf->lsd_subdir_count = __cpu_to_le16(lsd->lsd_subdir_count); - buf->lsd_catalog_oid = __cpu_to_le64(lsd->lsd_catalog_oid); - buf->lsd_catalog_ogen = __cpu_to_le32(lsd->lsd_catalog_ogen); + buf->lsd_last_transno = cpu_to_le64(lsd->lsd_last_transno); + buf->lsd_compat14 = cpu_to_le64(lsd->lsd_compat14); + buf->lsd_mount_count = cpu_to_le64(lsd->lsd_mount_count); + buf->lsd_feature_compat = cpu_to_le32(lsd->lsd_feature_compat); + buf->lsd_feature_rocompat = cpu_to_le32(lsd->lsd_feature_rocompat); + buf->lsd_feature_incompat = cpu_to_le32(lsd->lsd_feature_incompat); + buf->lsd_server_size = cpu_to_le32(lsd->lsd_server_size); + buf->lsd_client_start = cpu_to_le32(lsd->lsd_client_start); + buf->lsd_client_size = cpu_to_le16(lsd->lsd_client_size); + buf->lsd_subdir_count = cpu_to_le16(lsd->lsd_subdir_count); + buf->lsd_catalog_oid = cpu_to_le64(lsd->lsd_catalog_oid); + buf->lsd_catalog_ogen = cpu_to_le32(lsd->lsd_catalog_ogen); memcpy(buf->lsd_peeruuid, lsd->lsd_peeruuid, sizeof(buf->lsd_peeruuid)); - buf->lsd_osd_index = __cpu_to_le32(lsd->lsd_osd_index); - buf->lsd_padding1 = __cpu_to_le32(lsd->lsd_padding1); - buf->lsd_start_epoch = __cpu_to_le32(lsd->lsd_start_epoch); + buf->lsd_osd_index = cpu_to_le32(lsd->lsd_osd_index); + buf->lsd_padding1 = cpu_to_le32(lsd->lsd_padding1); + buf->lsd_start_epoch = cpu_to_le32(lsd->lsd_start_epoch); for (i = 0; i < LR_EXPIRE_INTERVALS; i++) - buf->lsd_trans_table[i] = __cpu_to_le64(lsd->lsd_trans_table[i]); - buf->lsd_trans_table_time = __cpu_to_le32(lsd->lsd_trans_table_time); - buf->lsd_expire_intervals = __cpu_to_le32(lsd->lsd_expire_intervals); + buf->lsd_trans_table[i] = cpu_to_le64(lsd->lsd_trans_table[i]); + buf->lsd_trans_table_time = cpu_to_le32(lsd->lsd_trans_table_time); + buf->lsd_expire_intervals = cpu_to_le32(lsd->lsd_expire_intervals); } static inline void lcd_le_to_cpu(struct lsd_client_data *buf, struct lsd_client_data *lcd) { memcpy(lcd->lcd_uuid, buf->lcd_uuid, sizeof (lcd->lcd_uuid)); - lcd->lcd_last_transno = __le64_to_cpu(buf->lcd_last_transno); - lcd->lcd_last_xid = __le64_to_cpu(buf->lcd_last_xid); - lcd->lcd_last_result = __le32_to_cpu(buf->lcd_last_result); - lcd->lcd_last_data = __le32_to_cpu(buf->lcd_last_data); - lcd->lcd_last_close_transno = __le64_to_cpu(buf->lcd_last_close_transno); - lcd->lcd_last_close_xid = __le64_to_cpu(buf->lcd_last_close_xid); - lcd->lcd_last_close_result = __le32_to_cpu(buf->lcd_last_close_result); - lcd->lcd_last_close_data = __le32_to_cpu(buf->lcd_last_close_data); - lcd->lcd_pre_versions[0] = __le64_to_cpu(buf->lcd_pre_versions[0]); - lcd->lcd_pre_versions[1] = __le64_to_cpu(buf->lcd_pre_versions[1]); - lcd->lcd_pre_versions[2] = __le64_to_cpu(buf->lcd_pre_versions[2]); - lcd->lcd_pre_versions[3] = __le64_to_cpu(buf->lcd_pre_versions[3]); - lcd->lcd_last_epoch = __le32_to_cpu(buf->lcd_last_epoch); - lcd->lcd_generation = __le32_to_cpu(buf->lcd_generation); + lcd->lcd_last_transno = le64_to_cpu(buf->lcd_last_transno); + lcd->lcd_last_xid = le64_to_cpu(buf->lcd_last_xid); + lcd->lcd_last_result = le32_to_cpu(buf->lcd_last_result); + lcd->lcd_last_data = le32_to_cpu(buf->lcd_last_data); + lcd->lcd_last_close_transno = le64_to_cpu(buf->lcd_last_close_transno); + lcd->lcd_last_close_xid = le64_to_cpu(buf->lcd_last_close_xid); + lcd->lcd_last_close_result = le32_to_cpu(buf->lcd_last_close_result); + lcd->lcd_last_close_data = le32_to_cpu(buf->lcd_last_close_data); + lcd->lcd_pre_versions[0] = le64_to_cpu(buf->lcd_pre_versions[0]); + lcd->lcd_pre_versions[1] = le64_to_cpu(buf->lcd_pre_versions[1]); + lcd->lcd_pre_versions[2] = le64_to_cpu(buf->lcd_pre_versions[2]); + lcd->lcd_pre_versions[3] = le64_to_cpu(buf->lcd_pre_versions[3]); + lcd->lcd_last_epoch = le32_to_cpu(buf->lcd_last_epoch); + lcd->lcd_generation = le32_to_cpu(buf->lcd_generation); } static inline void lcd_cpu_to_le(struct lsd_client_data *lcd, struct lsd_client_data *buf) { memcpy(buf->lcd_uuid, lcd->lcd_uuid, sizeof (lcd->lcd_uuid)); - buf->lcd_last_transno = __cpu_to_le64(lcd->lcd_last_transno); - buf->lcd_last_xid = __cpu_to_le64(lcd->lcd_last_xid); - buf->lcd_last_result = __cpu_to_le32(lcd->lcd_last_result); - buf->lcd_last_data = __cpu_to_le32(lcd->lcd_last_data); - buf->lcd_last_close_transno = __cpu_to_le64(lcd->lcd_last_close_transno); - buf->lcd_last_close_xid = __cpu_to_le64(lcd->lcd_last_close_xid); - buf->lcd_last_close_result = __cpu_to_le32(lcd->lcd_last_close_result); - buf->lcd_last_close_data = __cpu_to_le32(lcd->lcd_last_close_data); - buf->lcd_pre_versions[0] = __cpu_to_le64(lcd->lcd_pre_versions[0]); - buf->lcd_pre_versions[1] = __cpu_to_le64(lcd->lcd_pre_versions[1]); - buf->lcd_pre_versions[2] = __cpu_to_le64(lcd->lcd_pre_versions[2]); - buf->lcd_pre_versions[3] = __cpu_to_le64(lcd->lcd_pre_versions[3]); - buf->lcd_last_epoch = __cpu_to_le32(lcd->lcd_last_epoch); - buf->lcd_generation = __cpu_to_le32(lcd->lcd_generation); + buf->lcd_last_transno = cpu_to_le64(lcd->lcd_last_transno); + buf->lcd_last_xid = cpu_to_le64(lcd->lcd_last_xid); + buf->lcd_last_result = cpu_to_le32(lcd->lcd_last_result); + buf->lcd_last_data = cpu_to_le32(lcd->lcd_last_data); + buf->lcd_last_close_transno = cpu_to_le64(lcd->lcd_last_close_transno); + buf->lcd_last_close_xid = cpu_to_le64(lcd->lcd_last_close_xid); + buf->lcd_last_close_result = cpu_to_le32(lcd->lcd_last_close_result); + buf->lcd_last_close_data = cpu_to_le32(lcd->lcd_last_close_data); + buf->lcd_pre_versions[0] = cpu_to_le64(lcd->lcd_pre_versions[0]); + buf->lcd_pre_versions[1] = cpu_to_le64(lcd->lcd_pre_versions[1]); + buf->lcd_pre_versions[2] = cpu_to_le64(lcd->lcd_pre_versions[2]); + buf->lcd_pre_versions[3] = cpu_to_le64(lcd->lcd_pre_versions[3]); + buf->lcd_last_epoch = cpu_to_le32(lcd->lcd_last_epoch); + buf->lcd_generation = cpu_to_le32(lcd->lcd_generation); } -static inline __u64 lcd_last_transno(struct lsd_client_data *lcd) +static inline u64 lcd_last_transno(struct lsd_client_data *lcd) { return (lcd->lcd_last_transno > lcd->lcd_last_close_transno ? lcd->lcd_last_transno : lcd->lcd_last_close_transno); } -static inline __u64 lcd_last_xid(struct lsd_client_data *lcd) +static inline u64 lcd_last_xid(struct lsd_client_data *lcd) { return (lcd->lcd_last_xid > lcd->lcd_last_close_xid ? lcd->lcd_last_xid : lcd->lcd_last_close_xid); } -/****************** superblock additional info *********************/ -#ifdef __KERNEL__ - -struct ll_sb_info; - -struct lustre_sb_info { - int lsi_flags; - struct obd_device *lsi_mgc; /* mgc obd */ - struct lustre_mount_data *lsi_lmd; /* mount command info */ - struct ll_sb_info *lsi_llsbi; /* add'l client sbi info */ - struct dt_device *lsi_dt_dev; /* dt device to access disk fs*/ - atomic_t lsi_mounts; /* references to the srv_mnt */ - char lsi_svname[MTI_NAME_MAXLEN]; - char lsi_osd_obdname[64]; - char lsi_osd_uuid[64]; - struct obd_export *lsi_osd_exp; - char lsi_osd_type[16]; - char lsi_fstype[16]; - struct backing_dev_info lsi_bdi; /* each client mountpoint needs - own backing_dev_info */ - struct list_head lsi_lwp_list; - spinlock_t lsi_lwp_lock; - unsigned long lsi_lwp_started:1; -}; - -#define LSI_UMOUNT_FAILOVER 0x00200000 -#define LSI_BDI_INITIALIZED 0x00400000 - -#define s2lsi(sb) ((struct lustre_sb_info *)((sb)->s_fs_info)) -#define s2lsi_nocast(sb) ((sb)->s_fs_info) - -#define get_profile_name(sb) (s2lsi(sb)->lsi_lmd->lmd_profile) -#define get_mount_flags(sb) (s2lsi(sb)->lsi_lmd->lmd_flags) -#define get_mntdev_name(sb) (s2lsi(sb)->lsi_lmd->lmd_dev) -#define get_mount_fileset(sb) (s2lsi(sb)->lsi_lmd->lmd_fileset) - -#endif /* __KERNEL__ */ - /****************** mount lookup info *********************/ struct lustre_mount_info { @@ -574,18 +319,22 @@ struct lustre_mount_info { /****************** prototypes *********************/ -#ifdef __KERNEL__ /* obd_mount.c */ int server_name2fsname(const char *svname, char *fsname, const char **endptr); +#endif /* HAVE_SERVER_SUPPORT */ + int server_name2svname(const char *label, char *svname, const char **endptr, size_t svsize); + +#ifdef HAVE_SERVER_SUPPORT int server_name_is_ost(const char *svname); -int target_name2index(const char *svname, __u32 *idx, const char **endptr); +int target_name2index(const char *svname, u32 *idx, const char **endptr); int lustre_put_lsi(struct super_block *sb); int lustre_start_simple(char *obdname, char *type, char *uuid, char *s1, char *s2, char *s3, char *s4); int lustre_start_mgc(struct super_block *sb); +#endif /* HAVE_SERVER_SUPPORT */ void lustre_register_client_fill_super(int (*cfs)(struct super_block *sb, struct vfsmount *mnt)); void lustre_register_kill_super_cb(void (*cfs)(struct super_block *sb)); @@ -603,8 +352,7 @@ void server_calc_timeout(struct lustre_sb_info *lsi, struct obd_device *obd); int mgc_fsname2resid(char *fsname, struct ldlm_res_id *res_id, int type); int mgc_logname2resid(char *fsname, struct ldlm_res_id *res_id, int type); -#endif /* __KERNEL__ */ /** @} disk */ -#endif // _LUSTRE_DISK_H +#endif /* _LUSTRE_DISK_H */ diff --git a/lustre/include/uapi/linux/.gitignore b/lustre/include/uapi/linux/.gitignore new file mode 100644 index 0000000..10a7e8d --- /dev/null +++ b/lustre/include/uapi/linux/.gitignore @@ -0,0 +1 @@ +/Makefile.in diff --git a/lustre/include/uapi/linux/Makefile.am b/lustre/include/uapi/linux/Makefile.am new file mode 100644 index 0000000..a5ae04a --- /dev/null +++ b/lustre/include/uapi/linux/Makefile.am @@ -0,0 +1,33 @@ +# +# GPL HEADER START +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 only, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License version 2 for more details (a copy is included +# in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU General Public License +# version 2 along with this program; If not, see +# http://www.gnu.org/licenses/gpl-2.0.html +# +# GPL HEADER END +# + +# +# Copyright (c) 2017, James Simmons +# + +# +# This file is part of Lustre, http://www.lustre.org/ +# Lustre is a trademark of Seagate, Inc. +# + +EXTRA_DIST = \ + lustre_disk.h diff --git a/lustre/include/uapi/linux/lustre_disk.h b/lustre/include/uapi/linux/lustre_disk.h new file mode 100644 index 0000000..8887c82 --- /dev/null +++ b/lustre/include/uapi/linux/lustre_disk.h @@ -0,0 +1,229 @@ +/* + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.gnu.org/licenses/gpl-2.0.html + * + * GPL HEADER END + */ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + * + * Copyright (c) 2011, 2016, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * uapi/linux/lustre_disk.h + * + * Lustre disk format definitions. + * + * Author: Nathan Rutman + */ + +#ifndef _UAPI_LUSTRE_DISK_H +#define _UAPI_LUSTRE_DISK_H + +/** \defgroup disk disk + * + * @{ + */ +#include + +/****************** on-disk files ********************/ + +#define MDT_LOGS_DIR "LOGS" /* COMPAT_146 */ +#define MOUNT_CONFIGS_DIR "CONFIGS" +#define CONFIGS_FILE "mountdata" +/** Persistent mount data are stored on the disk in this file. */ +#define MOUNT_DATA_FILE MOUNT_CONFIGS_DIR"/"CONFIGS_FILE +#define LAST_RCVD "last_rcvd" +#define REPLY_DATA "reply_data" +#define LOV_OBJID "lov_objid" +#define LOV_OBJSEQ "lov_objseq" +#define HEALTH_CHECK "health_check" +#define CAPA_KEYS "capa_keys" +#define CHANGELOG_USERS "changelog_users" +#define MGS_NIDTBL_DIR "NIDTBL_VERSIONS" +#define QMT_DIR "quota_master" +#define QSD_DIR "quota_slave" +#define HSM_ACTIONS "hsm_actions" +#define LFSCK_DIR "LFSCK" +#define LFSCK_BOOKMARK "lfsck_bookmark" +#define LFSCK_LAYOUT "lfsck_layout" +#define LFSCK_NAMESPACE "lfsck_namespace" + +/****************** persistent mount data *********************/ + +#define LDD_F_SV_TYPE_MDT 0x0001 +#define LDD_F_SV_TYPE_OST 0x0002 +#define LDD_F_SV_TYPE_MGS 0x0004 +#define LDD_F_SV_TYPE_MASK (LDD_F_SV_TYPE_MDT | \ + LDD_F_SV_TYPE_OST | \ + LDD_F_SV_TYPE_MGS) +#define LDD_F_SV_ALL 0x0008 +/** need an index assignment */ +#define LDD_F_NEED_INDEX 0x0010 +/** never registered */ +#define LDD_F_VIRGIN 0x0020 +/** update the config logs for this server */ +#define LDD_F_UPDATE 0x0040 +/** rewrite the LDD */ +#define LDD_F_REWRITE_LDD 0x0080 +/** regenerate config logs for this fs or server */ +#define LDD_F_WRITECONF 0x0100 +/** COMPAT_14 */ +#define LDD_F_UPGRADE14 0x0200 +/** process as lctl conf_param */ +#define LDD_F_PARAM 0x0400 +/** all nodes are specified as service nodes */ +#define LDD_F_NO_PRIMNODE 0x1000 +/** IR enable flag */ +#define LDD_F_IR_CAPABLE 0x2000 +/** the MGS refused to register the target. */ +#define LDD_F_ERROR 0x4000 +/** process at lctl conf_param */ +#define LDD_F_PARAM2 0x8000 + +#define LDD_MAGIC 0x1dd00001 + +#define XATTR_TARGET_RENAME "trusted.rename_tgt" + +enum ldd_mount_type { + LDD_MT_EXT3 = 0, + LDD_MT_LDISKFS, + LDD_MT_SMFS, + LDD_MT_REISERFS, + LDD_MT_LDISKFS2, + LDD_MT_ZFS, + LDD_MT_LAST +}; + +/* On-disk configuration file. In host-endian order. */ +struct lustre_disk_data { + __u32 ldd_magic; + __u32 ldd_feature_compat; /* compatible feature flags */ + __u32 ldd_feature_rocompat; /* read-only compatible feature flags */ + __u32 ldd_feature_incompat; /* incompatible feature flags */ + + __u32 ldd_config_ver; /* config rewrite count - not used */ + __u32 ldd_flags; /* LDD_SV_TYPE */ + __u32 ldd_svindex; /* server index (0001), must match + * svname + */ + __u32 ldd_mount_type; /* target fs type LDD_MT_* */ + char ldd_fsname[64]; /* filesystem this server is part of, + * MTI_NAME_MAXLEN + */ + char ldd_svname[64]; /* this server's name (lustre-mdt0001)*/ + __u8 ldd_uuid[40]; /* server UUID (COMPAT_146) */ + + char ldd_userdata[1024 - 200]; /* arbitrary user string '200' */ + __u8 ldd_padding[4096 - 1024]; /* 1024 */ + char ldd_mount_opts[4096]; /* target fs mount opts '4096' */ + char ldd_params[4096]; /* key=value pairs '8192' */ +}; + +/****************** last_rcvd file *********************/ + +#define LR_EXPIRE_INTERVALS 16 /**< number of intervals to track transno */ +#define ENOENT_VERSION 1 /** 'virtual' version of non-existent object */ + +#define LR_SERVER_SIZE 512 +#define LR_CLIENT_START 8192 +#define LR_CLIENT_SIZE 128 +#if LR_CLIENT_START < LR_SERVER_SIZE +#error "Can't have LR_CLIENT_START < LR_SERVER_SIZE" +#endif + +/* + * Data stored per server at the head of the last_rcvd file. In le32 order. + */ +struct lr_server_data { + __u8 lsd_uuid[40]; /* server UUID */ + __u64 lsd_last_transno; /* last completed transaction ID */ + __u64 lsd_compat14; /* reserved - compat with old last_rcvd */ + __u64 lsd_mount_count; /* incarnation number */ + __u32 lsd_feature_compat; /* compatible feature flags */ + __u32 lsd_feature_rocompat;/* read-only compatible feature flags */ + __u32 lsd_feature_incompat;/* incompatible feature flags */ + __u32 lsd_server_size; /* size of server data area */ + __u32 lsd_client_start; /* start of per-client data area */ + __u16 lsd_client_size; /* size of per-client data area */ + __u16 lsd_subdir_count; /* number of subdirectories for objects */ + __u64 lsd_catalog_oid; /* recovery catalog object id */ + __u32 lsd_catalog_ogen; /* recovery catalog inode generation */ + __u8 lsd_peeruuid[40]; /* UUID of MDS associated with this OST */ + __u32 lsd_osd_index; /* index number of OST in LOV */ + __u32 lsd_padding1; /* was lsd_mdt_index, unused in 2.4.0 */ + __u32 lsd_start_epoch; /* VBR: start epoch from last boot */ + /** transaction values since lsd_trans_table_time */ + __u64 lsd_trans_table[LR_EXPIRE_INTERVALS]; + /** start point of transno table below */ + __u32 lsd_trans_table_time; /* time of first slot in table above */ + __u32 lsd_expire_intervals; /* LR_EXPIRE_INTERVALS */ + __u8 lsd_padding[LR_SERVER_SIZE - 288]; +}; + +/* Data stored per client in the last_rcvd file. In le32 order. */ +struct lsd_client_data { + __u8 lcd_uuid[40]; /* client UUID */ + __u64 lcd_last_transno; /* last completed transaction ID */ + __u64 lcd_last_xid; /* xid for the last transaction */ + __u32 lcd_last_result; /* result from last RPC */ + __u32 lcd_last_data; /* per-op data (disposition for + * open &c.) + */ + /* for MDS_CLOSE requests */ + __u64 lcd_last_close_transno; /* last completed transaction ID */ + __u64 lcd_last_close_xid; /* xid for the last transaction */ + __u32 lcd_last_close_result; /* result from last RPC */ + __u32 lcd_last_close_data; /* per-op data */ + /* VBR: last versions */ + __u64 lcd_pre_versions[4]; + __u32 lcd_last_epoch; + /* generation counter of client slot in last_rcvd */ + __u32 lcd_generation; + __u8 lcd_padding[LR_CLIENT_SIZE - 128]; +}; + +/* Data stored in each slot of the reply_data file. + * + * The lrd_client_gen field is assigned with lcd_generation value + * to allow identify which client the reply data belongs to. + */ +struct lsd_reply_data { + __u64 lrd_transno; /* transaction number */ + __u64 lrd_xid; /* transmission id */ + __u64 lrd_data; /* per-operation data */ + __u32 lrd_result; /* request result */ + __u32 lrd_client_gen; /* client generation */ +}; + +/* Header of the reply_data file */ +#define LRH_MAGIC 0xbdabda01 +struct lsd_reply_header { + __u32 lrh_magic; + __u32 lrh_header_size; + __u32 lrh_reply_size; + __u8 lrh_pad[sizeof(struct lsd_reply_data) - 12]; +}; + +/** @} disk */ + +#endif /* _UAPI_LUSTRE_DISK_H */ diff --git a/lustre/mgs/mgs_llog.c b/lustre/mgs/mgs_llog.c index eac29cc..ad40f2e 100644 --- a/lustre/mgs/mgs_llog.c +++ b/lustre/mgs/mgs_llog.c @@ -616,6 +616,28 @@ static __inline__ int next_index(void *index_map, int map_len) return -1; } +/* Make the mdt/ost server obd name based on the filesystem name */ +static bool server_make_name(u32 flags, u16 index, const char *fs, + char *name_buf, size_t name_buf_size) +{ + bool invalid_flag = false; + + if (flags & (LDD_F_SV_TYPE_MDT | LDD_F_SV_TYPE_OST)) { + if (!(flags & LDD_F_SV_ALL)) + snprintf(name_buf, name_buf_size, "%.8s%c%s%04x", fs, + (flags & LDD_F_VIRGIN) ? ':' : + ((flags & LDD_F_WRITECONF) ? '=' : '-'), + (flags & LDD_F_SV_TYPE_MDT) ? "MDT" : "OST", + index); + } else if (flags & LDD_F_SV_TYPE_MGS) { + snprintf(name_buf, name_buf_size, "MGS"); + } else { + CERROR("unknown server type %#x\n", flags); + invalid_flag = true; + } + return invalid_flag; +} + /* Return codes: 0 newly marked as in use <0 err @@ -684,7 +706,7 @@ static int mgs_set_index(const struct lu_env *env, clear_bit(FSDB_LOG_EMPTY, &fsdb->fsdb_flags); if (server_make_name(mti->mti_flags & ~(LDD_F_VIRGIN | LDD_F_WRITECONF), mti->mti_stripe_index, mti->mti_fsname, - mti->mti_svname)) { + mti->mti_svname, sizeof(mti->mti_svname))) { CERROR("unknown server type %#x\n", mti->mti_flags); GOTO(out_up, rc = -EINVAL); } @@ -4814,7 +4836,7 @@ int mgs_setparam(const struct lu_env *env, struct mgs_device *mgs, else /* Strip -osc or -mdc suffix from svname */ if (server_make_name(rc, mti->mti_stripe_index, mti->mti_fsname, - mti->mti_svname)) + mti->mti_svname, sizeof(mti->mti_svname))) GOTO(out, rc = -EINVAL); /* * Revoke lock so everyone updates. Should be alright if diff --git a/lustre/obdclass/genops.c b/lustre/obdclass/genops.c index 91b9b81..3ed4c3a 100644 --- a/lustre/obdclass/genops.c +++ b/lustre/obdclass/genops.c @@ -940,6 +940,7 @@ void class_unlink_export(struct obd_export *exp) &exp->exp_client_uuid, &exp->exp_uuid_hash); +#ifdef HAVE_SERVER_SUPPORT if (!hlist_unhashed(&exp->exp_gen_hash)) { struct tg_export_data *ted = &exp->exp_target_data; struct cfs_hash *hash; @@ -952,6 +953,7 @@ void class_unlink_export(struct obd_export *exp) &exp->exp_gen_hash); cfs_hash_putref(hash); } +#endif /* HAVE_SERVER_SUPPORT */ list_move(&exp->exp_obd_chain, &exp->exp_obd->obd_unlinked_exports); list_del_init(&exp->exp_obd_chain_timed); diff --git a/lustre/target/tgt_lastrcvd.c b/lustre/target/tgt_lastrcvd.c index b869298..c7aecdf 100644 --- a/lustre/target/tgt_lastrcvd.c +++ b/lustre/target/tgt_lastrcvd.c @@ -40,6 +40,8 @@ #include "tgt_internal.h" +/** version recovery epoch */ +#define LR_EPOCH_BITS 32 /* Allocate a bitmap for a chunk of reply data slots */ static int tgt_bitmap_chunk_alloc(struct lu_target *lut, int chunk) @@ -447,6 +449,19 @@ void tgt_client_free(struct obd_export *exp) } EXPORT_SYMBOL(tgt_client_free); +static inline void tgt_check_lcd(const char *obd_name, int index, + struct lsd_client_data *lcd) +{ + size_t uuid_size = sizeof(lcd->lcd_uuid); + + if (strnlen((char*)lcd->lcd_uuid, uuid_size) == uuid_size) { + lcd->lcd_uuid[uuid_size - 1] = '\0'; + + LCONSOLE_ERROR("the client UUID (%s) on %s for exports stored in last_rcvd(index = %d) is bad!\n", + lcd->lcd_uuid, obd_name, index); + } +} + static int tgt_client_data_read(const struct lu_env *env, struct lu_target *tgt, struct lsd_client_data *lcd, loff_t *off, int index) @@ -457,7 +472,7 @@ static int tgt_client_data_read(const struct lu_env *env, struct lu_target *tgt, tti_buf_lcd(tti); rc = dt_record_read(env, tgt->lut_last_rcvd, &tti->tti_buf, off); if (rc == 0) { - check_lcd(tgt->lut_obd->obd_name, index, &tti->tti_lcd); + tgt_check_lcd(tgt->lut_obd->obd_name, index, &tti->tti_lcd); lcd_le_to_cpu(&tti->tti_lcd, lcd); lcd->lcd_last_result = ptlrpc_status_ntoh(lcd->lcd_last_result); lcd->lcd_last_close_result = @@ -785,7 +800,7 @@ void tgt_boot_epoch_update(struct lu_target *tgt) } spin_lock(&tgt->lut_translock); - start_epoch = lr_epoch(tgt->lut_last_transno) + 1; + start_epoch = (tgt->lut_last_transno >> LR_EPOCH_BITS) + 1; tgt->lut_last_transno = (__u64)start_epoch << LR_EPOCH_BITS; tgt->lut_lsd.lsd_start_epoch = start_epoch; spin_unlock(&tgt->lut_translock); diff --git a/lustre/utils/lr_reader.c b/lustre/utils/lr_reader.c index 69d09f6..c7717d5 100644 --- a/lustre/utils/lr_reader.c +++ b/lustre/utils/lr_reader.c @@ -59,7 +59,8 @@ #include #include -#include +#include +#include #include char *progname; diff --git a/lustre/utils/mkfs_lustre.c b/lustre/utils/mkfs_lustre.c index 098e607..69fc7e8 100644 --- a/lustre/utils/mkfs_lustre.c +++ b/lustre/utils/mkfs_lustre.c @@ -61,7 +61,6 @@ #include #include #include -#include #include #include #include @@ -222,6 +221,28 @@ void set_defaults(struct mkfs_opts *mop) mop->mo_pool_vdevs = NULL; } +/* Make the mdt/ost server obd name based on the filesystem name */ +static bool server_make_name(__u32 flags, __u16 index, const char *fs, + char *name_buf, size_t name_buf_size) +{ + bool invalid_flag = false; + + if (flags & (LDD_F_SV_TYPE_MDT | LDD_F_SV_TYPE_OST)) { + if (!(flags & LDD_F_SV_ALL)) + snprintf(name_buf, name_buf_size, "%.8s%c%s%04x", fs, + (flags & LDD_F_VIRGIN) ? ':' : + ((flags & LDD_F_WRITECONF) ? '=' : '-'), + (flags & LDD_F_SV_TYPE_MDT) ? "MDT" : "OST", + index); + } else if (flags & LDD_F_SV_TYPE_MGS) { + snprintf(name_buf, name_buf_size, "MGS"); + } else { + fprintf(stderr, "unknown server type %#x\n", flags); + invalid_flag = true; + } + return invalid_flag; +} + static inline void badopt(const char *opt, char *type) { fprintf(stderr, "%s: '--%s' only valid for %s\n", @@ -952,7 +973,8 @@ int main(int argc, char *const argv[]) } if (server_make_name(ldd->ldd_flags, ldd->ldd_svindex, - ldd->ldd_fsname, ldd->ldd_svname)) { + ldd->ldd_fsname, ldd->ldd_svname, + sizeof(ldd->ldd_svname))) { printf("unknown server type %#x\n", ldd->ldd_flags); goto out; } diff --git a/lustre/utils/mount_utils.c b/lustre/utils/mount_utils.c index 7c7539c..22b84f4 100644 --- a/lustre/utils/mount_utils.c +++ b/lustre/utils/mount_utils.c @@ -42,7 +42,6 @@ #include #include #include -#include #include #include #include diff --git a/lustre/utils/mount_utils.h b/lustre/utils/mount_utils.h index c0c4526..613dd65 100644 --- a/lustre/utils/mount_utils.h +++ b/lustre/utils/mount_utils.h @@ -55,7 +55,7 @@ #include #include -#include +#include #include extern char *progname; @@ -117,15 +117,38 @@ struct mount_opts { int get_mountdata(char *, struct lustre_disk_data *); +static inline char *mt_str(enum ldd_mount_type mt) +{ + static char *mount_type_string[] = { + "ext3", + "ldiskfs", + "smfs", + "reiserfs", + "ldiskfs2", + "zfs", + }; + return mount_type_string[mt]; +} + +static inline char *mt_type(enum ldd_mount_type mt) +{ + static char *mount_type_string[] = { + "osd-ldiskfs", + "osd-ldiskfs", + "osd-smfs", + "osd-reiserfs", + "osd-ldiskfs", + "osd-zfs", + }; + return mount_type_string[mt]; +} + #define MT_STR(data) mt_str((data)->ldd_mount_type) -#undef IS_MDT #define IS_MDT(data) ((data)->ldd_flags & LDD_F_SV_TYPE_MDT) -#undef IS_OST #define IS_OST(data) ((data)->ldd_flags & LDD_F_SV_TYPE_OST) -#undef IS_MGS #define IS_MGS(data) ((data)->ldd_flags & LDD_F_SV_TYPE_MGS) -#undef IS_SERVER +#define IS_SEPARATED_MGS(data) ((data)->ldd_flags == LDD_F_SV_TYPE_MGS) #define IS_SERVER(data) ((data)->ldd_flags & (LDD_F_SV_TYPE_MGS | \ LDD_F_SV_TYPE_MDT | LDD_F_SV_TYPE_OST)) diff --git a/lustre/utils/mount_utils_ldiskfs.c b/lustre/utils/mount_utils_ldiskfs.c index 2c41df3..6a047be 100644 --- a/lustre/utils/mount_utils_ldiskfs.c +++ b/lustre/utils/mount_utils_ldiskfs.c @@ -66,8 +66,8 @@ #ifndef BLKGETSIZE64 #include /* for BLKGETSIZE64 */ #endif +#include #include -#include #include #include #include diff --git a/lustre/utils/wirecheck.c b/lustre/utils/wirecheck.c index 04f75ee..09a3854 100644 --- a/lustre/utils/wirecheck.c +++ b/lustre/utils/wirecheck.c @@ -40,7 +40,7 @@ #include #include #include -#include +#include #define BLANK_LINE() \ do { \ diff --git a/lustre/utils/wirehdr.c b/lustre/utils/wirehdr.c index d5defc4..30156cf 100644 --- a/lustre/utils/wirehdr.c +++ b/lustre/utils/wirehdr.c @@ -33,7 +33,7 @@ #include #include #include -#include +#include #undef LASSERT #undef LASSERTF diff --git a/lustre/utils/wiretest.c b/lustre/utils/wiretest.c index 487af70..3b31d73 100644 --- a/lustre/utils/wiretest.c +++ b/lustre/utils/wiretest.c @@ -37,7 +37,7 @@ #include #include -#include +#include #define LASSERT(cond) if (!(cond)) { printf("failed " #cond "\n"); ret = 1; } #define LASSERTF(cond, fmt, ...) if (!(cond)) { printf("failed '" #cond "'" fmt, ## __VA_ARGS__);ret = 1;} -- 1.8.3.1