Skip to content

Commit

Permalink
ceph: return EBADF if waiting for caps on closed file
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Sage Weil committed Mar 1, 2010
1 parent 6f863e7 commit 195d3ce
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 3 deletions.
9 changes: 6 additions & 3 deletions fs/ceph/caps.c
Original file line number Diff line number Diff line change
Expand Up @@ -1923,14 +1923,17 @@ static int try_get_cap_refs(struct ceph_inode_info *ci, int need, int want,
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;
Expand Down
3 changes: 3 additions & 0 deletions fs/ceph/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down

0 comments on commit 195d3ce

Please sign in to comment.