On Mon, Jan 12, 2015 at 10:00:08PM +0100, Cedric Ware wrote:
>
> I eventually traced it to the systemd-fsck-root service hanging if
> /etc/e2fsck.conf specifies logging to a yet-unmounted directory.  I think
> it is an fd leak similar to bug #682592:
>
> * systemd-fsck forks fsck with argument "-C<n>", with fd <n> being one end
>   of a pipe which systemd uses to read progress information.
>
> * systemd-fsck attempts to read from pipe until EOF (systemd source file
>   src/fsck/fsck.c, function process_progress).
>
> * fsck forks e2fsck (actually fsck.ext4), which needs fd <n>.
>
> * e2fsck forks/detaches a child to wait until directory mounted/writable,
>   without closing fd <n>.
>
> * e2fsck and fsck terminate, e2fsck child waits for boot to complete,
>   systemd-fsck waits for pipe to be closed, deadlock.
>

Arguably this is as mucha bug in systemd-fsck since it could have been
waiting for fsck to terminate instead of waiting for an EOF from the
progress_fd pipe, but I agree that it would be better if e2fsck were
to close the progress_fd.

This isn't an RC bug by any means (I don't think it even rates
"important") since very few people are using the e2fsck.conf logging
capabilities --- most debian users pre-systemd have been been using
/var/log/fsck/*, and systemd will do its own journalctl thing.

So I'll fix this, with a patch like this (see attached), but it's not
something that's worth fixing in Jessie.

                                              - Ted

commit a4f95ccad41f5befb6768ff58fe26b179237df6a
Author: Theodore Ts'o <ty...@mit.edu>
Date:   Mon Jan 12 19:42:29 2015 -0500

    e2fsck: close the progress_fd in the logfile child process
    
    If e2fsck.conf's logging feature is enabled, and e2fsck is being run
    via systemd-fsck, there will be a deadlock since systemd-fsck is
    waiting for progress_fd pipe to be closed, instead of waiting for the
    fsck process to exit --- and so the logfile child process won't exit
    until it can write out the logfile, and systemd won't continue the
    boot process so that the file system can be remounted read-write.
    Oops.
    
    Addresses-Debian-Bug: #775234
    
    Signed-off-by: Theodore Ts'o <ty...@mit.edu>

diff --git a/e2fsck/logfile.c b/e2fsck/logfile.c
index c48b8eb..e004f31 100644
--- a/e2fsck/logfile.c
+++ b/e2fsck/logfile.c
@@ -20,6 +20,8 @@
 #include "e2fsck.h"
 #include <pwd.h>
 
+extern e2fsck_t e2fsck_global_ctx;   /* Try your very best not to use this! */
+
 struct string {
        char    *s;
        int     len;
@@ -233,6 +235,8 @@ static FILE *save_output(const char *s0, const char *s1, 
const char *s2)
        }
 
        if (pid == 0) {
+               if (e2fsck_global_ctx && e2fsck_global_ctx->progress_fd)
+                       close(e2fsck_global_ctx->progress_fd);
                if (daemon(0, 0) < 0) {
                        perror("daemon");
                        exit(1);


-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to