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>
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 9afa8d3..06f1979 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1923,14 +1923,17 @@
 	struct inode *inode = &ci->vfs_inode;
 	int ret = 0;
 	int have, implemented;
+	int file_wanted;
 
 	dout("get_cap_refs %p need %s want %s\n", inode,
 	     ceph_cap_string(need), ceph_cap_string(want));
 	spin_lock(&inode->i_lock);
 
-	/* make sure we _have_ some caps! */
-	if (!__ceph_is_any_caps(ci)) {
-		dout("get_cap_refs %p no real caps\n", inode);
+	/* make sure file is actually open */
+	file_wanted = __ceph_caps_file_wanted(ci);
+	if ((file_wanted & need) == 0) {
+		dout("try_get_cap_refs need %s file_wanted %s, EBADF\n",
+		     ceph_cap_string(need), ceph_cap_string(file_wanted));
 		*err = -EBADF;
 		ret = 1;
 		goto out;