ceph: fix sync read eof check deadlock
authorSage Weil <sage@newdream.net>
Tue, 9 Feb 2010 22:04:02 +0000 (14:04 -0800)
committerSage Weil <sage@newdream.net>
Thu, 11 Feb 2010 19:48:53 +0000 (11:48 -0800)
commit6a026589ba333185c466c906376fe022a27a53f9
tree7c536163e2192928978b79d5a6bbd79dd5993777
parent68c283236a1e0772e1a469dd2ffc17afc300b07b
ceph: fix sync read eof check deadlock

If a sync read gets a short result from the OSD, it may need to do a
getattr to see if it is short due to reaching end-of-file.  The getattr
was being done while holding a reference to FILE_RD, which can lead to
a deadlock if the MDS is revoking that capability bit and can't process
the getattr until it does.

We fix this by setting a flag if EOF size validation is needed, and doing
the getattr in ceph_aio_read, after the RD cap ref is dropped.  If the
read needs to be continued, we loop and continue traversing the file.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/file.c