Re: oops in nfs_flush_incompatible (and possible fix?)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 7 Dec 2010 20:03:44 -0500
Jeff Layton <jlayton@xxxxxxxxxx> wrote:

> On Tue, 07 Dec 2010 19:30:00 -0500
> Trond Myklebust <Trond.Myklebust@xxxxxxxxxx> wrote:
> 
> > On Tue, 2010-12-07 at 16:53 -0500, Jeff Layton wrote:
> > > On Tue, 07 Dec 2010 16:41:22 -0500
> > > Trond Myklebust <Trond.Myklebust@xxxxxxxxxx> wrote:
> > > > I've been racking my brain for days now trying to remember why we clear
> > > > the request in these cases. I think it was only about ensuring that we
> > > > could throw the page out of the cache using invalidate_inode_pages()
> > > > (and there is a comment about that in early 2.4.x kernels).
> > > > 
> > > > As far as I can see, there no longer appear to be any side effects to
> > > > deferring releasing the page or open_contexts but I'm still a bit
> > > > nervous about doing so.
> > > > Can we therefore please give it a good week of pounding upon before I
> > > > pass it on to Linus?
> > > > 
> > > > Cheers
> > > >   Trond
> > > > 
> > > 
> > > Sounds good. I have the reporter of this problem testing a 2.6.18-based
> > > kernel with this patch now to see whether it fixes it. We might as well
> > > hold off until we have results from that. Their test takes several days
> > > to run though so it may be a little while before we know whether this
> > > helps. I'll reply once I hear from them.
> > 
> > Looks like I was right to be sceptical. My setup hangs hard on the
> > Connectathon test5 (read and write) when this patch is applied.
> > 
> 
> Yep, I see this too. I don't however, see this on the RHEL5 kernel
> where I was testing this so I'm a little confused. Any idea why it
> would cause this behavior?

The patch below does not cause the hang for me though. Any idea why not
putting the page in that spot would cause a hang?

-------------------------[snip]---------------------------

diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index e4b62c6..aedcaa7 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -152,7 +152,6 @@ static void nfs_readpage_release(struct nfs_page *req)
 			(long long)NFS_FILEID(req->wb_context->path.dentry->d_inode),
 			req->wb_bytes,
 			(long long)req_offset(req));
-	nfs_clear_request(req);
 	nfs_release_request(req);
 }
 
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 4c14c17..04857c0 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -407,14 +407,16 @@ out:
  */
 static void nfs_inode_remove_request(struct nfs_page *req)
 {
+	struct page *page;
 	struct inode *inode = req->wb_context->path.dentry->d_inode;
 	struct nfs_inode *nfsi = NFS_I(inode);
 
 	BUG_ON (!NFS_WBACK_BUSY(req));
 
 	spin_lock(&inode->i_lock);
-	set_page_private(req->wb_page, 0);
-	ClearPagePrivate(req->wb_page);
+	page = xchg(&req->wb_page, NULL);
+	set_page_private(page, 0);
+	ClearPagePrivate(page);
 	radix_tree_delete(&nfsi->nfs_page_tree, req->wb_index);
 	nfsi->npages--;
 	if (!nfsi->npages) {
@@ -422,7 +424,8 @@ static void nfs_inode_remove_request(struct nfs_page *req)
 		iput(inode);
 	} else
 		spin_unlock(&inode->i_lock);
-	nfs_clear_request(req);
+	if (page != NULL)
+		page_cache_release(page);
 	nfs_release_request(req);
 }
 
-- 
1.7.3.2

-- 
Jeff Layton <jlayton@xxxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux