From: Andrea Arcangeli <andrea@suse.de>
To: Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: linux-kernel@vger.kernel.org
Subject: Re: nfs MAP_SHARED corruption fix
Date: Wed, 9 May 2001 04:48:26 +0200 [thread overview]
Message-ID: <20010509044826.B2506@athlon.random> (raw)
In-Reply-To: <20010508160050.F543@athlon.random> <shs3dafvpcx.fsf@charged.uio.no>
In-Reply-To: <shs3dafvpcx.fsf@charged.uio.no>; from trond.myklebust@fys.uio.no on Tue, May 08, 2001 at 05:21:02PM +0200
On Tue, May 08, 2001 at 05:21:02PM +0200, Trond Myklebust wrote:
> AFAICs this fix will clearly deadlock...
yeah, it didn't triggered because it probably needs to be the same page
writepaged and in the dirty list at the same time. I hooked it very deep
into the writeback logic to keep it generic (it wasn't going to add a
significant overhead) but it didn't need to be _that_ deep.
Even worse I think it was partly wrong because it was only in the
close(2) path but not in the fput path that is the one walked by munmap.
This looks better to me, what do you think?
diff -urN ref/fs/nfs/file.c nfs-corruption/fs/nfs/file.c
--- ref/fs/nfs/file.c Thu Feb 22 03:45:10 2001
+++ nfs-corruption/fs/nfs/file.c Tue May 8 19:11:57 2001
@@ -39,6 +39,7 @@
static ssize_t nfs_file_write(struct file *, const char *, size_t, loff_t *);
static int nfs_file_flush(struct file *);
static int nfs_fsync(struct file *, struct dentry *dentry, int datasync);
+static void nfs_file_close_vma(struct vm_area_struct *);
struct file_operations nfs_file_operations = {
read: nfs_file_read,
@@ -57,6 +58,11 @@
setattr: nfs_notify_change,
};
+static struct vm_operations_struct nfs_file_vm_ops = {
+ nopage: filemap_nopage,
+ close: nfs_file_close_vma,
+};
+
/* Hack for future NFS swap support */
#ifndef IS_SWAPFILE
# define IS_SWAPFILE(inode) (0)
@@ -104,6 +110,20 @@
return result;
}
+static void nfs_file_close_vma(struct vm_area_struct * vma)
+{
+ struct inode * inode;
+
+ inode = vma->vm_file->f_dentry->d_inode;
+
+ if (inode->i_state & I_DIRTY_PAGES) {
+ filemap_fdatasync(inode->i_mapping);
+ lock_kernel();
+ nfs_wb_file(inode, vma->vm_file);
+ unlock_kernel();
+ }
+}
+
static int
nfs_file_mmap(struct file * file, struct vm_area_struct * vma)
{
@@ -115,8 +135,11 @@
dentry->d_parent->d_name.name, dentry->d_name.name);
status = nfs_revalidate_inode(NFS_SERVER(inode), inode);
- if (!status)
+ if (!status) {
status = generic_file_mmap(file, vma);
+ if (!status)
+ vma->vm_ops = &nfs_file_vm_ops;
+ }
return status;
}
Andrea
next prev parent reply other threads:[~2001-05-09 2:49 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-05-08 14:00 nfs MAP_SHARED corruption fix Andrea Arcangeli
2001-05-08 15:21 ` Trond Myklebust
2001-05-08 15:38 ` Kurt Garloff
2001-05-09 7:30 ` Trond Myklebust
2001-05-09 13:25 ` Andrea Arcangeli
2001-05-09 22:02 ` Marcelo Tosatti
2001-05-10 0:08 ` Andrea Arcangeli
2001-05-09 22:38 ` Marcelo Tosatti
2001-05-10 1:16 ` Andrea Arcangeli
2001-05-10 0:00 ` Marcelo Tosatti
2001-05-10 10:11 ` Trond Myklebust
2001-05-10 10:14 ` Trond Myklebust
2001-05-09 2:48 ` Andrea Arcangeli [this message]
2001-05-09 7:00 ` Trond Myklebust
-- strict thread matches above, loose matches on Subject: below --
2001-05-09 10:55 Kurt Garloff
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=20010509044826.B2506@athlon.random \
--to=andrea@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=trond.myklebust@fys.uio.no \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox