Add data_offset arg to ->avail_size

This is currently only useful for 1.x metadata and will allow an
explicit --data-offset request on command line.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2012-10-04 16:34:20 +10:00
parent 822e393a05
commit 387fcd593c
7 changed files with 39 additions and 12 deletions

View File

@ -867,7 +867,11 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
close(mdfd);
}
if ((sra->component_size > 0 &&
st2->ss->avail_size(st2, devsize) < sra->component_size)
st2->ss->avail_size(st2, devsize,
sra->devs
? sra->devs->data_offset
: INVALID_SECTORS)
< sra->component_size)
||
(sra->component_size == 0 && devsize < component_size)) {
if (verbose > 1)

View File

@ -628,7 +628,7 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
}
/* Make sure device is large enough */
if (tst->ss->avail_size(tst, ldsize/512) <
if (tst->ss->avail_size(tst, ldsize/512, INVALID_SECTORS) <
array_size) {
if (dv->disposition == 'M')
return 0;

View File

@ -750,7 +750,8 @@ extern struct superswitch {
int (*load_super)(struct supertype *st, int fd, char *devname);
int (*load_container)(struct supertype *st, int fd, char *devname);
struct supertype * (*match_metadata_desc)(char *arg);
__u64 (*avail_size)(struct supertype *st, __u64 size);
__u64 (*avail_size)(struct supertype *st, __u64 size,
unsigned long long data_offset);
unsigned long long (*min_acceptable_spare_size)(struct supertype *st);
int (*add_internal_bitmap)(struct supertype *st, int *chunkp,
int delay, int write_behind,

View File

@ -2479,7 +2479,8 @@ static int write_init_super_ddf(struct supertype *st)
#endif
static __u64 avail_size_ddf(struct supertype *st, __u64 devsize)
static __u64 avail_size_ddf(struct supertype *st, __u64 devsize,
unsigned long long data_offset)
{
/* We must reserve the last 32Meg */
if (devsize <= 32*1024*2)
@ -2747,7 +2748,7 @@ validate_geometry_ddf_container(struct supertype *st,
}
close(fd);
*freesize = avail_size_ddf(st, ldsize >> 9);
*freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
if (*freesize == 0)
return 0;

View File

@ -3024,7 +3024,8 @@ static size_t disks_to_mpb_size(int disks)
return size;
}
static __u64 avail_size_imsm(struct supertype *st, __u64 devsize)
static __u64 avail_size_imsm(struct supertype *st, __u64 devsize,
unsigned long long data_offset)
{
if (devsize < (MPB_SECTOR_CNT + IMSM_RESERVED_SECTORS))
return 0;
@ -5340,7 +5341,7 @@ static int validate_geometry_imsm_container(struct supertype *st, int level,
}
}
*freesize = avail_size_imsm(st, ldsize >> 9);
*freesize = avail_size_imsm(st, ldsize >> 9, INVALID_SECTORS);
free_imsm(super);
return 1;

View File

@ -975,8 +975,11 @@ static struct supertype *match_metadata_desc0(char *arg)
return NULL;
}
static __u64 avail_size0(struct supertype *st, __u64 devsize)
static __u64 avail_size0(struct supertype *st, __u64 devsize,
unsigned long long data_offset)
{
if (data_offset != 0 && data_offset != INVALID_SECTORS)
return 0ULL;
if (devsize < MD_RESERVED_SECTORS)
return 0ULL;
return MD_NEW_SIZE_SECTORS(devsize);

View File

@ -1609,21 +1609,23 @@ static struct supertype *match_metadata_desc1(char *arg)
* superblock type st, and reserving 'reserve' sectors for
* a possible bitmap
*/
static __u64 avail_size1(struct supertype *st, __u64 devsize)
static __u64 avail_size1(struct supertype *st, __u64 devsize,
unsigned long long data_offset)
{
struct mdp_superblock_1 *super = st->sb;
int bmspace = 0;
if (devsize < 24)
return 0;
if (super == NULL)
/* creating: allow suitable space for bitmap */
devsize -= choose_bm_space(devsize);
bmspace = 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)+MAX_SB_SIZE);
devsize -= bitmap_sectors(bsb);
bmspace = bitmap_sectors(bsb);
}
#endif
/* Allow space for bad block log */
@ -1632,9 +1634,24 @@ static __u64 avail_size1(struct supertype *st, __u64 devsize)
else
devsize -= 8;
if (st->minor_version < 0)
/* not specified, so time to set default */
st->minor_version = 2;
if (data_offset != INVALID_SECTORS)
switch(st->minor_version) {
case 0:
return devsize - data_offset - 8*2;
case 1:
case 2:
return devsize - data_offset;
default:
return 0;
}
devsize -= bmspace;
if (super == NULL && st->minor_version > 0) {
/* haven't committed to a size yet, so allow some
* slack for space for reshape.
@ -1916,7 +1933,7 @@ static int validate_geometry1(struct supertype *st, int level,
}
close(fd);
*freesize = avail_size1(st, ldsize >> 9);
*freesize = avail_size1(st, ldsize >> 9, INVALID_SECTORS);
return 1;
}
#endif /* MDASSEMBLE */