Central calls to ioctl BLKGETSIZE

Instead of opencoding the same thing everywhere.
This commit is contained in:
Neil Brown 2006-12-14 17:32:57 +11:00
parent ab5303d695
commit beae1dfe2e
12 changed files with 62 additions and 141 deletions

View File

@ -951,8 +951,8 @@ int Assemble(struct supertype *st, char *mddev, int mdfd,
while (usecs < 1000) {
mdfd = open(mddev, O_RDONLY);
if (mdfd >= 0) {
unsigned long size;
if (ioctl(mdfd, BLKGETSIZE, &size) == 0 &&
unsigned long long size;
if (get_dev_size(mdfd, NULL, &size) &&
size > 0)
break;
close(mdfd);

11
Build.c
View File

@ -148,7 +148,7 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
}
/* now add the devices */
for ((i=0), (dv = devlist) ; dv ; i++, dv=dv->next) {
unsigned long dsize;
unsigned long long dsize;
int fd;
if (strcmp("missing", dv->devname) == 0)
continue;
@ -168,12 +168,9 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
dv->devname, strerror(errno));
goto abort;
}
if (ioctl(fd, BLKGETSIZE, &dsize) == 0 && dsize > 0) {
unsigned long long ldsize = dsize;
ldsize <<= 9;
if (size== 0 || ldsize < size)
size = ldsize;
}
if (get_dev_size(fd, NULL, &dsize) &&
(size == 0 || dsize < size))
size = dsize;
close(fd);
if (vers>= 9000) {
mdu_disk_info_t disk;

View File

@ -180,7 +180,6 @@ int Create(struct supertype *st, char *mddev, int mdfd,
dnum = 0;
for (dv=devlist; dv; dv=dv->next, dnum++) {
char *dname = dv->devname;
unsigned long dsize;
unsigned long long ldsize, freesize;
int fd;
if (strcasecmp(dname, "missing")==0) {
@ -199,22 +198,11 @@ int Create(struct supertype *st, char *mddev, int mdfd,
fail=1;
continue;
}
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &ldsize)==0)
;
else
#endif
if (ioctl(fd, BLKGETSIZE, &dsize)) {
fprintf(stderr, Name ": Cannot get size of %s: %s\n",
dname, strerror(errno));
if (!get_dev_size(fd, dname, &ldsize)) {
fail = 1;
close(fd);
continue;
}
else {
ldsize = dsize;
ldsize <<= 9;
}
if (st == NULL) {
struct createinfo *ci = conf_get_create_info();
if (ci)

View File

@ -132,7 +132,6 @@ int Detail(char *dev, int brief, int test, char *homehost)
printf("ARRAY %s level=%s num-devices=%d", dev, c?c:"-unknown-",array.raid_disks );
else {
mdu_bitmap_file_t bmf;
unsigned long array_size;
unsigned long long larray_size;
struct mdstat_ent *ms = mdstat_read(0, 0);
struct mdstat_ent *e;
@ -143,17 +142,8 @@ int Detail(char *dev, int brief, int test, char *homehost)
for (e=ms; e; e=e->next)
if (e->devnum == devnum)
break;
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &larray_size)==0)
;
else
#endif
if (ioctl(fd, BLKGETSIZE, &array_size)==0) {
larray_size = array_size;
larray_size <<= 9;
}
else larray_size = 0;
if (!get_dev_size(fd, NULL, &larray_size))
larray_size = 0;
printf("%s:\n", dev);
printf(" Version : %02d.%02d.%02d\n",

4
Grow.c
View File

@ -257,15 +257,13 @@ int Grow_addbitmap(char *devname, int fd, char *file, int chunk, int delay, int
}
bitmapsize = array.size;
bitmapsize <<= 1;
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &array_size) == 0 &&
if (get_dev_size(fd, NULL, &array_size) &&
array_size > (0x7fffffffULL<<9)) {
/* Array is big enough that we cannot trust array.size
* try other approaches
*/
bitmapsize = get_component_size(fd);
}
#endif
if (bitmapsize == 0) {
fprintf(stderr, Name ": Cannot reliably determine size of array to create bitmap - sorry.\n");
return 1;

View File

@ -187,7 +187,6 @@ int Manage_subdevs(char *devname, int fd,
}
for (dv = devlist ; dv; dv=dv->next) {
unsigned long long ldsize;
unsigned long dsize;
if (stat(dv->devname, &stb)) {
fprintf(stderr, Name ": cannot find %s: %s\n",
@ -224,19 +223,9 @@ int Manage_subdevs(char *devname, int fd,
if (array.not_persistent==0)
st->ss->load_super(st, tfd, &osuper, NULL);
/* will use osuper later */
#ifdef BLKGETSIZE64
if (ioctl(tfd, BLKGETSIZE64, &ldsize)==0)
;
else
#endif
if (ioctl(tfd, BLKGETSIZE, &dsize)) {
fprintf(stderr, Name ": Cannot get size of %s: %s\n",
dv->devname, strerror(errno));
if (!get_dev_size(tfd, dv->devname, &ldsize)) {
close(tfd);
return 1;
} else {
ldsize = dsize;
ldsize <<= 9;
}
close(tfd);

12
Query.c
View File

@ -47,7 +47,6 @@ int Query(char *dev)
struct supertype *st = NULL;
unsigned long long larray_size;
unsigned long array_size;
struct stat stb;
char *mddev;
mdu_disk_info_t disc;
@ -67,15 +66,8 @@ int Query(char *dev)
fstat(fd, &stb);
if (vers>=9000 && !ioctlerr) {
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &larray_size)==0)
;
else
#endif
if (ioctl(fd, BLKGETSIZE, &array_size)==0) {
larray_size = array_size;
larray_size <<= 9;
} else larray_size = 0;
if (!get_dev_size(fd, NULL, &larray_size))
larray_size = 0;
}
if (vers < 0)

View File

@ -344,6 +344,7 @@ struct supertype {
extern struct supertype *super_by_version(int vers, int minor);
extern struct supertype *guess_super(int fd);
extern int get_dev_size(int fd, char *dname, unsigned long long *sizep);
#if __GNUC__ < 3
struct stat64;

View File

@ -588,20 +588,12 @@ static void add_to_super0(void *sbv, mdu_disk_info_t *dinfo)
static int store_super0(struct supertype *st, int fd, void *sbv)
{
unsigned long size;
unsigned long long dsize;
unsigned long long offset;
mdp_super_t *super = sbv;
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
#endif
{
if (ioctl(fd, BLKGETSIZE, &size))
return 1;
else
dsize = ((unsigned long long)size)<<9;
}
if (!get_dev_size(fd, NULL, &dsize))
return 1;
if (dsize < MD_RESERVED_SECTORS*2*512)
return 2;
@ -708,20 +700,10 @@ static int load_super0(struct supertype *st, int fd, void **sbp, char *devname)
int uuid[4];
struct bitmap_super_s *bsb;
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
#endif
{
if (ioctl(fd, BLKGETSIZE, &size)) {
if (devname)
fprintf(stderr, Name ": cannot find device size for %s: %s\n",
devname, strerror(errno));
return 1;
} else
dsize = size << 9;
}
if (!get_dev_size(fd, devname, &dsize))
return 1;
if (dsize < MD_RESERVED_SECTORS*2) {
if (dsize < MD_RESERVED_SECTORS*512 * 2) {
if (devname)
fprintf(stderr, Name ": %s is too small for md: size is %ld sectors.\n",
devname, size);
@ -877,19 +859,12 @@ static int add_internal_bitmap0(struct supertype *st, void *sbv, int *chunkp,
void locate_bitmap0(struct supertype *st, int fd, void *sbv)
{
unsigned long long dsize;
unsigned long size;
unsigned long long offset;
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
#endif
{
if (ioctl(fd, BLKGETSIZE, &size))
return;
else
dsize = ((unsigned long long)size)<<9;
}
if (dsize < MD_RESERVED_SECTORS*2)
if (!get_dev_size(fd, NULL, &dsize))
return;
if (dsize < MD_RESERVED_SECTORS*512 * 2)
return;
offset = MD_NEW_SIZE_SECTORS(dsize>>9);
@ -903,7 +878,6 @@ void locate_bitmap0(struct supertype *st, int fd, void *sbv)
int write_bitmap0(struct supertype *st, int fd, void *sbv)
{
unsigned long size;
unsigned long long dsize;
unsigned long long offset;
mdp_super_t *sb = sbv;
@ -913,17 +887,11 @@ int write_bitmap0(struct supertype *st, int fd, void *sbv)
int towrite, n;
char buf[4096];
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
#endif
{
if (ioctl(fd, BLKGETSIZE, &size))
return 1;
else
dsize = ((unsigned long long)size)<<9;
}
if (!get_dev_size(fd, NULL, &dsize))
return 1;
if (dsize < MD_RESERVED_SECTORS*2)
if (dsize < MD_RESERVED_SECTORS*512 * 2)
return -1;
offset = MD_NEW_SIZE_SECTORS(dsize>>9);

View File

@ -696,19 +696,12 @@ static int store_super1(struct supertype *st, int fd, void *sbv)
struct mdp_superblock_1 *sb = sbv;
unsigned long long sb_offset;
int sbsize;
unsigned long size;
unsigned long long dsize;
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
#endif
{
if (ioctl(fd, BLKGETSIZE, &size))
return 1;
else
dsize = (unsigned long long)size;
} else
dsize >>= 9;
if (!get_dev_size(fd, NULL, &dsize))
return 1;
dsize >>= 9;
if (dsize < 24)
return 2;
@ -820,17 +813,9 @@ static int write_init_super1(struct supertype *st, void *sbv,
free(refsb);
}
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
#endif
{
unsigned long size;
if (ioctl(fd, BLKGETSIZE, &size))
return 1;
else
dsize = size;
} else
dsize >>= 9;
if (!get_dev_size(fd, NULL, &dsize))
return 1;
dsize >>= 9;
if (dsize < 24) {
close(fd);
@ -937,7 +922,6 @@ static int compare_super1(void **firstp, void *secondv)
static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
{
unsigned long size;
unsigned long long dsize;
unsigned long long sb_offset;
struct mdp_superblock_1 *super;
@ -978,19 +962,9 @@ static int load_super1(struct supertype *st, int fd, void **sbp, char *devname)
st->ss = NULL;
return 2;
}
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &dsize) != 0)
#endif
{
if (ioctl(fd, BLKGETSIZE, &size)) {
if (devname)
fprintf(stderr, Name ": cannot find device size for %s: %s\n",
devname, strerror(errno));
return 1;
}
dsize = size;
} else
dsize >>= 9;
if (!get_dev_size(fd, devname, &dsize))
return 1;
dsize >>= 9;
if (dsize < 24) {
if (devname)

2
test
View File

@ -65,6 +65,7 @@ fi
# mdadm always adds --quiet, and we want to see any unexpected messages
mdadm() {
rm -f $targetdir/stderr
case $* in
*-C* ) $mdadm 2> $targetdir/stderr --quiet "$@" --auto=yes;;
* ) $mdadm 2> $targetdir/stderr --quiet "$@"
@ -161,6 +162,7 @@ for script in tests/$prefix tests/$prefix*[^~]
do
if [ -f "$script" ]
then
rm -f $targetdir/stderr
# source script in a subshell, so it has access to our
# namespace, but cannot change it.
if ( set -ex ; . $script ) 2> $targetdir/log

22
util.c
View File

@ -773,6 +773,28 @@ struct supertype *guess_super(int fd)
return NULL;
}
/* Return size of device in bytes */
int get_dev_size(int fd, char *dname, unsigned long long *sizep)
{
unsigned long long ldsize;
#ifdef BLKGETSIZE64
if (ioctl(fd, BLKGETSIZE64, &ldsize) != 0)
#endif
{
unsigned long dsize;
if (ioctl(fd, BLKGETSIZE, &dsize) == 0) {
ldsize = dsize;
ldsize <<= 9;
} else {
if (dname)
fprintf(stderr, Name ": Cannot get size of %s: %s\b",
dname, strerror(errno));
return 0;
}
}
*sizep = ldsize;
return 1;
}
#ifdef __TINYC__
/* tinyc doesn't optimize this check in ioctl.h out ... */