From f5889f9a1b8753a1472dfef9d025da2bae395239 Mon Sep 17 00:00:00 2001 From: Mariusz Tkaczyk Date: Mon, 10 Mar 2025 11:16:28 +0100 Subject: [PATCH 37/37] mdadm: use kernel raid headers For a years we redefined these headers in mdadm. We should reuse headers exported by kernel to integrate driver and mdadm better. Include them and remove mdadm owned headers. There are 3 defines not available in kernel headers, so define them directly but put them in ifndef guard to make them transparent later. Use MD_FEATURE_CLUSTERED instead of MD_FEATURE_BITMAP_VERSIONED. The value is same, kernel define has different name. Signed-off-by: Mariusz Tkaczyk --- Create.c | 2 - Detail.c | 2 - Examine.c | 2 - Grow.c | 6 --- Kill.c | 2 - Manage.c | 2 - Query.c | 2 - mdadm.h | 16 ++++++- mdmonitor.c | 2 - super1.c | 126 ++-------------------------------------------------- udev.c | 2 - 11 files changed, 17 insertions(+), 147 deletions(-) diff --git a/Create.c b/Create.c index 2b181dbf..de90b0b8 100644 --- a/Create.c +++ b/Create.c @@ -23,8 +23,6 @@ */ #include "mdadm.h" -#include "md_u.h" -#include "md_p.h" #include "udev.h" #include "xmalloc.h" diff --git a/Detail.c b/Detail.c index b804a624..3802ef8f 100644 --- a/Detail.c +++ b/Detail.c @@ -23,8 +23,6 @@ */ #include "mdadm.h" -#include "md_p.h" -#include "md_u.h" #include "xmalloc.h" #include diff --git a/Examine.c b/Examine.c index 036b7a56..9c8564be 100644 --- a/Examine.c +++ b/Examine.c @@ -24,8 +24,6 @@ #include "dlink.h" #include "mdadm.h" -#include "md_u.h" -#include "md_p.h" #include "xmalloc.h" #if ! defined(__BIG_ENDIAN) && ! defined(__LITTLE_ENDIAN) diff --git a/Grow.c b/Grow.c index 53b0b387..30eaa3c6 100644 --- a/Grow.c +++ b/Grow.c @@ -30,12 +30,6 @@ #include #include -#if ! defined(__BIG_ENDIAN) && ! defined(__LITTLE_ENDIAN) -#error no endian defined -#endif -#include "md_u.h" -#include "md_p.h" - int restore_backup(struct supertype *st, struct mdinfo *content, int working_disks, diff --git a/Kill.c b/Kill.c index 43c9abed..9f05a1ac 100644 --- a/Kill.c +++ b/Kill.c @@ -26,8 +26,6 @@ */ #include "mdadm.h" -#include "md_u.h" -#include "md_p.h" int Kill(char *dev, struct supertype *st, int force, int verbose, int noexcl) { diff --git a/Manage.c b/Manage.c index 034eb00c..22b1f52b 100644 --- a/Manage.c +++ b/Manage.c @@ -23,8 +23,6 @@ */ #include "mdadm.h" -#include "md_u.h" -#include "md_p.h" #include "udev.h" #include "xmalloc.h" diff --git a/Query.c b/Query.c index aedb4ce7..72f49a4e 100644 --- a/Query.c +++ b/Query.c @@ -23,8 +23,6 @@ */ #include "mdadm.h" -#include "md_p.h" -#include "md_u.h" int Query(char *dev) { diff --git a/mdadm.h b/mdadm.h index 7471cedc..ce9c216b 100644 --- a/mdadm.h +++ b/mdadm.h @@ -163,8 +163,20 @@ struct dlm_lksb { #define GROW_SERVICE "mdadm-grow-continue" #endif /* GROW_SERVICE */ -#include "md_u.h" -#include "md_p.h" +#include +#include + +/* These defines might be missing in raid headers*/ +#ifndef MD_SB_BLOCK_CONTAINER_RESHAPE +#define MD_SB_BLOCK_CONTAINER_RESHAPE 3 +#endif +#ifndef MD_SB_BLOCK_VOLUME +#define MD_SB_BLOCK_VOLUME 4 +#endif +#ifndef MD_DISK_REPLACEMENT +#define MD_DISK_REPLACEMENT 17 +#endif + #include "bitmap.h" #include "msg.h" #include "mdadm_status.h" diff --git a/mdmonitor.c b/mdmonitor.c index d1cfbf94..d51617cd 100644 --- a/mdmonitor.c +++ b/mdmonitor.c @@ -23,8 +23,6 @@ */ #include "mdadm.h" -#include "md_p.h" -#include "md_u.h" #include "udev.h" #include "xmalloc.h" diff --git a/super1.c b/super1.c index fb93f462..84d73573 100644 --- a/super1.c +++ b/super1.c @@ -26,92 +26,6 @@ #include "mdadm.h" #include "xmalloc.h" -/* - * The version-1 superblock : - * All numeric fields are little-endian. - * - * total size: 256 bytes plus 2 per device. - * 1K allows 384 devices. - */ -struct mdp_superblock_1 { - /* constant array information - 128 bytes */ - __u32 magic; /* MD_SB_MAGIC: 0xa92b4efc - little endian */ - __u32 major_version; /* 1 */ - __u32 feature_map; /* 0 for now */ - __u32 pad0; /* always set to 0 when writing */ - - __u8 set_uuid[16]; /* user-space generated. */ - char set_name[32]; /* set and interpreted by user-space */ - - __u64 ctime; /* lo 40 bits are seconds, top 24 are microseconds or 0*/ - __u32 level; /* -4 (multipath), -1 (linear), 0,1,4,5 */ - __u32 layout; /* used for raid5, raid6, raid10, and raid0 */ - __u64 size; /* used size of component devices, in 512byte sectors */ - - __u32 chunksize; /* in 512byte sectors */ - __u32 raid_disks; - union { - __u32 bitmap_offset; /* sectors after start of superblock that bitmap starts - * NOTE: signed, so bitmap can be before superblock - * only meaningful of feature_map[0] is set. - */ - - /* only meaningful when feature_map[MD_FEATURE_PPL] is set */ - struct { - __s16 offset; /* sectors from start of superblock that ppl starts */ - __u16 size; /* ppl size in sectors */ - } ppl; - }; - - /* These are only valid with feature bit '4' */ - __u32 new_level; /* new level we are reshaping to */ - __u64 reshape_position; /* next address in array-space for reshape */ - __u32 delta_disks; /* change in number of raid_disks */ - __u32 new_layout; /* new layout */ - __u32 new_chunk; /* new chunk size (sectors) */ - __u32 new_offset; /* signed number to add to data_offset in new - * layout. 0 == no-change. This can be - * different on each device in the array. - */ - - /* constant this-device information - 64 bytes */ - __u64 data_offset; /* sector start of data, often 0 */ - __u64 data_size; /* sectors in this device that can be used for data */ - __u64 super_offset; /* sector start of this superblock */ - union { - __u64 recovery_offset;/* sectors before this offset (from data_offset) have been recovered */ - __u64 journal_tail;/* journal tail of journal device (from data_offset) */ - }; - __u32 dev_number; /* permanent identifier of this device - not role in raid */ - __u32 cnt_corrected_read; /* number of read errors that were corrected by re-writing */ - __u8 device_uuid[16]; /* user-space setable, ignored by kernel */ - __u8 devflags; /* per-device flags. Only one defined...*/ -#define WriteMostly1 1 /* mask for writemostly flag in above */ -#define FailFast1 2 /* Device should get FailFast requests */ - /* bad block log. If there are any bad blocks the feature flag is set. - * if offset and size are non-zero, that space is reserved and available. - */ - __u8 bblog_shift; /* shift from sectors to block size for badblock list */ - __u16 bblog_size; /* number of sectors reserved for badblock list */ - __u32 bblog_offset; /* sector offset from superblock to bblog, signed */ - - /* array state information - 64 bytes */ - __u64 utime; /* 40 bits second, 24 bits microseconds */ - __u64 events; /* incremented when superblock updated */ - __u64 resync_offset; /* data before this offset (from data_offset) known to be in sync */ - __u32 sb_csum; /* checksum upto dev_roles[max_dev] */ - __u32 max_dev; /* size of dev_roles[] array to consider */ - __u8 pad3[64-32]; /* set to 0 when writing */ - - /* device state information. Indexed by dev_number. - * 2 bytes per device - * Note there are no per-device state flags. State information is rolled - * into the 'roles' value. If a device is spare or faulty, then it doesn't - * have a meaningful role. - */ - __u16 dev_roles[0]; /* role in array, or 0xffff for a spare, or 0xfffe for faulty */ -}; - #define MAX_SB_SIZE 4096 /* bitmap super size is 256, but we round up to a sector for alignment */ #define BM_SUPER_SIZE 512 @@ -126,40 +40,6 @@ struct misc_dev_info { #define MULTIPLE_PPL_AREA_SIZE_SUPER1 (1024 * 1024) /* Size of the whole * mutliple PPL area */ -/* feature_map bits */ -#define MD_FEATURE_BITMAP_OFFSET 1 -#define MD_FEATURE_RECOVERY_OFFSET 2 /* recovery_offset is present and - * must be honoured - */ -#define MD_FEATURE_RESHAPE_ACTIVE 4 -#define MD_FEATURE_BAD_BLOCKS 8 /* badblock list is not empty */ -#define MD_FEATURE_REPLACEMENT 16 /* This device is replacing an - * active device with same 'role'. - * 'recovery_offset' is also set. - */ -#define MD_FEATURE_RESHAPE_BACKWARDS 32 /* Reshape doesn't change number - * of devices, but is going - * backwards anyway. - */ -#define MD_FEATURE_NEW_OFFSET 64 /* new_offset must be honoured */ -#define MD_FEATURE_BITMAP_VERSIONED 256 /* bitmap version number checked properly */ -#define MD_FEATURE_JOURNAL 512 /* support write journal */ -#define MD_FEATURE_PPL 1024 /* support PPL */ -#define MD_FEATURE_MUTLIPLE_PPLS 2048 /* support for multiple PPLs */ -#define MD_FEATURE_RAID0_LAYOUT 4096 /* layout is meaningful in RAID0 */ -#define MD_FEATURE_ALL (MD_FEATURE_BITMAP_OFFSET \ - |MD_FEATURE_RECOVERY_OFFSET \ - |MD_FEATURE_RESHAPE_ACTIVE \ - |MD_FEATURE_BAD_BLOCKS \ - |MD_FEATURE_REPLACEMENT \ - |MD_FEATURE_RESHAPE_BACKWARDS \ - |MD_FEATURE_NEW_OFFSET \ - |MD_FEATURE_BITMAP_VERSIONED \ - |MD_FEATURE_JOURNAL \ - |MD_FEATURE_PPL \ - |MD_FEATURE_MULTIPLE_PPLS \ - |MD_FEATURE_RAID0_LAYOUT \ - ) static int role_from_sb(struct mdp_superblock_1 *sb) { @@ -319,7 +199,7 @@ static int awrite(struct align_fd *afd, void *buf, int len) static inline unsigned int md_feature_any_ppl_on(__u32 feature_map) { return ((__cpu_to_le32(feature_map) & - (MD_FEATURE_PPL | MD_FEATURE_MUTLIPLE_PPLS))); + (MD_FEATURE_PPL | MD_FEATURE_MULTIPLE_PPLS))); } static inline unsigned int choose_ppl_space(int chunk) @@ -1483,7 +1363,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info, } case UOPT_NO_PPL: sb->feature_map &= ~__cpu_to_le32(MD_FEATURE_PPL | - MD_FEATURE_MUTLIPLE_PPLS); + MD_FEATURE_MULTIPLE_PPLS); break; case UOPT_DEVICESIZE: if (__le64_to_cpu(sb->super_offset) >= @@ -2650,7 +2530,7 @@ add_internal_bitmap1(struct supertype *st, bms->nodes = __cpu_to_le32(st->nodes); if (st->nodes) sb->feature_map = __cpu_to_le32(__le32_to_cpu(sb->feature_map) | - MD_FEATURE_BITMAP_VERSIONED); + MD_FEATURE_CLUSTERED); if (st->cluster_name) { len = sizeof(bms->cluster_name); strncpy((char *)bms->cluster_name, st->cluster_name, len); diff --git a/udev.c b/udev.c index 88a99781..961ca970 100644 --- a/udev.c +++ b/udev.c @@ -20,8 +20,6 @@ #include "mdadm.h" #include "udev.h" -#include "md_p.h" -#include "md_u.h" #include "xmalloc.h" #include -- 2.41.0