aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/file.c
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-03-01 09:57:54 -0800
committerSage Weil <sage@newdream.net>2010-03-01 15:28:00 -0800
commit195d3ce2cc9a8ec69827f6369c41b269345b9988 (patch)
tree9ef91489d379ac612895b6ab3118535969aba152 /fs/ceph/file.c
parent6f863e712d4114e8ae2f02de64ebeac0546ebaa0 (diff)
downloadkernel_goldelico_gta04-195d3ce2cc9a8ec69827f6369c41b269345b9988.zip
kernel_goldelico_gta04-195d3ce2cc9a8ec69827f6369c41b269345b9988.tar.gz
kernel_goldelico_gta04-195d3ce2cc9a8ec69827f6369c41b269345b9988.tar.bz2
ceph: return EBADF if waiting for caps on closed file
Verify the file is actually open for the given caps when we are waiting for caps. This ensures we will wake up and return EBADF if another thread closes the file out from under us. Note that EBADF is also the correct return code from write(2) when called on a file handle opened for reading (although the vfs should catch that). Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph/file.c')
-rw-r--r--fs/ceph/file.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 88932c9..5d2af84 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -262,6 +262,9 @@ int ceph_release(struct inode *inode, struct file *file)
kfree(cf->dir_info);
dput(cf->dentry);
kmem_cache_free(ceph_file_cachep, cf);
+
+ /* wake up anyone waiting for caps on this inode */
+ wake_up(&ci->i_cap_wq);
return 0;
}