[PATCH 2/2] erofs-utils: mount: add --worker-log for detached workers

Yifan Zhao zhaoyifan28 at huawei.com
Fri Apr 3 17:42:30 AEDT 2026


Detached NBD and fanotify workers currently redirect stdout and stderr
to /dev/null after fork(), which makes their runtime logs invisible once
mount.erofs returns.

Add a `--worker-log=PATH` option so detached workers can append logs to
a caller-provided file for better observability.

Assisted-by: Codex:GPT-5.4
Signed-off-by: Yifan Zhao <zhaoyifan28 at huawei.com>
---
 mount/main.c | 58 ++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 43 insertions(+), 15 deletions(-)

diff --git a/mount/main.c b/mount/main.c
index 45ac32e..40175e3 100644
--- a/mount/main.c
+++ b/mount/main.c
@@ -75,6 +75,7 @@ static struct erofsmount_cfg {
 	char *options;
 	char *full_options;		/* used for erofsfuse */
 	char *fstype;
+	char *worker_log_path;
 	long flags;
 	enum erofs_backend_drv backend;
 	enum erofsmount_mode mountmode;
@@ -119,10 +120,10 @@ static int erofsmount_worker_set_signal(int signum, sighandler_t handler)
 	return 0;
 }
 
-static int erofsmount_worker_detach(void)
+static int erofsmount_worker_detach(const char *log_path)
 {
 	sigset_t mask;
-	int fd, err;
+	int infd, outfd, err;
 
 	if (setsid() < 0)
 		return -errno;
@@ -148,18 +149,33 @@ static int erofsmount_worker_detach(void)
 	if (err)
 		return err;
 
-	fd = open("/dev/null", O_RDWR);
-	if (fd < 0)
+	infd = open("/dev/null", O_RDONLY | O_CLOEXEC);
+	if (infd < 0)
 		return -errno;
-	if (dup2(fd, STDIN_FILENO) < 0 || dup2(fd, STDOUT_FILENO) < 0 ||
-	    dup2(fd, STDERR_FILENO) < 0) {
+
+	if (log_path)
+		outfd = open(log_path, O_WRONLY | O_CREAT |
+			     O_APPEND | O_CLOEXEC, 0644);
+	else
+		outfd = open("/dev/null", O_WRONLY | O_CLOEXEC);
+	if (outfd < 0) {
 		err = -errno;
-		close(fd);
-		return err;
+		goto infd;
 	}
-	if (fd > STDERR_FILENO)
-		close(fd);
-	return 0;
+	if (dup2(infd, STDIN_FILENO) < 0 || dup2(outfd, STDOUT_FILENO) < 0 ||
+	    dup2(outfd, STDERR_FILENO) < 0) {
+		err = -errno;
+		goto outfd;
+	}
+	err = 0;
+
+outfd:
+	if (outfd > STDERR_FILENO)
+		close(outfd);
+infd:
+	if (infd > STDERR_FILENO)
+		close(infd);
+	return err;
 }
 
 static void erofsmount_worker_exit(int err)
@@ -182,6 +198,11 @@ static void usage(int argc, char **argv)
 		" -u                    unmount the filesystem\n"
 		"    --disconnect       abort an existing NBD device forcibly\n"
 		"    --reattach         reattach to an existing NBD device\n"
+#ifdef EROFS_FANOTIFY_ENABLED
+		"    --worker-log=PATH  redirect nbd/fanotify worker logs to PATH\n"
+#else
+		"    --worker-log=PATH  redirect nbd worker logs to PATH\n"
+#endif
 #ifdef OCIEROFS_ENABLED
 		"\n"
 		"OCI-specific options (EXPERIMENTAL, with -o):\n"
@@ -364,6 +385,7 @@ static int erofsmount_parse_options(int argc, char **argv)
 		{"version", no_argument, 0, 'V'},
 		{"reattach", no_argument, 0, 512},
 		{"disconnect", no_argument, 0, 513},
+		{"worker-log", required_argument, 0, 514},
 		{0, 0, 0, 0},
 	};
 	char *dot;
@@ -431,6 +453,12 @@ static int erofsmount_parse_options(int argc, char **argv)
 		case 513:
 			mountcfg.mountmode = EROFSMOUNT_MODE_DISCONNECT;
 			break;
+		case 514:
+			free(mountcfg.worker_log_path);
+			mountcfg.worker_log_path = strdup(optarg);
+			if (!mountcfg.worker_log_path)
+				return -ENOMEM;
+			break;
 		default:
 			return -EINVAL;
 		}
@@ -789,7 +817,7 @@ static int erofsmount_startnbd(int nbdfd, struct erofsmount_source *source)
 	}
 	ctx.sk.fd = err;
 
-	err = erofsmount_worker_detach();
+	err = erofsmount_worker_detach(mountcfg.worker_log_path);
 	if (err) {
 		erofs_io_close(&ctx.vd);
 		erofs_io_close(&ctx.sk);
@@ -1176,7 +1204,7 @@ static int erofsmount_startnbd_nl(pid_t *pid, struct erofsmount_source *source)
 		if (err)
 			goto err_sk;
 
-		err = erofsmount_worker_detach();
+		err = erofsmount_worker_detach(mountcfg.worker_log_path);
 		if (err)
 			goto err_sk;
 
@@ -1301,7 +1329,7 @@ static int erofsmount_reattach(const char *target)
 	if (err == 0) {
 		free(line);
 		free(identifier);
-		err = erofsmount_worker_detach();
+		err = erofsmount_worker_detach(mountcfg.worker_log_path);
 		if (!err)
 			err = (int)(uintptr_t)erofsmount_nbd_loopfn(&ctx);
 		erofsmount_worker_exit(err);
@@ -1763,7 +1791,7 @@ static int erofsmount_fanotify_child(struct erofs_fanotify_ctx *ctx,
 	if (err)
 		goto notify;
 
-	err = erofsmount_worker_detach();
+	err = erofsmount_worker_detach(mountcfg.worker_log_path);
 	if (err)
 		goto notify;
 
-- 
2.47.3



More information about the Linux-erofs mailing list