File 0001-Manage-simplify-rdev-handling-in-Manage_subdevs.patch of Package mdadm.1739

From 5dffd09d24c3dcc690677910219254e0703503e3 Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Mon, 11 Aug 2014 10:22:24 +1000
Subject: [PATCH 1/3] Manage: simplify `rdev` handling in Manage_subdevs.

The only use 'struct stat stb' to get the 'rdev', and sometimes
we don't even use 'stat'.
So make 'rdev' a stand-alone variable, and only declare stb'
when we actually need it.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Coly Li <colyli@suse.de>
---
 Manage.c |   20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

--- a/Manage.c
+++ b/Manage.c
@@ -1284,7 +1284,6 @@ int Manage_subdevs(char *devname, int fd
 	mdu_array_info_t array;
 	unsigned long long array_size;
 	struct mddev_dev *dv;
-	struct stat stb;
 	int tfd = -1;
 	struct supertype *tst;
 	char *subarray = NULL;
@@ -1316,8 +1315,8 @@ int Manage_subdevs(char *devname, int fd
 		goto abort;
 	}
 
-	stb.st_rdev = 0;
 	for (dv = devlist; dv; dv = dv->next) {
+		unsigned long rdev = 0; /* device to add/remove etc */
 		int rv;
 
 		raid_slot = -1;
@@ -1414,7 +1413,7 @@ int Manage_subdevs(char *devname, int fd
 				int mj,mn;
 				if (sysfs_fd_get_str(sysfd, dn, 20) > 0 &&
 				    sscanf(dn, "%d:%d", &mj,&mn) == 2) {
-					stb.st_rdev = makedev(mj,mn);
+					rdev = makedev(mj,mn);
 					found = 1;
 				}
 				close(sysfd);
@@ -1430,6 +1429,7 @@ int Manage_subdevs(char *devname, int fd
 				}
 			}
 		} else {
+			struct stat stb;
 			tfd = dev_open(dv->devname, O_RDONLY);
 			if (tfd >= 0)
 				fstat(tfd, &stb);
@@ -1462,6 +1462,7 @@ int Manage_subdevs(char *devname, int fd
 					goto abort;
 				}
 			}
+			rdev = stb.st_rdev;
 		}
 		switch(dv->disposition){
 		default:
@@ -1484,8 +1485,7 @@ int Manage_subdevs(char *devname, int fd
 				/* Need to remove first */
 				int err;
 				do {
-					err = ioctl(fd, HOT_REMOVE_DISK,
-						    (unsigned long)stb.st_rdev);
+					err = ioctl(fd, HOT_REMOVE_DISK, rdev);
 				} while (err && errno == EBUSY && force && usleep(50000) == 0);
 			}
 			/* Make sure it isn't in use (in 2.6 or later) */
@@ -1513,7 +1513,7 @@ int Manage_subdevs(char *devname, int fd
 			}
 			rv = Manage_add(fd, tfd, dv, tst, &array,
 					force, verbose, devname, update,
-					stb.st_rdev, array_size, raid_slot);
+					rdev, array_size, raid_slot);
 			close(tfd);
 			tfd = -1;
 			if (rv < 0)
@@ -1531,7 +1531,7 @@ int Manage_subdevs(char *devname, int fd
 				rv = -1;
 			} else
 				rv = Manage_remove(tst, fd, dv, sysfd,
-						   stb.st_rdev, verbose, force,
+						   rdev, verbose, force,
 						   devname);
 			if (sysfd >= 0)
 				close(sysfd);
@@ -1546,7 +1546,7 @@ int Manage_subdevs(char *devname, int fd
 			/* FIXME check current member */
 			if ((sysfd >= 0 && write(sysfd, "faulty", 6) != 6) ||
 			    (sysfd < 0 && ioctl(fd, SET_DISK_FAULTY,
-						(unsigned long) stb.st_rdev))) {
+						rdev))) {
 				if (errno == EBUSY)
 					busy = 1;
 				pr_err("set device faulty failed for %s:  %s\n",
@@ -1577,7 +1577,7 @@ int Manage_subdevs(char *devname, int fd
 						frozen = -1;
 				}
 				rv = Manage_replace(tst, fd, dv,
-						    stb.st_rdev, verbose,
+						    rdev, verbose,
 						    devname);
 			}
 			if (rv < 0)
@@ -1591,7 +1591,7 @@ int Manage_subdevs(char *devname, int fd
 			goto abort;
 		case 'w': /* --with device which was matched */
 			rv = Manage_with(tst, fd, dv,
-					 stb.st_rdev, verbose, devname);
+					 rdev, verbose, devname);
 			if (rv < 0)
 				goto abort;
 			break;
openSUSE Build Service is sponsored by