xfs
[Top] [All Lists]

Re: page discard on page error

To: Dave Chinner <david@xxxxxxxxxxxxx>
Subject: Re: page discard on page error
From: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Date: Wed, 18 Aug 2010 12:17:28 -0400
Cc: Mike Gao <ygao.linux@xxxxxxxxx>, xfs@xxxxxxxxxxx
In-reply-to: <20100818155043.GL7362@dastard>
References: <AANLkTimHBE_9pD1wWOkryOnqBgL2bJQTKoe52wYjfNw3@xxxxxxxxxxxxxx> <20100818155043.GL7362@dastard>
User-agent: Mutt/1.5.20 (2009-08-17)
On Thu, Aug 19, 2010 at 01:50:43AM +1000, Dave Chinner wrote:
> The current code does not handle EAGAIN at all, just discards the
> page. This looks incorrect - I think that EAGAIN should still cause
> the page to be redirtied, not discarded. I'm not sure if I missed
> something else, though - can you remember why you removed the EAGAIN
> case?

I don't think that was intentional, in fact I'm pretty sure I handled
it in an earlier version.  Mike, can you test the patch below?


Index: xfs/fs/xfs/linux-2.6/xfs_aops.c
===================================================================
--- xfs.orig/fs/xfs/linux-2.6/xfs_aops.c        2010-08-18 18:10:48.140261091 
+0200
+++ xfs/fs/xfs/linux-2.6/xfs_aops.c     2010-08-18 18:12:41.167005888 +0200
@@ -1068,7 +1068,7 @@ xfs_vm_writepage(
         * by themselves.
         */
        if ((current->flags & (PF_MEMALLOC|PF_KSWAPD)) == PF_MEMALLOC)
-               goto out_fail;
+               goto redirty;
 
        /*
         * We need a transaction if there are delalloc or unwritten buffers
@@ -1080,7 +1080,7 @@ xfs_vm_writepage(
         */
        xfs_count_page_state(page, &delalloc, &unwritten);
        if ((current->flags & PF_FSTRANS) && (delalloc || unwritten))
-               goto out_fail;
+               goto redirty;
 
        /* Is this page beyond the end of the file? */
        offset = i_size_read(inode);
@@ -1245,12 +1245,15 @@ error:
        if (iohead)
                xfs_cancel_ioend(iohead);
 
+       if (err == -EAGAIN)
+               goto redirty;
+
        xfs_aops_discard_page(page);
        ClearPageUptodate(page);
        unlock_page(page);
        return err;
 
-out_fail:
+redirty:
        redirty_page_for_writepage(wbc, page);
        unlock_page(page);
        return 0;

<Prev in Thread] Current Thread [Next in Thread>