[CIFS] Reduce chance of list corruption in find_writable_file
commit9b22b0b726c6e46048767728a0900c8c05f93c21
authorSteve French <sfrench@us.ibm.com>
Tue, 2 Oct 2007 01:11:08 +0000 (2 01:11 +0000)
committerSteve French <sfrench@us.ibm.com>
Tue, 2 Oct 2007 01:11:08 +0000 (2 01:11 +0000)
tree12e78fec74b790850f2c0d61bccfb1bb10ea8a0b
parent4084973dbae9a24e58598d6cdf60f0e5e4a3cabf
[CIFS] Reduce chance of list corruption in find_writable_file

When find_writable_file is racing with close and the session
to the server goes down, Shaggy noticed that there was a
chance that an open file in the list of files off the inode
could have been freed by close since cifs_reconnect can
block (the spinlock thus not held). This means that
we have to start over at the beginning of the list in some
cases.

There is a 2nd change that needs to be made later
(pointed out by Jeremy Allison and Shaggy) in order to
prevent cifs_close ever freeing the cifs per file info
when a write is pending.  Although we delay close from
freeing this memory for sufficiently long for all known
cases, ultimately on a very, very slow write
overlapping a close pending we need to allow close to return
(without freeing the cifs file info) and defer freeing the
memory to be the responsibility of the (sloooow) write
thread (presumably have to look at every place wrtPending
is decremented - and add a flag for deferred free for
after wrtPending goes to zero).

Acked-by: Shaggy <shaggy@us.ibm.com>
Acked-by: Shirish Pargaonkar <shirishp@us.ibm.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/file.c