knfsd: let nfsd manage timing out its own leases
authorJ. Bruce Fields <bfields@citi.umich.edu>
Wed, 12 Sep 2007 22:56:12 +0000 (18:56 -0400)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Tue, 9 Oct 2007 22:31:57 +0000 (18:31 -0400)
commit0272e1fd9f4fa8a43357c168e081744f99e67195
treec56c6469fd2d220e317cf7ab7215e538dca5bad3
parent354ecbb9dd89c21708b319da8c4ffd3dd6e6811d
knfsd: let nfsd manage timing out its own leases

Currently there's a race that can cause an oops in generic_setlease.

(In detail: nfsd, when it removes a lease, does so by calling
vfs_setlease() with F_UNLCK and a pointer to the fl_flock field, which
in turn points to nfsd's existing lease; but the first thing the
setlease code does is call time_out_leases().  If the lease happens to
already be beyond the lease break time, that will free the lease and (in
nfsd's release_private callback) set fl_flock to NULL, leading to a NULL
deference soon after in vfs_setlease().)

There are probably other things to fix here too, but it seems inherently
racy to allow either locks.c or nfsd to time out this lease.  Instead
just set the fl_break_time to 0 (preventing locks.c from ever timing out
this lock) and leave it up to nfsd's laundromat thread to deal with it.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
fs/nfsd/nfs4state.c