Merge branch 'master' into devel-3.0

Conflicts:

	Manage.c
This commit is contained in:
NeilBrown 2008-10-17 12:46:23 +11:00
commit 492350045c
8 changed files with 86 additions and 32 deletions

View File

@ -300,9 +300,9 @@ int Detail(char *dev, int brief, int export, int test, char *homehost)
printf(" Layout : %s\n", c?c:"-unknown-"); printf(" Layout : %s\n", c?c:"-unknown-");
} }
if (array.level == 10) { if (array.level == 10) {
printf(" Layout : near=%d, %s=%d\n", printf(" Layout :");
array.layout&255, (array.layout&0x10000)?"offset":"far", print_r10_layout(array.layout);
(array.layout>>8)&255); printf("\n");
} }
switch (array.level) { switch (array.level) {
case 0: case 0:

View File

@ -446,13 +446,6 @@ int Manage_subdevs(char *devname, int fd,
} }
if (array.not_persistent == 0 || tst->ss->external) { if (array.not_persistent == 0 || tst->ss->external) {
/* Make sure device is large enough */
if (tst->ss->avail_size(tst, ldsize/512) <
array_size) {
fprintf(stderr, Name ": %s not large enough to join array\n",
dv->devname);
return 1;
}
/* need to find a sample superblock to copy, and /* need to find a sample superblock to copy, and
* a spare slot to use. * a spare slot to use.
@ -488,6 +481,15 @@ int Manage_subdevs(char *devname, int fd,
fprintf(stderr, Name ": cannot find valid superblock in this array - HELP\n"); fprintf(stderr, Name ": cannot find valid superblock in this array - HELP\n");
return 1; return 1;
} }
/* Make sure device is large enough */
if (tst->ss->avail_size(tst, ldsize/512) <
array_size) {
fprintf(stderr, Name ": %s not large enough to join array\n",
dv->devname);
return 1;
}
/* Possibly this device was recently part of the array /* Possibly this device was recently part of the array
* and was temporarily removed, and is now being re-added. * and was temporarily removed, and is now being re-added.
* If so, we can simply re-add it. * If so, we can simply re-add it.

View File

@ -115,6 +115,15 @@ unsigned long long bitmap_bits(unsigned long long array_size,
return (array_size * 512 + chunksize - 1) / chunksize; return (array_size * 512 + chunksize - 1) / chunksize;
} }
unsigned long bitmap_sectors(struct bitmap_super_s *bsb)
{
unsigned long long bits = bitmap_bits(__le64_to_cpu(bsb->sync_size),
__le32_to_cpu(bsb->chunksize));
int bits_per_sector = 8*512;
return (bits + bits_per_sector - 1) / bits_per_sector;
}
bitmap_info_t *bitmap_fd_read(int fd, int brief) bitmap_info_t *bitmap_fd_read(int fd, int brief)
{ {
/* Note: fd might be open O_DIRECT, so we must be /* Note: fd might be open O_DIRECT, so we must be

11
mdadm.8
View File

@ -2138,11 +2138,8 @@ configuration file at all.
.SH SEE ALSO .SH SEE ALSO
For further information on mdadm usage, MD and the various levels of For further information on mdadm usage, MD and the various levels of
RAID, see: RAID, see:
.IP .IP
.UR http://linux-raid.osdl.org/ .B http://linux\-raid.osdl.org/
http://linux\-raid.osdl.org/
.UE
.PP .PP
(based upon Jakob \(/Ostergaard's Software\-RAID.HOWTO) (based upon Jakob \(/Ostergaard's Software\-RAID.HOWTO)
.\".PP .\".PP
@ -2163,9 +2160,9 @@ The latest version of
.I mdadm .I mdadm
should always be available from should always be available from
.IP .IP
.UR http://www.kernel.org/pub/linux/utils/raid/mdadm/ .B http://www.kernel.org/pub/linux/utils/raid/mdadm/
http://www.kernel.org/pub/linux/utils/raid/mdadm/ .PP
.UE Related man pages:
.PP .PP
.IR mdadm.conf (5), .IR mdadm.conf (5),
.IR md (4). .IR md (4).

View File

@ -739,6 +739,7 @@ extern int CreateBitmap(char *filename, int force, char uuid[16],
int major); int major);
extern int ExamineBitmap(char *filename, int brief, struct supertype *st); extern int ExamineBitmap(char *filename, int brief, struct supertype *st);
extern int bitmap_update_uuid(int fd, int *uuid, int swap); extern int bitmap_update_uuid(int fd, int *uuid, int swap);
extern unsigned long bitmap_sectors(struct bitmap_super_s *bsb);
extern int md_get_version(int fd); extern int md_get_version(int fd);
extern int get_linux_version(void); extern int get_linux_version(void);
@ -788,7 +789,8 @@ extern int add_disk(int mdfd, struct supertype *st,
extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info); extern int set_array_info(int mdfd, struct supertype *st, struct mdinfo *info);
extern char *human_size(long long bytes); extern char *human_size(long long bytes);
char *human_size_brief(long long bytes); extern char *human_size_brief(long long bytes);
extern void print_r10_layout(int layout);
#define NoMdDev (1<<23) #define NoMdDev (1<<23)
extern int find_free_devnum(int use_partitions); extern int find_free_devnum(int use_partitions);

View File

@ -188,10 +188,9 @@ static void examine_super0(struct supertype *st, char *homehost)
printf(" Layout : %s\n", c?c:"-unknown-"); printf(" Layout : %s\n", c?c:"-unknown-");
} }
if (sb->level == 10) { if (sb->level == 10) {
printf(" Layout : near=%d, %s=%d\n", printf(" Layout :");
sb->layout&255, print_r10_layout(sb->layout);
(sb->layout&0x10000)?"offset":"far", printf("\n");
(sb->layout>>8)&255);
} }
switch(sb->level) { switch(sb->level) {
case 0: case 0:

View File

@ -248,10 +248,9 @@ static void examine_super1(struct supertype *st, char *homehost)
printf(" New Layout : %s\n", c?c:"-unknown-"); printf(" New Layout : %s\n", c?c:"-unknown-");
} }
if (__le32_to_cpu(sb->level) == 10) { if (__le32_to_cpu(sb->level) == 10) {
printf(" New Layout : near=%d, %s=%d\n", printf(" New Layout :");
__le32_to_cpu(sb->new_layout)&255, print_r10_layout(__le32_to_cpu(sb->new_layout));
(__le32_to_cpu(sb->new_layout)&0x10000)?"offset":"far", printf("\n");
(__le32_to_cpu(sb->new_layout)>>8)&255);
} }
} }
if (__le32_to_cpu(sb->new_chunk) != __le32_to_cpu(sb->chunksize)) if (__le32_to_cpu(sb->new_chunk) != __le32_to_cpu(sb->chunksize))
@ -281,10 +280,9 @@ static void examine_super1(struct supertype *st, char *homehost)
} }
if (__le32_to_cpu(sb->level) == 10) { if (__le32_to_cpu(sb->level) == 10) {
int lo = __le32_to_cpu(sb->layout); int lo = __le32_to_cpu(sb->layout);
printf(" Layout : near=%d, %s=%d\n", printf(" Layout :");
lo&255, print_r10_layout(lo);
(lo&0x10000)?"offset":"far", printf("\n");
(lo>>8)&255);
} }
switch(__le32_to_cpu(sb->level)) { switch(__le32_to_cpu(sb->level)) {
case 0: case 0:
@ -597,7 +595,7 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
} }
if (strcmp(update, "linear-grow-new") == 0) { if (strcmp(update, "linear-grow-new") == 0) {
int i; int i;
int rfd; int rfd, fd;
int max = __le32_to_cpu(sb->max_dev); int max = __le32_to_cpu(sb->max_dev);
for (i=0 ; i < max ; i++) for (i=0 ; i < max ; i++)
@ -618,6 +616,25 @@ static int update_super1(struct supertype *st, struct mdinfo *info,
sb->dev_roles[i] = sb->dev_roles[i] =
__cpu_to_le16(info->disk.raid_disk); __cpu_to_le16(info->disk.raid_disk);
fd = open(devname, O_RDONLY);
if (fd >= 0) {
unsigned long long ds;
get_dev_size(fd, devname, &ds);
close(fd);
ds >>= 9;
if (__le64_to_cpu(sb->super_offset) <
__le64_to_cpu(sb->data_offset)) {
sb->data_size = __cpu_to_le64(
ds - __le64_to_cpu(sb->data_offset));
} else {
ds -= 8*2;
ds &= ~(unsigned long long)(4*2-1);
sb->super_offset = __cpu_to_le64(ds);
sb->data_size = __cpu_to_le64(
ds - __le64_to_cpu(sb->data_offset));
}
}
} }
if (strcmp(update, "linear-grow-update") == 0) { if (strcmp(update, "linear-grow-update") == 0) {
sb->raid_disks = __cpu_to_le32(info->array.raid_disks); sb->raid_disks = __cpu_to_le32(info->array.raid_disks);
@ -1272,10 +1289,21 @@ static struct supertype *match_metadata_desc1(char *arg)
*/ */
static __u64 avail_size1(struct supertype *st, __u64 devsize) static __u64 avail_size1(struct supertype *st, __u64 devsize)
{ {
struct mdp_superblock_1 *super = st->sb;
if (devsize < 24) if (devsize < 24)
return 0; return 0;
devsize -= choose_bm_space(devsize); if (super == NULL)
/* creating: allow suitable space for bitmap */
devsize -= choose_bm_space(devsize);
#ifndef MDASSEMBLE
else if (__le32_to_cpu(super->feature_map)&MD_FEATURE_BITMAP_OFFSET) {
/* hot-add. allow for actual size of bitmap */
struct bitmap_super_s *bsb;
bsb = (struct bitmap_super_s *)(((char*)super)+1024);
devsize -= bitmap_sectors(bsb);
}
#endif
switch(st->minor_version) { switch(st->minor_version) {
case -1: /* no specified. Now time to set default */ case -1: /* no specified. Now time to set default */

17
util.c
View File

@ -640,6 +640,23 @@ char *human_size_brief(long long bytes)
); );
return buf; return buf;
} }
void print_r10_layout(int layout)
{
int near = layout & 255;
int far = (layout >> 8) & 255;
int offset = (layout&0x10000);
char *sep = "";
if (near != 1) {
printf("%s near=%d", sep, near);
sep = ",";
}
if (far != 1)
printf("%s %s=%d", sep, offset?"offset":"far", far);
if (near*far == 1)
printf("NO REDUNDANCY");
}
#endif #endif
unsigned long long calc_array_size(int level, int raid_disks, int layout, unsigned long long calc_array_size(int level, int raid_disks, int layout,