/* move to tail of session rdcaps lru? */
if (!list_empty(&cap->session_rdcaps))
- list_del(&cap->session_rdcaps);
+ list_del_init(&cap->session_rdcaps);
if ((cap->issued & ~CEPH_CAP_EXPIREABLE) == 0)
list_add_tail(&cap->session_rdcaps, &session->s_rdcaps);
* Note that caller is responsible for ensuring max_size increases are
* requested from the MDS.
*/
-int ceph_get_cap_refs(struct ceph_inode_info *ci, int need, int want, int *got,
+static int ceph_get_cap_refs(struct ceph_inode_info *ci, int need, int want, int *got,
loff_t endoff)
{
struct inode *inode = &ci->vfs_inode;
}
}
-int ceph_wait_for_caps(struct ceph_inode_info *ci, int need, int want, int *got,
+int ceph_get_caps(struct ceph_inode_info *ci, int need, int want, int *got,
loff_t endoff)
{
return wait_event_interruptible(ci->i_cap_wq,
req->r_locked_dir = dir;
req->r_args.mknod.mode = cpu_to_le32(mode);
req->r_args.mknod.rdev = cpu_to_le32(rdev);
- if ((ceph_caps_issued(ceph_inode(dir)) & CEPH_CAP_FILE_EXCL) == 0)
+ if (!ceph_caps_issued_mask(ceph_inode(dir), CEPH_CAP_FILE_EXCL))
ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
err = ceph_mdsc_do_request(mdsc, dir, req);
if (!err && req->r_reply_info.trace_numd == 0) {
return PTR_ERR(req);
}
req->r_locked_dir = dir;
- if ((ceph_caps_issued(ceph_inode(dir)) & CEPH_CAP_FILE_EXCL) == 0)
+ if (!ceph_caps_issued_mask(ceph_inode(dir), CEPH_CAP_FILE_EXCL))
ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
err = ceph_mdsc_do_request(mdsc, dir, req);
ceph_mdsc_put_request(req);
req->r_locked_dir = dir;
req->r_args.mkdir.mode = cpu_to_le32(mode);
- if ((ceph_caps_issued(ceph_inode(dir)) & CEPH_CAP_FILE_EXCL) == 0)
+ if (!ceph_caps_issued_mask(ceph_inode(dir), CEPH_CAP_FILE_EXCL))
ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
err = ceph_mdsc_do_request(mdsc, dir, req);
ceph_mdsc_put_request(req);
req->r_locked_dir = old_dentry->d_inode;
- if ((ceph_caps_issued(ceph_inode(dir)) & CEPH_CAP_FILE_EXCL) == 0)
+ if (!ceph_caps_issued_mask(ceph_inode(dir), CEPH_CAP_FILE_EXCL))
ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
err = ceph_mdsc_do_request(mdsc, dir, req);
if (err) {
req->r_locked_dir = dir; /* by VFS */
- if ((ceph_caps_issued(ceph_inode(dir)) & CEPH_CAP_FILE_EXCL) == 0)
+ if (!ceph_caps_issued_mask(ceph_inode(dir), CEPH_CAP_FILE_EXCL))
ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
ceph_mdsc_lease_release(mdsc, dir, dentry, CEPH_LOCK_DN);
ceph_release_caps(inode, CEPH_CAP_LINK_RDCACHE);
if (IS_ERR(req))
return PTR_ERR(req);
req->r_locked_dir = new_dir;
- if ((ceph_caps_issued(ceph_inode(old_dir)) & CEPH_CAP_FILE_EXCL) == 0)
+ if (!ceph_caps_issued_mask(ceph_inode(old_dir), CEPH_CAP_FILE_EXCL))
ceph_release_caps(old_dir, CEPH_CAP_FILE_RDCACHE);
ceph_mdsc_lease_release(mdsc, old_dir, old_dentry, CEPH_LOCK_DN);
- if ((ceph_caps_issued(ceph_inode(new_dir)) & CEPH_CAP_FILE_EXCL) == 0)
+ if (!ceph_caps_issued_mask(ceph_inode(new_dir), CEPH_CAP_FILE_EXCL))
ceph_release_caps(new_dir, CEPH_CAP_FILE_RDCACHE);
ceph_mdsc_lease_release(mdsc, new_dir, new_dentry, CEPH_LOCK_DN);
err = ceph_mdsc_do_request(mdsc, old_dir, req);
dentry = d_find_alias(inode);
if (!dentry)
return -ESTALE; /* yuck */
- if ((ceph_caps_issued(ceph_inode(inode)) & CEPH_CAP_FILE_EXCL) == 0)
+ if (!ceph_caps_issued_mask(ceph_inode(inode), CEPH_CAP_FILE_EXCL))
ceph_release_caps(inode, CEPH_CAP_FILE_RDCACHE);
req = prepare_open_request(inode->i_sb, dentry, flags, 0);
if (IS_ERR(req)) {
if (IS_ERR(req))
return ERR_PTR(PTR_ERR(req));
if ((flags & O_CREAT) &&
- (ceph_caps_issued(ceph_inode(dir)) & CEPH_CAP_FILE_EXCL) == 0)
+ (!ceph_caps_issued_mask(ceph_inode(dir), CEPH_CAP_FILE_EXCL)))
ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
req->r_locked_dir = dir; /* caller holds dir->i_mutex */
err = ceph_mdsc_do_request(mdsc, parent_inode, req);
dout(10, "aio_read %llx.%llx %llu~%u trying to get caps on %p\n",
ceph_vinop(inode), pos, (unsigned)len, inode);
- ret = ceph_wait_for_caps(ci,
+ ret = ceph_get_caps(ci,
CEPH_CAP_FILE_RD,
CEPH_CAP_FILE_RDCACHE,
&got, -1);
check_max_size(inode, endoff);
dout(10, "aio_write %p %llu~%u getting caps. i_size %llu\n",
inode, pos, (unsigned)iov->iov_len, inode->i_size);
- ret = ceph_wait_for_caps(ci,
+ ret = ceph_get_caps(ci,
CEPH_CAP_FILE_WR,
CEPH_CAP_FILE_WRBUFFER,
&got, endoff);
int err;
/* if i hold CAP_EXCL, i can change [am]time any way i like */
- if (ceph_caps_issued(ci) & CEPH_CAP_FILE_EXCL) {
+ if (ceph_caps_issued_mask(ci, CEPH_CAP_FILE_EXCL)) {
dout(10, "utime holding EXCL, doing locally\n");
ci->i_time_warp_seq++;
if (ia_valid & ATTR_ATIME)
}
/* if i hold CAP_WR, i can _increase_ [am]time safely */
- if ((ceph_caps_issued(ci) & CEPH_CAP_FILE_WR) &&
+ if (ceph_caps_issued_mask(ci, CEPH_CAP_FILE_WR) &&
((ia_valid & ATTR_MTIME) == 0 ||
timespec_compare(&inode->i_mtime, &attr->ia_mtime) < 0) &&
((ia_valid & ATTR_ATIME) == 0 ||
return issued;
}
+static inline int ceph_caps_issued_mask(struct ceph_inode_info *ci, int mask)
+{
+ return (ceph_caps_issued(ci) & mask);
+}
+
extern int __ceph_caps_dirty(struct ceph_inode_info *ci);
extern int ceph_caps_revoking(struct ceph_inode_info *ci);
struct ceph_cap *new_cap);
extern void ceph_remove_cap(struct ceph_cap *cap);
extern int ceph_get_cap_mds(struct inode *inode);
-extern int ceph_get_cap_refs(struct ceph_inode_info *ci, int need, int want,
- int *got, loff_t offset);
extern void ceph_put_cap_refs(struct ceph_inode_info *ci, int had);
extern void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr,
struct ceph_snap_context *snapc);
ceph_check_caps(ceph_inode(inode), 1, mask, NULL);
}
-extern int ceph_wait_for_caps(struct ceph_inode_info *ci, int need, int want, int *got,
+extern int ceph_get_caps(struct ceph_inode_info *ci, int need, int want, int *got,
loff_t endoff);
/* addr.c */