From: Aaron Tomlin <atomlin@redhat.com>
To: linux-fsdevel@vger.kernel.org
Cc: viro@zeniv.linux.org.uk, david@fromorbit.com, atomlin@redhat.com,
oleg@redhat.com, bmr@redhat.com, jcastillo@redhat.com,
mguzik@redhat.com, linux-kernel@vger.kernel.org
Subject: [RFC PATCH] fs: Use a seperate wq for do_sync_work() to avoid a potential deadlock
Date: Wed, 17 Sep 2014 12:39:02 +0100 [thread overview]
Message-ID: <1410953942-32144-1-git-send-email-atomlin@redhat.com> (raw)
Since do_sync_work() is a deferred function it can block indefinitely by
design. At present do_sync_work() is added to the global system_wq.
As such a deadlock is theoretically possible between sys_unmount() and
sync_filesystems():
* The current work fn on the system_wq (do_sync_work()) is blocked
waiting to aquire a sb's s_umount for reading.
* The "umount" task is the current owner of the s_umount in
question but is waiting for do_sync_work() to continue.
Thus we hit a deadlock situation.
This patch introduces a separate workqueue for do_sync_work() to avoid a
the described deadlock.
Signed-off-by: Aaron Tomlin <atomlin@redhat.com>
Reviewed-by: Alexander Viro <viro@zeniv.linux.org.uk>
---
fs/sync.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/fs/sync.c b/fs/sync.c
index bdc729d..df455d0 100644
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -15,6 +15,7 @@
#include <linux/pagemap.h>
#include <linux/quotaops.h>
#include <linux/backing-dev.h>
+#include <linux/kthread.h>
#include "internal.h"
#define VALID_FLAGS (SYNC_FILE_RANGE_WAIT_BEFORE|SYNC_FILE_RANGE_WRITE| \
@@ -114,7 +115,7 @@ SYSCALL_DEFINE0(sync)
return 0;
}
-static void do_sync_work(struct work_struct *work)
+static int do_sync_work(void *dummy)
{
int nowait = 0;
@@ -129,18 +130,12 @@ static void do_sync_work(struct work_struct *work)
iterate_supers(sync_fs_one_sb, &nowait);
iterate_bdevs(fdatawrite_one_bdev, NULL);
printk("Emergency Sync complete\n");
- kfree(work);
+ return 0;
}
void emergency_sync(void)
{
- struct work_struct *work;
-
- work = kmalloc(sizeof(*work), GFP_ATOMIC);
- if (work) {
- INIT_WORK(work, do_sync_work);
- schedule_work(work);
- }
+ kthread_run(do_sync_work, NULL, "sync_work_thread");
}
/*
--
1.9.3
next reply other threads:[~2014-09-17 11:41 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-17 11:39 Aaron Tomlin [this message]
2014-09-17 18:22 ` [RFC PATCH] fs: Use a seperate wq for do_sync_work() to avoid a potential deadlock Oleg Nesterov
2014-09-17 20:46 ` Aaron Tomlin
2014-09-17 21:16 ` Dave Chinner
2014-09-19 15:44 ` Aaron Tomlin
2014-09-17 21:42 ` Oleg Nesterov
2014-09-19 9:35 ` Aaron Tomlin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1410953942-32144-1-git-send-email-atomlin@redhat.com \
--to=atomlin@redhat.com \
--cc=bmr@redhat.com \
--cc=david@fromorbit.com \
--cc=jcastillo@redhat.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mguzik@redhat.com \
--cc=oleg@redhat.com \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.