mdadm --create /dev/md0 .... /dev/sda1:1024 /dev/sdb1:2048 ...
The size is in K unless a suffix: K M G is given.
The suffix 's' means sectors.
Signed-off-by: NeilBrown <neilb@suse.de>
char *dname = dv->devname;
unsigned long long freesize;
int dfd;
+ char *doff;
if (strcasecmp(dname, "missing")==0) {
if (first_missing > dnum)
missing_disks ++;
continue;
}
+ doff = strchr(dname, ':');
+ if (doff) {
+ *doff++ = 0;
+ dv->data_offset = parse_size(doff);
+ } else
+ dv->data_offset = data_offset;
+
dfd = open(dname, O_RDONLY);
if (dfd < 0) {
fprintf(stderr, Name ": cannot open %s: %s\n",
layout = default_layout(st, level, verbose);
switch (st->ss->validate_geometry(
st, level, layout, raiddisks,
- &chunk, size*2, data_offset, dname,
+ &chunk, size*2, dv->data_offset, dname,
&freesize, verbose > 0)) {
case -1: /* Not valid, message printed, and not
* worth checking any further */
layout = default_layout(st, level, 0);
if (!st->ss->validate_geometry(st, level, layout,
raiddisks,
- &chunk, size*2, data_offset,
+ &chunk, size*2, dv->data_offset,
dname, &freesize,
verbose >= 0)) {
if (fd >= 0)
remove_partitions(fd);
if (st->ss->add_to_super(st, &inf->disk,
- fd, dv->devname)) {
+ fd, dv->devname,
+ dv->data_offset)) {
ioctl(mdfd, STOP_ARRAY, NULL);
goto abort;
}
disc.state |= 1 << MD_DISK_WRITEMOSTLY;
dfd = dev_open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
if (tst->ss->add_to_super(tst, &disc, dfd,
- dv->devname)) {
+ dv->devname, -1)) {
close(dfd);
goto abort;
}
if (mdmon_running(tst->container_dev))
tst->update_tail = &tst->updates;
if (tst->ss->add_to_super(tst, &disc, dfd,
- dv->devname)) {
+ dv->devname, -1)) {
close(dfd);
close(container_fd);
goto abort;
st2->ss->free_super(st2);
st->update_tail = &update;
- st->ss->add_to_super(st, &dk, dfd, NULL);
+ st->ss->add_to_super(st, &dk, dfd, NULL, -1);
st->ss->write_init_super(st);
queue_metadata_update(update);
st->update_tail = NULL;
char writemostly; /* 1 for 'set writemostly', 2 for 'clear writemostly' */
char re_add;
char used; /* set when used */
+ long long data_offset;
struct mddev_dev *next;
};
* when hot-adding a spare.
*/
int (*add_to_super)(struct supertype *st, mdu_disk_info_t *dinfo,
- int fd, char *devname);
+ int fd, char *devname, long long data_offset);
/* update the metadata to delete a device,
* when hot-removing.
*/
* expanding a pre-existing container
*/
static int add_to_super_ddf(struct supertype *st,
- mdu_disk_info_t *dk, int fd, char *devname)
+ mdu_disk_info_t *dk, int fd, char *devname,
+ long long data_offset)
{
struct ddf_super *ddf = st->sb;
struct dl *dd;
}
static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
- int fd, char *devname)
+ int fd, char *devname, long long data_offset)
{
struct intel_super *super = st->sb;
struct dl *dd;
#ifndef MDASSEMBLE
/* Add a device to the superblock being created */
static int add_to_super0(struct supertype *st, mdu_disk_info_t *dinfo,
- int fd, char *devname)
+ int fd, char *devname, long long data_offset)
{
mdp_super_t *sb = st->sb;
mdp_disk_t *dk = &sb->disks[dinfo->number];
struct devinfo {
int fd;
char *devname;
+ long long data_offset;
mdu_disk_info_t disk;
struct devinfo *next;
};
#ifndef MDASSEMBLE
/* Add a device to the superblock being created */
static int add_to_super1(struct supertype *st, mdu_disk_info_t *dk,
- int fd, char *devname)
+ int fd, char *devname, long long data_offset)
{
struct mdp_superblock_1 *sb = st->sb;
__u16 *rp = sb->dev_roles + dk->number;
di->fd = fd;
di->devname = devname;
di->disk = *dk;
+ di->data_offset = data_offset;
di->next = NULL;
*dip = di;
headroom/2 >= __le32_to_cpu(sb->chunksize) * 2)
headroom >>= 1;
-
+ data_offset = di->data_offset;
switch(st->minor_version) {
case 0:
sb_offset = dsize;
sb_offset -= 8*2;
sb_offset &= ~(4*2-1);
sb->super_offset = __cpu_to_le64(sb_offset);
- data_offset = (long long)(int64_t)__le64_to_cpu(sb->data_offset);
if (data_offset < 0)
sb->data_offset = 0;
if (sb_offset < array_size + bm_space)
break;
case 1:
sb->super_offset = __cpu_to_le64(0);
- data_offset = (long long)(int64_t)__le64_to_cpu(sb->data_offset);
if (data_offset < 0) {
reserved = bm_space + 4*2;
if (reserved < headroom)
case 2:
sb_offset = 4*2;
sb->super_offset = __cpu_to_le64(4*2);
- data_offset = (long long)(int64_t)__le64_to_cpu(sb->data_offset);
if (data_offset < 0) {
if (4*2 + 4*2 + bm_space + array_size
> dsize)
c++;
s *= 1024 * 1024 * 2;
break;
+ case 's': /* sectors */
+ c++;
+ break;
}
}
if (*c)