diff options
author | Neil Brown <neilb@suse.de> | 2005-04-04 05:16:13 +0000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2005-04-04 05:16:13 +0000 |
commit | 0df46c2ad8872a9d6e5832f3098d12a7e0d2eb01 (patch) | |
tree | b328e05ae148e9d2627a4a9e62c1b6a705136c03 /mdopen.c | |
parent | 8d80900b492998a112eda80614a793012bee2770 (diff) | |
download | mdadm-0df46c2ad8872a9d6e5832f3098d12a7e0d2eb01.tar.gz mdadm-0df46c2ad8872a9d6e5832f3098d12a7e0d2eb01.tar.xz mdadm-0df46c2ad8872a9d6e5832f3098d12a7e0d2eb01.zip |
Change MAJOR() etc to major() etc
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>
Diffstat (limited to 'mdopen.c')
-rw-r--r-- | mdopen.c | 21 |
1 files changed, 13 insertions, 8 deletions
@@ -49,21 +49,21 @@ void make_parts(char *dev, int cnt) 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; - if (stb2.st_rdev == MKDEV(major, minor+i)) + if (stb2.st_rdev == makedev(major, minor+i)) 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); } @@ -101,7 +101,7 @@ int open_mddev(char *dev, int autof) /* 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; @@ -181,14 +181,19 @@ int open_mddev(char *dev, int autof) /* 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) ; else { + 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 (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; } |