linux-raid.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] Incremental: remove obsoleted calls to udisks
@ 2023-05-25 17:08 Coly Li
  2023-05-26  7:52 ` Mariusz Tkaczyk
  0 siblings, 1 reply; 4+ messages in thread
From: Coly Li @ 2023-05-25 17:08 UTC (permalink / raw)
  To: linux-raid; +Cc: Coly Li, Mariusz Tkaczyk, Jes Sorensen

Utilility udisks is removed from udev upstream, calling this obsoleted
command in run_udisks() doesn't make any sense now.

This patch removes the calls chain of udisks, which includes routines
run_udisk(), force_remove(), and 2 locations where force_remove() are
called. Considering force_remove() is removed with udisks util, it is
fair to remove Manage_stop() inside force_remove() as well.

After force_remove() is not called anymore, if Manage_subdevs() returns
failure due to a busy array, nothing else to do. If the failure is from
a broken array and verbose information is wanted, a warning message will
be printed by pr_err().

Signed-off-by: Coly Li <colyli@suse.de>
Cc: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com>
Cc: Jes Sorensen <jes@trained-monkey.org>
---
Changelog,
v2: improve based on code review comments from Mariusz.
v1: initial version.

 Incremental.c | 88 ++++++++++++++++++++++++---------------------------
 1 file changed, 42 insertions(+), 46 deletions(-)

diff --git a/Incremental.c b/Incremental.c
index f13ce02..d390a08 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -1628,56 +1628,38 @@ release:
 	return rv;
 }
 
-static void run_udisks(char *arg1, char *arg2)
-{
-	int pid = fork();
-	int status;
-	if (pid == 0) {
-		manage_fork_fds(1);
-		execl("/usr/bin/udisks", "udisks", arg1, arg2, NULL);
-		execl("/bin/udisks", "udisks", arg1, arg2, NULL);
-		exit(1);
-	}
-	while (pid > 0 && wait(&status) != pid)
-		;
-}
-
-static int force_remove(char *devnm, int fd, struct mdinfo *mdi, int verbose)
-{
-	int rv;
-	int devid = devnm2devid(devnm);
-
-	run_udisks("--unmount", map_dev(major(devid), minor(devid), 0));
-	rv = Manage_stop(devnm, fd, verbose, 1);
-	if (rv) {
-		/* At least we can try to trigger a 'remove' */
-		sysfs_uevent(mdi, "remove");
-		if (verbose)
-			pr_err("Fail to stop %s too.\n", devnm);
-	}
-	return rv;
-}
-
 static void remove_from_member_array(struct mdstat_ent *memb,
 				    struct mddev_dev *devlist, int verbose)
 {
 	int rv;
 	struct mdinfo mmdi;
+	char buf[32];
 	int subfd = open_dev(memb->devnm);
 
-	if (subfd >= 0) {
-		rv = Manage_subdevs(memb->devnm, subfd, devlist, verbose,
-				    0, UOPT_UNDEFINED, 0);
-		if (rv & 2) {
-			if (sysfs_init(&mmdi, -1, memb->devnm))
-				pr_err("unable to initialize sysfs for: %s\n",
-				       memb->devnm);
-			else
-				force_remove(memb->devnm, subfd, &mmdi,
-					     verbose);
+	if (subfd < 0)
+		return;
+
+	rv = Manage_subdevs(memb->devnm, subfd, devlist, verbose,
+			    0, UOPT_UNDEFINED, 0);
+	if (rv) {
+		/*
+		 * If the array is busy or no verbose info
+		 * desired, nonthing else to do.
+		 */
+		if ((rv & 2) || verbose <= 0)
+			goto close;
+
+		/* Otherwise if failed due to a broken array, warn */
+		if (sysfs_init(&mmdi, -1, memb->devnm) == 0 &&
+		    sysfs_get_str(&mmdi, NULL, "array_state",
+				  buf, sizeof(buf)) > 0 &&
+		    strncmp(buf, "broken", 6) == 0) {
+			pr_err("Fail to remove %s from broken array.\n",
+			       memb->devnm);
 		}
-		close(subfd);
 	}
+close:
+	close(subfd);
 }
 
 /*
@@ -1760,11 +1742,22 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
 	} else {
 		rv |= Manage_subdevs(ent->devnm, mdfd, &devlist,
 				    verbose, 0, UOPT_UNDEFINED, 0);
-		if (rv & 2) {
-		/* Failed due to EBUSY, try to stop the array.
-		 * Give udisks a chance to unmount it first.
-		 */
-			rv = force_remove(ent->devnm, mdfd, &mdi, verbose);
+		if (rv) {
+			/*
+			 * If the array is busy or no verbose info
+			 * desired, nothing else to do.
+			 */
+			if ((rv & 2) || verbose <= 0)
+				goto end;
+
+			/* Otherwise if failed due to a broken array, warn */
+			if (sysfs_get_str(&mdi, NULL, "array_state",
+					  buf, sizeof(buf)) > 0 &&
+			    strncmp(buf, "broken", 6) == 0) {
+				pr_err("Fail to remove %s from broken array.\n",
+				       ent->devnm);
+			}
+
 			goto end;
 		}
 	}
@@ -1775,5 +1768,8 @@ int IncrementalRemove(char *devname, char *id_path, int verbose)
 end:
 	close(mdfd);
 	free_mdstat(ent);
+	/* Only return 0 or 1 */
+	if (rv != 0)
+		rv = 1;
 	return rv;
 }
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-05-29  7:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-25 17:08 [PATCH v2] Incremental: remove obsoleted calls to udisks Coly Li
2023-05-26  7:52 ` Mariusz Tkaczyk
2023-05-26 14:42   ` Coly Li
2023-05-29  7:53     ` Mariusz Tkaczyk

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).