From 9e04ac1c43e63eccb68eb196174069e5c23d0270 Mon Sep 17 00:00:00 2001 From: Zhilong Liu Date: Fri, 5 May 2017 11:09:41 +0800 Subject: [PATCH] mdadm/util: unify stat checking blkdev into function declare function stat_is_blkdev() to integrate repeated stat checking blkdev operations, it returns 'true/1' when it is a block device, and returns 'false/0' when it isn't. The devname is necessary parameter, *rdev is optional, parse the pointer of dev_t *rdev, if valid, assigned device number to dev_t *rdev, if NULL, ignores. Signed-off-by: Zhilong Liu Signed-off-by: Jes Sorensen --- Assemble.c | 7 ++----- Build.c | 25 ++++--------------------- Incremental.c | 21 ++++----------------- Manage.c | 11 +---------- Monitor.c | 16 ++++------------ mdadm.h | 1 + super-ddf.c | 10 ++++------ super-intel.c | 10 ++++------ util.c | 17 +++++++++++++++++ 9 files changed, 41 insertions(+), 77 deletions(-) diff --git a/Assemble.c b/Assemble.c index 9d0a89ff..30d5838c 100644 --- a/Assemble.c +++ b/Assemble.c @@ -512,15 +512,12 @@ static int select_devices(struct mddev_dev *devlist, /* Now reject spares that don't match domains of identified members */ for (tmpdev = devlist; tmpdev; tmpdev = tmpdev->next) { - struct stat stb; if (tmpdev->used != 3) continue; - if (stat(tmpdev->devname, &stb)< 0) { - pr_err("fstat failed for %s: %s\n", - tmpdev->devname, strerror(errno)); + if (!stat_is_blkdev(tmpdev->devname, &rdev)) { tmpdev->used = 2; } else { - struct dev_policy *pol = devid_policy(stb.st_rdev); + struct dev_policy *pol = devid_policy(rdev); int dt = domain_test(domains, pol, NULL); if (inargv && dt != 0) /* take this spare as domains match diff --git a/Build.c b/Build.c index 2d84b96e..ad59867b 100644 --- a/Build.c +++ b/Build.c @@ -41,7 +41,6 @@ int Build(char *mddev, struct mddev_dev *devlist, * cc = chunk size factor: 0==4k, 1==8k etc. */ int i; - struct stat stb; dev_t rdev; int subdevs = 0, missing_disks = 0; struct mddev_dev *dv; @@ -65,16 +64,8 @@ int Build(char *mddev, struct mddev_dev *devlist, missing_disks++; continue; } - if (stat(dv->devname, &stb)) { - pr_err("Cannot find %s: %s\n", - dv->devname, strerror(errno)); - return 1; - } - if ((stb.st_mode & S_IFMT) != S_IFBLK) { - pr_err("%s is not a block device.\n", - dv->devname); + if (!stat_is_blkdev(dv->devname, NULL)) return 1; - } } if (s->raiddisks != subdevs) { @@ -162,16 +153,8 @@ int Build(char *mddev, struct mddev_dev *devlist, if (strcmp("missing", dv->devname) == 0) continue; - if (stat(dv->devname, &stb)) { - pr_err("Weird: %s has disappeared.\n", - dv->devname); + if (!stat_is_blkdev(dv->devname, &rdev)) goto abort; - } - if ((stb.st_mode & S_IFMT)!= S_IFBLK) { - pr_err("Weird: %s is no longer a block device.\n", - dv->devname); - goto abort; - } fd = open(dv->devname, O_RDONLY|O_EXCL); if (fd < 0) { pr_err("Cannot open %s: %s\n", @@ -187,8 +170,8 @@ int Build(char *mddev, struct mddev_dev *devlist, disk.state = (1<writemostly == FlagSet) disk.state |= 1<devname, strerror(errno)); diff --git a/Incremental.c b/Incremental.c index 11a34e7c..97b2e999 100644 --- a/Incremental.c +++ b/Incremental.c @@ -86,8 +86,7 @@ int Incremental(struct mddev_dev *devlist, struct context *c, * - if number of OK devices match expected, or -R and there are enough, * start the array (auto-readonly). */ - struct stat stb; - dev_t rdev; + dev_t rdev, rdev2; struct mdinfo info, dinfo; struct mdinfo *sra = NULL, *d; struct mddev_ident *match; @@ -108,18 +107,8 @@ int Incremental(struct mddev_dev *devlist, struct context *c, struct createinfo *ci = conf_get_create_info(); - if (stat(devname, &stb) < 0) { - if (c->verbose >= 0) - pr_err("stat failed for %s: %s.\n", - devname, strerror(errno)); - return rv; - } - if ((stb.st_mode & S_IFMT) != S_IFBLK) { - if (c->verbose >= 0) - pr_err("%s is not a block device.\n", - devname); + if (!stat_is_blkdev(devname, &rdev)) return rv; - } dfd = dev_open(devname, O_RDONLY); if (dfd < 0) { if (c->verbose >= 0) @@ -158,10 +147,8 @@ int Incremental(struct mddev_dev *devlist, struct context *c, if (!devlist) { devlist = conf_get_devs(); for (;devlist; devlist = devlist->next) { - struct stat st2; - if (stat(devlist->devname, &st2) == 0 && - (st2.st_mode & S_IFMT) == S_IFBLK && - st2.st_rdev == stb.st_rdev) + if (stat_is_blkdev(devlist->devname, &rdev2) && + rdev2 == rdev) break; } } diff --git a/Manage.c b/Manage.c index af55266b..14276b70 100644 --- a/Manage.c +++ b/Manage.c @@ -1510,24 +1510,16 @@ int Manage_subdevs(char *devname, int fd, */ rdev = makedev(mj, mn); } else { - struct stat stb; tfd = dev_open(dv->devname, O_RDONLY); if (tfd >= 0) { fstat_is_blkdev(tfd, dv->devname, &rdev); close(tfd); } else { int open_err = errno; - if (stat(dv->devname, &stb) != 0) { - pr_err("Cannot find %s: %s\n", - dv->devname, strerror(errno)); - goto abort; - } - if ((stb.st_mode & S_IFMT) != S_IFBLK) { + if (!stat_is_blkdev(dv->devname, &rdev)) { if (dv->disposition == 'M') /* non-fatal. Also improbable */ continue; - pr_err("%s is not a block device.\n", - dv->devname); goto abort; } if (dv->disposition == 'r') @@ -1544,7 +1536,6 @@ int Manage_subdevs(char *devname, int fd, goto abort; } } - rdev = stb.st_rdev; } switch(dv->disposition){ default: diff --git a/Monitor.c b/Monitor.c index 1f15377c..e2b36fff 100644 --- a/Monitor.c +++ b/Monitor.c @@ -993,23 +993,13 @@ static void link_containers_with_subarrays(struct state *list) /* Not really Monitor but ... */ int Wait(char *dev) { - struct stat stb; char devnm[32]; - char *tmp; int rv = 1; int frozen_remaining = 3; - if (stat(dev, &stb) != 0) { - pr_err("Cannot find %s: %s\n", dev, - strerror(errno)); + if (!stat_is_blkdev(dev, NULL)) return 2; - } - tmp = stat2devnm(&stb); - if (!tmp) { - pr_err("%s is not a block device.\n", dev); - return 2; - } - strcpy(devnm, tmp); + strcpy(devnm, dev); while(1) { struct mdstat_ent *ms = mdstat_read(1, 0); @@ -1068,6 +1058,8 @@ int WaitClean(char *dev, int sock, int verbose) int rv = 1; char devnm[32]; + if (!stat_is_blkdev(dev, NULL)) + return 2; fd = open(dev, O_RDONLY); if (fd < 0) { if (verbose) diff --git a/mdadm.h b/mdadm.h index 4adb8409..a92feb2a 100644 --- a/mdadm.h +++ b/mdadm.h @@ -1435,6 +1435,7 @@ extern int check_partitions(int fd, char *dname, unsigned long long freesize, unsigned long long size); extern int fstat_is_blkdev(int fd, char *devname, dev_t *rdev); +extern int stat_is_blkdev(char *devname, dev_t *rdev); extern int get_mdp_major(void); extern int get_maj_min(char *dev, int *major, int *minor); diff --git a/super-ddf.c b/super-ddf.c index 796eaa5d..9c82f4fa 100644 --- a/super-ddf.c +++ b/super-ddf.c @@ -3490,7 +3490,7 @@ static int validate_geometry_ddf_bvd(struct supertype *st, char *dev, unsigned long long *freesize, int verbose) { - struct stat stb; + dev_t rdev; struct ddf_super *ddf = st->sb; struct dl *dl; unsigned long long maxsize; @@ -3526,13 +3526,11 @@ static int validate_geometry_ddf_bvd(struct supertype *st, return 1; } /* This device must be a member of the set */ - if (stat(dev, &stb) < 0) - return 0; - if ((S_IFMT & stb.st_mode) != S_IFBLK) + if (!stat_is_blkdev(dev, NULL)) return 0; for (dl = ddf->dlist ; dl ; dl = dl->next) { - if (dl->major == (int)major(stb.st_rdev) && - dl->minor == (int)minor(stb.st_rdev)) + if (dl->major == (int)major(rdev) && + dl->minor == (int)minor(rdev)) break; } if (!dl) { diff --git a/super-intel.c b/super-intel.c index c4196ea1..e13c9402 100644 --- a/super-intel.c +++ b/super-intel.c @@ -6855,7 +6855,7 @@ static int validate_geometry_imsm_volume(struct supertype *st, int level, unsigned long long *freesize, int verbose) { - struct stat stb; + dev_t rdev; struct intel_super *super = st->sb; struct imsm_super *mpb; struct dl *dl; @@ -6920,13 +6920,11 @@ static int validate_geometry_imsm_volume(struct supertype *st, int level, } /* This device must be a member of the set */ - if (stat(dev, &stb) < 0) - return 0; - if ((S_IFMT & stb.st_mode) != S_IFBLK) + if (!stat_is_blkdev(dev, &rdev)) return 0; for (dl = super->disks ; dl ; dl = dl->next) { - if (dl->major == (int)major(stb.st_rdev) && - dl->minor == (int)minor(stb.st_rdev)) + if (dl->major == (int)major(rdev) && + dl->minor == (int)minor(rdev)) break; } if (!dl) { diff --git a/util.c b/util.c index a92faf83..11ff2ccb 100644 --- a/util.c +++ b/util.c @@ -747,6 +747,23 @@ int fstat_is_blkdev(int fd, char *devname, dev_t *rdev) return 1; } +int stat_is_blkdev(char *devname, dev_t *rdev) +{ + struct stat stb; + + if (stat(devname, &stb) != 0) { + pr_err("stat failed for %s: %s\n", devname, strerror(errno)); + return 0; + } + if ((S_IFMT & stb.st_mode) != S_IFBLK) { + pr_err("%s is not a block device.\n", devname); + return 0; + } + if (rdev) + *rdev = stb.st_rdev; + return 1; +} + int ask(char *mesg) { char *add = ""; -- 2.39.2