NFSv4.1: Fix a race in pNFS layoutcommit
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 20 Mar 2013 16:34:32 +0000 (12:34 -0400)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 10 Apr 2013 02:20:01 +0000 (03:20 +0100)
commit9ca2044f9041283bff117bb7e9ba7e9cd644bae0
tree2085575770b488eb62b1aa4d45c0170ecb851768
parent8626d723c5495ec9a276c8c13a22b374c421ba72
NFSv4.1: Fix a race in pNFS layoutcommit

commit a073dbff359f4741013ae4b8395f5364c5e00b48 upstream.

We need to clear the NFS_LSEG_LAYOUTCOMMIT bits atomically with the
NFS_INO_LAYOUTCOMMIT bit, otherwise we may end up with situations
where the two are out of sync.
The first half of the problem is to ensure that pnfs_layoutcommit_inode
clears the NFS_LSEG_LAYOUTCOMMIT bit through pnfs_list_write_lseg.
We still need to keep the reference to those segments until the RPC call
is finished, so in order to make it clear _where_ those references come
from, we add a helper pnfs_list_write_lseg_done() that cleans up after
pnfs_list_write_lseg.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Acked-by: Benny Halevy <bhalevy@tonian.com>
[bwh: Backported to 3.2: s/pnfs_put_lseg/put_lseg/]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
fs/nfs/nfs4proc.c
fs/nfs/pnfs.c