[3.16.y-ckt stable] Patch "nfs: fix dio deadlock when O_DIRECT flag is flipped" has been added to staging queue
Luis Henriques
luis.henriques at canonical.com
Wed Feb 4 11:32:04 UTC 2015
This is a note to let you know that I have just added a patch titled
nfs: fix dio deadlock when O_DIRECT flag is flipped
to the linux-3.16.y-queue branch of the 3.16.y-ckt extended stable tree
which can be found at:
http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.16.y-queue
This patch is scheduled to be released in version 3.16.7-ckt6.
If you, or anyone else, feels it should not be added to this tree, please
reply to this email.
For more information about the 3.16.y-ckt tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable
Thanks.
-Luis
------
>From 9158e9e19e696176b8b3f15e6bc464c6e6f55a8b Mon Sep 17 00:00:00 2001
From: Peng Tao <tao.peng at primarydata.com>
Date: Tue, 20 Jan 2015 07:44:29 +0800
Subject: nfs: fix dio deadlock when O_DIRECT flag is flipped
commit ee8a1a8b160a87dc3a9c81a86796aa4db85ea815 upstream.
We only support swap file calling nfs_direct_IO. However, application
might be able to get to nfs_direct_IO if it toggles O_DIRECT flag
during IO and it can deadlock because we grab inode->i_mutex in
nfs_file_direct_write(). So return 0 for such case. Then the generic
layer will fall back to buffer IO.
Signed-off-by: Peng Tao <tao.peng at primarydata.com>
Signed-off-by: Trond Myklebust <trond.myklebust at primarydata.com>
Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
---
fs/nfs/direct.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
index 73a3023e2702..ac8e19995f56 100644
--- a/fs/nfs/direct.c
+++ b/fs/nfs/direct.c
@@ -214,6 +214,12 @@ static int nfs_direct_cmp_commit_data_verf(struct nfs_direct_req *dreq,
*/
ssize_t nfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos)
{
+ struct inode *inode = iocb->ki_filp->f_mapping->host;
+
+ /* we only support swap file calling nfs_direct_IO */
+ if (!IS_SWAPFILE(inode))
+ return 0;
+
#ifndef CONFIG_NFS_SWAP
dprintk("NFS: nfs_direct_IO (%pD) off/no(%Ld/%lu) EINVAL\n",
iocb->ki_filp, (long long) pos, iter->nr_segs);
--
2.1.4
More information about the kernel-team
mailing list