<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux.git/fs/nfs/write.c, branch v3.11</title>
<subtitle>Linux kernel source tree</subtitle>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/'/>
<entry>
<title>NFS: Allow nfs_updatepage to extend a write under additional circumstances</title>
<updated>2013-07-09T23:32:50+00:00</updated>
<author>
<name>Scott Mayhew</name>
<email>smayhew@redhat.com</email>
</author>
<published>2013-07-05T21:33:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=c7559663e42f4294ffe31fe159da6b6a66b35d61'/>
<id>c7559663e42f4294ffe31fe159da6b6a66b35d61</id>
<content type='text'>
Currently nfs_updatepage allows a write to be extended to cover a full
page only if we don't have a byte range lock lock on the file... but if
we have a write delegation on the file or if we have the whole file
locked for writing then we should be allowed to extend the write as
well.

Signed-off-by: Scott Mayhew &lt;smayhew@redhat.com&gt;
[Trond: fix up call to nfs_have_delegation()]
Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Currently nfs_updatepage allows a write to be extended to cover a full
page only if we don't have a byte range lock lock on the file... but if
we have a write delegation on the file or if we have the whole file
locked for writing then we should be allowed to extend the write as
well.

Signed-off-by: Scott Mayhew &lt;smayhew@redhat.com&gt;
[Trond: fix up call to nfs_have_delegation()]
Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>NFS: Don't accept more reads/writes if the open context recovery failed</title>
<updated>2013-03-25T16:04:10+00:00</updated>
<author>
<name>Trond Myklebust</name>
<email>Trond.Myklebust@netapp.com</email>
</author>
<published>2013-03-18T23:45:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=c58c844187df61ef7cc103d0abb5dd6198bcfcd6'/>
<id>c58c844187df61ef7cc103d0abb5dd6198bcfcd6</id>
<content type='text'>
If the state recovery failed, we want to ensure that the application
doesn't try to use the same file descriptor for more reads or writes.

Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
If the state recovery failed, we want to ensure that the application
doesn't try to use the same file descriptor for more reads or writes.

Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>NFS: Ensure that we free the rpc_task after read and write cleanups are done</title>
<updated>2013-01-04T17:59:10+00:00</updated>
<author>
<name>Trond Myklebust</name>
<email>Trond.Myklebust@netapp.com</email>
</author>
<published>2013-01-04T17:47:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=6db6dd7d3fd8f7c765dabc376493d6791ab28bd6'/>
<id>6db6dd7d3fd8f7c765dabc376493d6791ab28bd6</id>
<content type='text'>
This patch ensures that we free the rpc_task after the cleanup callbacks
are done in order to avoid a deadlock problem that can be triggered if
the callback needs to wait for another workqueue item to complete.

Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
Cc: Weston Andros Adamson &lt;dros@netapp.com&gt;
Cc: Tejun Heo &lt;tj@kernel.org&gt;
Cc: Bruce Fields &lt;bfields@fieldses.org&gt;
Cc: stable@vger.kernel.org [&gt;= 3.5]
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This patch ensures that we free the rpc_task after the cleanup callbacks
are done in order to avoid a deadlock problem that can be triggered if
the callback needs to wait for another workqueue item to complete.

Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
Cc: Weston Andros Adamson &lt;dros@netapp.com&gt;
Cc: Tejun Heo &lt;tj@kernel.org&gt;
Cc: Bruce Fields &lt;bfields@fieldses.org&gt;
Cc: stable@vger.kernel.org [&gt;= 3.5]
</pre>
</div>
</content>
</entry>
<entry>
<title>NFS: nfs_migrate_page() does not wait for FS-Cache to finish with a page</title>
<updated>2012-12-20T22:12:03+00:00</updated>
<author>
<name>David Howells</name>
<email>dhowells@redhat.com</email>
</author>
<published>2012-12-05T13:34:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=8c209ce721444a61b61d9e772746c721e4d8d1e8'/>
<id>8c209ce721444a61b61d9e772746c721e4d8d1e8</id>
<content type='text'>
nfs_migrate_page() does not wait for FS-Cache to finish with a page, probably
leading to the following bad-page-state:

 BUG: Bad page state in process python-bin  pfn:17d39b
 page:ffffea00053649e8 flags:004000000000100c count:0 mapcount:0 mapping:(null)
index:38686 (Tainted: G    B      ---------------- )
 Pid: 31053, comm: python-bin Tainted: G    B      ----------------
2.6.32-71.24.1.el6.x86_64 #1
 Call Trace:
 [&lt;ffffffff8111bfe7&gt;] bad_page+0x107/0x160
 [&lt;ffffffff8111ee69&gt;] free_hot_cold_page+0x1c9/0x220
 [&lt;ffffffff8111ef19&gt;] __pagevec_free+0x59/0xb0
 [&lt;ffffffff8104b988&gt;] ? flush_tlb_others_ipi+0x128/0x130
 [&lt;ffffffff8112230c&gt;] release_pages+0x21c/0x250
 [&lt;ffffffff8115b92a&gt;] ? remove_migration_pte+0x28a/0x2b0
 [&lt;ffffffff8115f3f8&gt;] ? mem_cgroup_get_reclaim_stat_from_page+0x18/0x70
 [&lt;ffffffff81122687&gt;] ____pagevec_lru_add+0x167/0x180
 [&lt;ffffffff811226f8&gt;] __lru_cache_add+0x58/0x70
 [&lt;ffffffff81122731&gt;] lru_cache_add_lru+0x21/0x40
 [&lt;ffffffff81123f49&gt;] putback_lru_page+0x69/0x100
 [&lt;ffffffff8115c0bd&gt;] migrate_pages+0x13d/0x5d0
 [&lt;ffffffff81122687&gt;] ? ____pagevec_lru_add+0x167/0x180
 [&lt;ffffffff81152ab0&gt;] ? compaction_alloc+0x0/0x370
 [&lt;ffffffff8115255c&gt;] compact_zone+0x4cc/0x600
 [&lt;ffffffff8111cfac&gt;] ? get_page_from_freelist+0x15c/0x820
 [&lt;ffffffff810672f4&gt;] ? check_preempt_wakeup+0x1c4/0x3c0
 [&lt;ffffffff8115290e&gt;] compact_zone_order+0x7e/0xb0
 [&lt;ffffffff81152a49&gt;] try_to_compact_pages+0x109/0x170
 [&lt;ffffffff8111e94d&gt;] __alloc_pages_nodemask+0x5ed/0x850
 [&lt;ffffffff814c9136&gt;] ? thread_return+0x4e/0x778
 [&lt;ffffffff81150d43&gt;] alloc_pages_vma+0x93/0x150
 [&lt;ffffffff81167ea5&gt;] do_huge_pmd_anonymous_page+0x135/0x340
 [&lt;ffffffff814cb6f6&gt;] ? rwsem_down_read_failed+0x26/0x30
 [&lt;ffffffff81136755&gt;] handle_mm_fault+0x245/0x2b0
 [&lt;ffffffff814ce383&gt;] do_page_fault+0x123/0x3a0
 [&lt;ffffffff814cbdf5&gt;] page_fault+0x25/0x30

nfs_migrate_page() calls nfs_fscache_release_page() which doesn't actually wait
- even if __GFP_WAIT is set.  The reason that doesn't wait is that
fscache_maybe_release_page() might deadlock the allocator as the work threads
writing to the cache may all end up sleeping on memory allocation.

However, I wonder if that is actually a problem.  There are a number of things
I can do to deal with this:

 (1) Make nfs_migrate_page() wait.

 (2) Make fscache_maybe_release_page() honour the __GFP_WAIT flag.

 (3) Set a timeout around the wait.

 (4) Make nfs_migrate_page() return an error if the page is still busy.

For the moment, I'll select (2) and (4).

Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
Acked-by: Jeff Layton &lt;jlayton@redhat.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
nfs_migrate_page() does not wait for FS-Cache to finish with a page, probably
leading to the following bad-page-state:

 BUG: Bad page state in process python-bin  pfn:17d39b
 page:ffffea00053649e8 flags:004000000000100c count:0 mapcount:0 mapping:(null)
index:38686 (Tainted: G    B      ---------------- )
 Pid: 31053, comm: python-bin Tainted: G    B      ----------------
2.6.32-71.24.1.el6.x86_64 #1
 Call Trace:
 [&lt;ffffffff8111bfe7&gt;] bad_page+0x107/0x160
 [&lt;ffffffff8111ee69&gt;] free_hot_cold_page+0x1c9/0x220
 [&lt;ffffffff8111ef19&gt;] __pagevec_free+0x59/0xb0
 [&lt;ffffffff8104b988&gt;] ? flush_tlb_others_ipi+0x128/0x130
 [&lt;ffffffff8112230c&gt;] release_pages+0x21c/0x250
 [&lt;ffffffff8115b92a&gt;] ? remove_migration_pte+0x28a/0x2b0
 [&lt;ffffffff8115f3f8&gt;] ? mem_cgroup_get_reclaim_stat_from_page+0x18/0x70
 [&lt;ffffffff81122687&gt;] ____pagevec_lru_add+0x167/0x180
 [&lt;ffffffff811226f8&gt;] __lru_cache_add+0x58/0x70
 [&lt;ffffffff81122731&gt;] lru_cache_add_lru+0x21/0x40
 [&lt;ffffffff81123f49&gt;] putback_lru_page+0x69/0x100
 [&lt;ffffffff8115c0bd&gt;] migrate_pages+0x13d/0x5d0
 [&lt;ffffffff81122687&gt;] ? ____pagevec_lru_add+0x167/0x180
 [&lt;ffffffff81152ab0&gt;] ? compaction_alloc+0x0/0x370
 [&lt;ffffffff8115255c&gt;] compact_zone+0x4cc/0x600
 [&lt;ffffffff8111cfac&gt;] ? get_page_from_freelist+0x15c/0x820
 [&lt;ffffffff810672f4&gt;] ? check_preempt_wakeup+0x1c4/0x3c0
 [&lt;ffffffff8115290e&gt;] compact_zone_order+0x7e/0xb0
 [&lt;ffffffff81152a49&gt;] try_to_compact_pages+0x109/0x170
 [&lt;ffffffff8111e94d&gt;] __alloc_pages_nodemask+0x5ed/0x850
 [&lt;ffffffff814c9136&gt;] ? thread_return+0x4e/0x778
 [&lt;ffffffff81150d43&gt;] alloc_pages_vma+0x93/0x150
 [&lt;ffffffff81167ea5&gt;] do_huge_pmd_anonymous_page+0x135/0x340
 [&lt;ffffffff814cb6f6&gt;] ? rwsem_down_read_failed+0x26/0x30
 [&lt;ffffffff81136755&gt;] handle_mm_fault+0x245/0x2b0
 [&lt;ffffffff814ce383&gt;] do_page_fault+0x123/0x3a0
 [&lt;ffffffff814cbdf5&gt;] page_fault+0x25/0x30

nfs_migrate_page() calls nfs_fscache_release_page() which doesn't actually wait
- even if __GFP_WAIT is set.  The reason that doesn't wait is that
fscache_maybe_release_page() might deadlock the allocator as the work threads
writing to the cache may all end up sleeping on memory allocation.

However, I wonder if that is actually a problem.  There are a number of things
I can do to deal with this:

 (1) Make nfs_migrate_page() wait.

 (2) Make fscache_maybe_release_page() honour the __GFP_WAIT flag.

 (3) Set a timeout around the wait.

 (4) Make nfs_migrate_page() return an error if the page is still busy.

For the moment, I'll select (2) and (4).

Signed-off-by: David Howells &lt;dhowells@redhat.com&gt;
Acked-by: Jeff Layton &lt;jlayton@redhat.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>NFS: Don't use SetPageError in the NFS writeback code</title>
<updated>2012-12-15T22:12:14+00:00</updated>
<author>
<name>Trond Myklebust</name>
<email>Trond.Myklebust@netapp.com</email>
</author>
<published>2012-12-15T22:12:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=ada8e20d044c0fa5610e504ce6fb4578ebd3edd9'/>
<id>ada8e20d044c0fa5610e504ce6fb4578ebd3edd9</id>
<content type='text'>
The writeback code is already capable of passing errors back to user space
by means of the open_context-&gt;error. In the case of ENOSPC, Neil Brown
is reporting seeing 2 errors being returned.

Neil writes:

"e.g. if /mnt2/ if an nfs mounted filesystem that has no space then

strace dd if=/dev/zero conv=fsync &gt;&gt; /mnt2/afile count=1

reported Input/output error and the relevant parts of the strace output are:

write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
fsync(1)                                = -1 EIO (Input/output error)
close(1)                                = -1 ENOSPC (No space left on device)"

Neil then shows that the duplication of error messages appears to be due to
the use of the PageError() mechanism, which causes filemap_fdatawait_range
to return the extra EIO. The regression was introduced by
commit 7b281ee026552f10862b617a2a51acf49c829554 (NFS: fsync() must exit
with an error if page writeback failed).

Fix this by removing the call to SetPageError(), and just relying on
open_context-&gt;error reporting the ENOSPC back to fsync().

Reported-by: Neil Brown &lt;neilb@suse.de&gt;
Tested-by: Neil Brown &lt;neilb@suse.de&gt;
Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
Cc: stable@vger.kernel.org [3.6+]
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The writeback code is already capable of passing errors back to user space
by means of the open_context-&gt;error. In the case of ENOSPC, Neil Brown
is reporting seeing 2 errors being returned.

Neil writes:

"e.g. if /mnt2/ if an nfs mounted filesystem that has no space then

strace dd if=/dev/zero conv=fsync &gt;&gt; /mnt2/afile count=1

reported Input/output error and the relevant parts of the strace output are:

write(1, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 512) = 512
fsync(1)                                = -1 EIO (Input/output error)
close(1)                                = -1 ENOSPC (No space left on device)"

Neil then shows that the duplication of error messages appears to be due to
the use of the PageError() mechanism, which causes filemap_fdatawait_range
to return the extra EIO. The regression was introduced by
commit 7b281ee026552f10862b617a2a51acf49c829554 (NFS: fsync() must exit
with an error if page writeback failed).

Fix this by removing the call to SetPageError(), and just relying on
open_context-&gt;error reporting the ENOSPC back to fsync().

Reported-by: Neil Brown &lt;neilb@suse.de&gt;
Tested-by: Neil Brown &lt;neilb@suse.de&gt;
Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
Cc: stable@vger.kernel.org [3.6+]
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge branch 'bugfixes' into nfs-for-next</title>
<updated>2012-12-11T14:16:26+00:00</updated>
<author>
<name>Trond Myklebust</name>
<email>Trond.Myklebust@netapp.com</email>
</author>
<published>2012-12-11T14:16:26+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=7ce0171d4f78992184faed87ea897d730b972965'/>
<id>7ce0171d4f78992184faed87ea897d730b972965</id>
<content type='text'>
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
</pre>
</div>
</content>
</entry>
<entry>
<title>nfs: don't extend writes to cover entire page if pagecache is invalid</title>
<updated>2012-12-11T14:14:51+00:00</updated>
<author>
<name>Jeff Layton</name>
<email>jlayton@redhat.com</email>
</author>
<published>2012-12-10T14:25:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=81d9bce5309288086b58b4d97a644e495fef75f2'/>
<id>81d9bce5309288086b58b4d97a644e495fef75f2</id>
<content type='text'>
Jian reported that the following sequence would leave "testfile" with
corrupt data:

    # mount localhost:/export /mnt/nfs/ -o vers=3
    # echo abc &gt; /mnt/nfs/testfile; echo def &gt;&gt; /export/testfile; echo ghi &gt;&gt; /mnt/nfs/testfile
    # cat -v /export/testfile
    abc
    ^@^@^@^@ghi

While there's no locking involved here, the operations are serialized,
so CTO should prevent corruption.

The first write to the file is fine and writes 4 bytes. The file is then
extended on the server. When it's reopened a GETATTR is issued and the
size change is noticed. This causes NFS_INO_INVALID_DATA to be set on
the file. Because the file is opened for write only,
nfs_want_read_modify_write() returns 0 to nfs_write_begin().
nfs_updatepage then calls nfs_write_pageuptodate() to see if it should
extend the nfs_page to cover the whole page. NFS_INO_INVALID_DATA is
still set on the file at that point, but that flag is ignored and
nfs_pageuptodate erroneously extends the write to cover the whole page,
with the write done on the server side filled in with zeroes.

This patch just has that function check for NFS_INO_INVALID_DATA in
addition to NFS_INO_REVAL_PAGECACHE. This fixes the bug, but looking
over the code, I wonder if we might have a similar bug in
nfs_revalidate_size(). The difference between those two flags is very
subtle, so it seems like we ought to be checking for
NFS_INO_INVALID_DATA in most of the places that we look for
NFS_INO_REVAL_PAGECACHE.

I believe this is regression introduced by commit 8d197a568. The code
did check for NFS_INO_INVALID_DATA prior to that patch.

Original bug report is here:

    https://bugzilla.redhat.com/show_bug.cgi?id=885743

Cc: &lt;stable@vger.kernel.org&gt; # 3.5+
Reported-by: Jian Li &lt;jiali@redhat.com&gt;
Signed-off-by: Jeff Layton &lt;jlayton@redhat.com&gt;
Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Jian reported that the following sequence would leave "testfile" with
corrupt data:

    # mount localhost:/export /mnt/nfs/ -o vers=3
    # echo abc &gt; /mnt/nfs/testfile; echo def &gt;&gt; /export/testfile; echo ghi &gt;&gt; /mnt/nfs/testfile
    # cat -v /export/testfile
    abc
    ^@^@^@^@ghi

While there's no locking involved here, the operations are serialized,
so CTO should prevent corruption.

The first write to the file is fine and writes 4 bytes. The file is then
extended on the server. When it's reopened a GETATTR is issued and the
size change is noticed. This causes NFS_INO_INVALID_DATA to be set on
the file. Because the file is opened for write only,
nfs_want_read_modify_write() returns 0 to nfs_write_begin().
nfs_updatepage then calls nfs_write_pageuptodate() to see if it should
extend the nfs_page to cover the whole page. NFS_INO_INVALID_DATA is
still set on the file at that point, but that flag is ignored and
nfs_pageuptodate erroneously extends the write to cover the whole page,
with the write done on the server side filled in with zeroes.

This patch just has that function check for NFS_INO_INVALID_DATA in
addition to NFS_INO_REVAL_PAGECACHE. This fixes the bug, but looking
over the code, I wonder if we might have a similar bug in
nfs_revalidate_size(). The difference between those two flags is very
subtle, so it seems like we ought to be checking for
NFS_INO_INVALID_DATA in most of the places that we look for
NFS_INO_REVAL_PAGECACHE.

I believe this is regression introduced by commit 8d197a568. The code
did check for NFS_INO_INVALID_DATA prior to that patch.

Original bug report is here:

    https://bugzilla.redhat.com/show_bug.cgi?id=885743

Cc: &lt;stable@vger.kernel.org&gt; # 3.5+
Reported-by: Jian Li &lt;jiali@redhat.com&gt;
Signed-off-by: Jeff Layton &lt;jlayton@redhat.com&gt;
Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>nfs: Fix wrong slab cache in nfs_commit_mempool</title>
<updated>2012-11-25T16:59:33+00:00</updated>
<author>
<name>Yanchuan Nian</name>
<email>ycnian@gmail.com</email>
</author>
<published>2012-11-12T01:27:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=4c1002100898d03c5c9142ffaf58351c841ab94a'/>
<id>4c1002100898d03c5c9142ffaf58351c841ab94a</id>
<content type='text'>
The slab cache in nfs_commit_mempool is wrong, and I think it is just a slip.
I tested it on a x86-32 machine, the size of nfs_write_header is 544, and
the size of nfs_commit_data is 408, so it works fine. It is also true that
sizeof(struct nfs_write_header) &gt; sizeof(struct nfs_commit_data) on other
platforms in my opinoin. Just fix it.

Signed-off-by: Yanchuan Nian &lt;ycnian@gmail.com&gt;
Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The slab cache in nfs_commit_mempool is wrong, and I think it is just a slip.
I tested it on a x86-32 machine, the size of nfs_write_header is 544, and
the size of nfs_commit_data is 408, so it works fine. It is also true that
sizeof(struct nfs_write_header) &gt; sizeof(struct nfs_commit_data) on other
platforms in my opinoin. Just fix it.

Signed-off-by: Yanchuan Nian &lt;ycnian@gmail.com&gt;
Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>NFS: Remove BUG_ON() calls from the generic writeback code</title>
<updated>2012-11-04T19:43:39+00:00</updated>
<author>
<name>Trond Myklebust</name>
<email>Trond.Myklebust@netapp.com</email>
</author>
<published>2012-10-15T19:02:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=deed85e760c8c88cd984c5921dd8cb6b697b6134'/>
<id>deed85e760c8c88cd984c5921dd8cb6b697b6134</id>
<content type='text'>
...and ensure that we set the return value for nfs_page_async_flush()
to zero! (Reported-by: Dros Adamson)

Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
...and ensure that we set the return value for nfs_page_async_flush()
to zero! (Reported-by: Dros Adamson)

Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>NFS: Fix fdatasync/fsync() when confronted with a server reboot</title>
<updated>2012-09-28T20:03:05+00:00</updated>
<author>
<name>Trond Myklebust</name>
<email>Trond.Myklebust@netapp.com</email>
</author>
<published>2012-09-11T20:01:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux.git/commit/?id=05990d1bf2708b9e84d67074551f964d3738eedc'/>
<id>05990d1bf2708b9e84d67074551f964d3738eedc</id>
<content type='text'>
If the server reboots before it can commit the unstable writes to disk,
then nfs_commit_release_pages() will detect this when it compares the
verifier returned by COMMIT to the one returned by WRITE. When this
happens, the client needs to resend those writes in order to guarantee
that they make it to stable storage.

This patch adds a signalling mechanism to notify fsync() that it
needs to retry all writes before it can exit.

Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
If the server reboots before it can commit the unstable writes to disk,
then nfs_commit_release_pages() will detect this when it compares the
verifier returned by COMMIT to the one returned by WRITE. When this
happens, the client needs to resend those writes in order to guarantee
that they make it to stable storage.

This patch adds a signalling mechanism to notify fsync() that it
needs to retry all writes before it can exit.

Signed-off-by: Trond Myklebust &lt;Trond.Myklebust@netapp.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
