This allows for larger device number if glibc supports
it (requires 2.3.3).
Also fail before creating larger device number if glibc
support isn't present.
Signed-off-by: Neil Brown <neilb@cse.unsw.edu.au>
12 files changed:
if (strcmp(update, "super-minor") ==0) {
struct stat stb2;
fstat(mdfd, &stb2);
if (strcmp(update, "super-minor") ==0) {
struct stat stb2;
fstat(mdfd, &stb2);
- super.md_minor = MINOR(stb2.st_rdev);
+ super.md_minor = minor(stb2.st_rdev);
if (verbose)
fprintf(stderr, Name ": updating superblock of %s with minor number %d\n",
devname, super.md_minor);
if (verbose)
fprintf(stderr, Name ": updating superblock of %s with minor number %d\n",
devname, super.md_minor);
fprintf(stderr, Name ": %s is identified as a member of %s, slot %d.\n",
devname, mddev, super.this_disk.raid_disk);
devices[devcnt].devname = devname;
fprintf(stderr, Name ": %s is identified as a member of %s, slot %d.\n",
devname, mddev, super.this_disk.raid_disk);
devices[devcnt].devname = devname;
- devices[devcnt].major = MAJOR(stb.st_rdev);
- devices[devcnt].minor = MINOR(stb.st_rdev);
+ devices[devcnt].major = major(stb.st_rdev);
+ devices[devcnt].minor = minor(stb.st_rdev);
devices[devcnt].oldmajor = super.this_disk.major;
devices[devcnt].oldminor = super.this_disk.minor;
devices[devcnt].events = md_event(&super);
devices[devcnt].oldmajor = super.this_disk.major;
devices[devcnt].oldminor = super.this_disk.minor;
devices[devcnt].events = md_event(&super);
* so we can just start the array
*/
unsigned long dev;
* so we can just start the array
*/
unsigned long dev;
- dev = MKDEV(devices[chosen_drive].major,
+ dev = makedev(devices[chosen_drive].major,
devices[chosen_drive].minor);
if (ioctl(mdfd, START_ARRAY, dev)) {
fprintf(stderr, Name ": Cannot start array: %s\n",
devices[chosen_drive].minor);
if (ioctl(mdfd, START_ARRAY, dev)) {
fprintf(stderr, Name ": Cannot start array: %s\n",
array.raid_disks = raiddisks;
array.md_minor = 0;
if (fstat(mdfd, &stb)==0)
array.raid_disks = raiddisks;
array.md_minor = 0;
if (fstat(mdfd, &stb)==0)
- array.md_minor = MINOR(stb.st_rdev);
+ array.md_minor = minor(stb.st_rdev);
array.not_persistent = 1;
array.state = 0; /* not clean, but no errors */
if (assume_clean)
array.not_persistent = 1;
array.state = 0; /* not clean, but no errors */
if (assume_clean)
disk.number = i;
disk.raid_disk = i;
disk.state = 6;
disk.number = i;
disk.raid_disk = i;
disk.state = 6;
- disk.major = MAJOR(stb.st_rdev);
- disk.minor = MINOR(stb.st_rdev);
+ disk.major = major(stb.st_rdev);
+ disk.minor = minor(stb.st_rdev);
if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
fprintf(stderr, Name ": ADD_NEW_DISK failed for %s: %s\n",
dv->devname, strerror(errno));
if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
fprintf(stderr, Name ": ADD_NEW_DISK failed for %s: %s\n",
dv->devname, strerror(errno));
- Remove underscore from partition names, so partitions of
"foo" are "foo1", "foo2" etc (unchanged) and partitions of
"f00" are "f00p1", "f00p2" etc rather than "f00_p1"...
- Remove underscore from partition names, so partitions of
"foo" are "foo1", "foo2" etc (unchanged) and partitions of
"f00" are "f00p1", "f00p2" etc rather than "f00_p1"...
+ - Use "major", "minor", "makedev" macros instead of
+ "MAJOR", "MINOR", "MKDEV" so that large device numbers work
+ on 2.6 (providing you have glibc 2.3.3 or later).
Changes Prior to 1.8.0 release
- Makefile cleanup from Luca Berra <bluca@comedia.it>
Changes Prior to 1.8.0 release
- Makefile cleanup from Luca Berra <bluca@comedia.it>
*/
array.md_minor = 0;
if (fstat(mdfd, &stb)==0)
*/
array.md_minor = 0;
if (fstat(mdfd, &stb)==0)
- array.md_minor = MINOR(stb.st_rdev);
+ array.md_minor = minor(stb.st_rdev);
array.not_persistent = 0;
/*** FIX: Need to do something about RAID-6 here ***/
if ( ( (level == 5) &&
array.not_persistent = 0;
/*** FIX: Need to do something about RAID-6 here ***/
if ( ( (level == 5) &&
return 1;
}
fstat(fd, &stb);
return 1;
}
fstat(fd, &stb);
- disk.major = MAJOR(stb.st_rdev);
- disk.minor = MINOR(stb.st_rdev);
+ disk.major = major(stb.st_rdev);
+ disk.minor = minor(stb.st_rdev);
close(fd);
}
if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
close(fd);
}
if (ioctl(mdfd, ADD_NEW_DISK, &disk)) {
struct mdstat_ent *ms = mdstat_read(0);
struct mdstat_ent *e;
int devnum = array.md_minor;
struct mdstat_ent *ms = mdstat_read(0);
struct mdstat_ent *e;
int devnum = array.md_minor;
- if (MAJOR(stb.st_rdev) != MD_MAJOR)
+ if (major(stb.st_rdev) != MD_MAJOR)
devnum = -1 - devnum;
for (e=ms; e; e=e->next)
devnum = -1 - devnum;
for (e=ms; e; e=e->next)
* device from the array, and then put it back.
* If this fails, we are rebuilding
*/
* device from the array, and then put it back.
* If this fails, we are rebuilding
*/
- int err = ioctl(fd, HOT_REMOVE_DISK, MKDEV(disk.major, disk.minor));
- if (err == 0) ioctl(fd, HOT_ADD_DISK, MKDEV(disk.major, disk.minor));
+ int err = ioctl(fd, HOT_REMOVE_DISK, makedev(disk.major, disk.minor));
+ if (err == 0) ioctl(fd, HOT_ADD_DISK, makedev(disk.major, disk.minor));
if (err && errno == EBUSY)
printf(" rebuilding");
}
if (err && errno == EBUSY)
printf(" rebuilding");
}
memset(&super.disks[d], 0, sizeof(super.disks[d]));
super.disks[d].number = d;
memset(&super.disks[d], 0, sizeof(super.disks[d]));
super.disks[d].number = d;
- super.disks[d].major = MAJOR(stb.st_rdev);
- super.disks[d].minor = MINOR(stb.st_rdev);
+ super.disks[d].major = major(stb.st_rdev);
+ super.disks[d].minor = minor(stb.st_rdev);
super.disks[d].raid_disk = d;
super.disks[d].state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
super.disks[d].raid_disk = d;
super.disks[d].state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
return 1;
}
disk.number = d;
return 1;
}
disk.number = d;
- disk.major = MAJOR(stb.st_rdev);
- disk.minor = MINOR(stb.st_rdev);
+ disk.major = major(stb.st_rdev);
+ disk.minor = minor(stb.st_rdev);
disk.raid_disk = d;
disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
close(nfd);
disk.raid_disk = d;
disk.state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
close(nfd);
super.working_disks = nd+1;
memset(&super.disks[nd], 0, sizeof(super.disks[nd]));
super.disks[nd].number = nd;
super.working_disks = nd+1;
memset(&super.disks[nd], 0, sizeof(super.disks[nd]));
super.disks[nd].number = nd;
- super.disks[nd].major = MAJOR(stb.st_rdev);
- super.disks[nd].minor = MINOR(stb.st_rdev);
+ super.disks[nd].major = major(stb.st_rdev);
+ super.disks[nd].minor = minor(stb.st_rdev);
super.disks[nd].raid_disk = nd;
super.disks[nd].state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
super.disks[nd].raid_disk = nd;
super.disks[nd].state = (1 << MD_DISK_SYNC) | (1 << MD_DISK_ACTIVE);
disc.number =j;
disc.raid_disk = j;
disc.state = 0;
disc.number =j;
disc.raid_disk = j;
disc.state = 0;
- disc.major = MAJOR(stb.st_rdev);
- disc.minor = MINOR(stb.st_rdev);
+ disc.major = major(stb.st_rdev);
+ disc.minor = minor(stb.st_rdev);
if (ioctl(fd,ADD_NEW_DISK, &disc)) {
fprintf(stderr, Name ": add new device failed for %s: %s\n",
dv->devname, strerror(errno));
if (ioctl(fd,ADD_NEW_DISK, &disc)) {
fprintf(stderr, Name ": add new device failed for %s: %s\n",
dv->devname, strerror(errno));
struct stat stb;
if (fstat(fd, &stb) == 0 &&
(S_IFMT&stb.st_mode)==S_IFBLK) {
struct stat stb;
if (fstat(fd, &stb) == 0 &&
(S_IFMT&stb.st_mode)==S_IFBLK) {
- if (MAJOR(stb.st_rdev) == MD_MAJOR)
- st->devnum = MINOR(stb.st_rdev);
+ if (major(stb.st_rdev) == MD_MAJOR)
+ st->devnum = minor(stb.st_rdev);
- st->devnum = -1- (MINOR(stb.st_rdev)>>6);
+ st->devnum = -1- (minor(stb.st_rdev)>>6);
alert("Fail", dev, dv, mailaddr, alert_cmd);
else if (i >= (unsigned)array.raid_disks &&
(disc.major || disc.minor) &&
alert("Fail", dev, dv, mailaddr, alert_cmd);
else if (i >= (unsigned)array.raid_disks &&
(disc.major || disc.minor) &&
- st->devid[i] == MKDEV(disc.major, disc.minor) &&
+ st->devid[i] == makedev(disc.major, disc.minor) &&
((newstate&change)&(1<<MD_DISK_FAULTY))
)
alert("FailSpare", dev, dv, mailaddr, alert_cmd);
((newstate&change)&(1<<MD_DISK_FAULTY))
)
alert("FailSpare", dev, dv, mailaddr, alert_cmd);
alert("SpareActive", dev, dv, mailaddr, alert_cmd);
}
st->devstate[i] = disc.state;
alert("SpareActive", dev, dv, mailaddr, alert_cmd);
}
st->devstate[i] = disc.state;
- st->devid[i] = MKDEV(disc.major, disc.minor);
+ st->devid[i] = makedev(disc.major, disc.minor);
}
close(fd);
st->active = array.active_disks;
}
close(fd);
st->active = array.active_disks;
if (md_get_version(fd) >= 9000 &&
ioctl(fd, GET_ARRAY_INFO, &array)>= 0) {
if (ioctl(fd, GET_DISK_INFO, &disc) >= 0 &&
if (md_get_version(fd) >= 9000 &&
ioctl(fd, GET_ARRAY_INFO, &array)>= 0) {
if (ioctl(fd, GET_DISK_INFO, &disc) >= 0 &&
- MKDEV((unsigned)disc.major,(unsigned)disc.minor) == stb.st_rdev)
+ makedev((unsigned)disc.major,(unsigned)disc.minor) == stb.st_rdev)
activity = "active";
else
activity = "mismatch";
activity = "active";
else
activity = "mismatch";
if ((int)ident.super_minor == -2) {
struct stat stb;
fstat(mdfd, &stb);
if ((int)ident.super_minor == -2) {
struct stat stb;
fstat(mdfd, &stb);
- ident.super_minor = MINOR(stb.st_rdev);
+ ident.super_minor = minor(stb.st_rdev);
return;
if (!S_ISBLK(stb.st_mode))
return;
return;
if (!S_ISBLK(stb.st_mode))
return;
- major = MAJOR(stb.st_rdev);
- minor = MINOR(stb.st_rdev);
+ major = major(stb.st_rdev);
+ minor = minor(stb.st_rdev);
for (i=1; i <= cnt ; i++) {
struct stat stb2;
sprintf(name, "%s%s%d", dev, dig?"p":"", i);
if (stat(name, &stb2)==0) {
if (!S_ISBLK(stb2.st_mode))
continue;
for (i=1; i <= cnt ; i++) {
struct stat stb2;
sprintf(name, "%s%s%d", dev, dig?"p":"", i);
if (stat(name, &stb2)==0) {
if (!S_ISBLK(stb2.st_mode))
continue;
- if (stb2.st_rdev == MKDEV(major, minor+i))
+ if (stb2.st_rdev == makedev(major, minor+i))
continue;
unlink(name);
} else {
stb2 = stb;
}
continue;
unlink(name);
} else {
stb2 = stb;
}
- mknod(name, S_IFBLK | 0600, MKDEV(major, minor+i));
+ mknod(name, S_IFBLK | 0600, makedev(major, minor+i));
chown(name, stb2.st_uid, stb2.st_gid);
chmod(name, stb2.st_mode & 07777);
}
chown(name, stb2.st_uid, stb2.st_gid);
chmod(name, stb2.st_mode & 07777);
}
/* check major number is correct */
if (autof>0)
major = get_mdp_major();
/* check major number is correct */
if (autof>0)
major = get_mdp_major();
- if (stb.st_mode && MAJOR(stb.st_rdev) != major)
+ if (stb.st_mode && major(stb.st_rdev) != major)
must_remove = 1;
if (stb.st_mode && !must_remove) {
mdu_array_info_t array;
must_remove = 1;
if (stb.st_mode && !must_remove) {
mdu_array_info_t array;
/* If it was a 'standard' name and it is in-use, then
* the device could already be correct
*/
/* If it was a 'standard' name and it is in-use, then
* the device could already be correct
*/
- if (stb.st_mode && MAJOR(stb.st_rdev) == major &&
- MINOR(stb.st_rdev) == minor)
+ if (stb.st_mode && major(stb.st_rdev) == major &&
+ minor(stb.st_rdev) == minor)
+ if (major(makedev(major,minor)) != major ||
+ minor(makedev(major,minor)) != minor) {
+ fprintf(stderr, Name ": Need newer C library to use more than 4 partitionable md devices, sorry\n");
+ return -1;
+ }
if (must_remove)
unlink(dev);
if (must_remove)
unlink(dev);
- if (mknod(dev, S_IFBLK|0600, MKDEV(major, minor))!= 0) {
+ if (mknod(dev, S_IFBLK|0600, makedev(major, minor))!= 0) {
fprintf(stderr, Name ": failed to create %s\n", dev);
return -1;
}
fprintf(stderr, Name ": failed to create %s\n", dev);
return -1;
}
return (vers.major*10000) + (vers.minor*100) + vers.patchlevel;
if (errno == EACCES)
return -1;
return (vers.major*10000) + (vers.minor*100) + vers.patchlevel;
if (errno == EACCES)
return -1;
- if (MAJOR(stb.st_rdev) == MD_MAJOR)
+ if (major(stb.st_rdev) == MD_MAJOR)
return (3600);
return -1;
}
return (3600);
return -1;
}
char *n = strdup(name);
struct devmap *dm = malloc(sizeof(*dm));
if (dm) {
char *n = strdup(name);
struct devmap *dm = malloc(sizeof(*dm));
if (dm) {
- dm->major = MAJOR(stb->st_rdev);
- dm->minor = MINOR(stb->st_rdev);
+ dm->major = major(stb->st_rdev);
+ dm->minor = minor(stb->st_rdev);
dm->name = n;
dm->next = devlist;
devlist = dm;
dm->name = n;
dm->next = devlist;
devlist = dm;
if (dev < 0) {
int mdp = get_mdp_major();
if (mdp < 0) return NULL;
if (dev < 0) {
int mdp = get_mdp_major();
if (mdp < 0) return NULL;
- rdev = MKDEV(mdp, (-1-dev)<<6);
+ rdev = makedev(mdp, (-1-dev)<<6);
sprintf(devname, "/dev/md/d%d", -1-dev);
if (stat(devname, &stb) == 0
&& (S_IFMT&stb.st_mode) == S_IFBLK
&& (stb.st_rdev == rdev))
return devname;
} else {
sprintf(devname, "/dev/md/d%d", -1-dev);
if (stat(devname, &stb) == 0
&& (S_IFMT&stb.st_mode) == S_IFBLK
&& (stb.st_rdev == rdev))
return devname;
} else {
- rdev = MKDEV(MD_MAJOR, dev);
+ rdev = makedev(MD_MAJOR, dev);
sprintf(devname, "/dev/md%d", dev);
if (stat(devname, &stb) == 0
&& (S_IFMT&stb.st_mode) == S_IFBLK
sprintf(devname, "/dev/md%d", dev);
if (stat(devname, &stb) == 0
&& (S_IFMT&stb.st_mode) == S_IFBLK