]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: implement ceph_release_caps
authorSage Weil <sage@newdream.net>
Wed, 7 Jan 2009 00:45:41 +0000 (16:45 -0800)
committerSage Weil <sage@newdream.net>
Wed, 7 Jan 2009 00:45:41 +0000 (16:45 -0800)
Just pass a 'drop' mask to check_caps, and tell it not to
delay.

src/kernel/caps.c
src/kernel/dir.c
src/kernel/file.c
src/kernel/inode.c
src/kernel/ioctl.c
src/kernel/mds_client.c
src/kernel/super.h

index 8c82bd3ecec5cabbbdd7ce9fbd9b419440774ac9..344cddc1d5aaf42d6915658420779d8ab701df3c 100644 (file)
@@ -676,7 +676,7 @@ void ceph_flush_snaps(struct ceph_inode_info *ci)
  * @is_delayed indicates caller is delayed work and we should not
  * delay further.
  */
-void ceph_check_caps(struct ceph_inode_info *ci, int is_delayed)
+void ceph_check_caps(struct ceph_inode_info *ci, int is_delayed, int drop)
 {
        struct ceph_client *client = ceph_inode_to_client(&ci->vfs_inode);
        struct ceph_mds_client *mdsc = &client->mdsc;
@@ -712,6 +712,7 @@ retry_locked:
                retain |= CEPH_CAP_PIN |
                        (S_ISDIR(inode->i_mode) ? CEPH_CAP_ANY_RDCACHE :
                         CEPH_CAP_ANY_RD);
+       retain &= ~drop;
 
        dout(10, "check_caps %p file_wanted %s used %s retain %s issued %s\n",
             inode, ceph_cap_string(file_wanted), ceph_cap_string(used),
@@ -771,7 +772,7 @@ retry_locked:
                        dout(10, "mds%d revoking %s\n", cap->mds,
                             ceph_cap_string(revoking));
 
-               /* request larger max_size from MDS? */
+               /* request larger max_size from MDS& ~drop;? */
                if (ci->i_wanted_max_size > ci->i_max_size &&
                    ci->i_wanted_max_size > ci->i_requested_max_size)
                        goto ack;
@@ -851,7 +852,6 @@ ack:
                up_read(&mdsc->snap_rwsem);
 }
 
-
 /*
  * Track references to capabilities we hold, so that we don't release
  * them to the MDS prematurely.
@@ -988,7 +988,7 @@ void ceph_put_cap_refs(struct ceph_inode_info *ci, int had)
             last ? "last" : "");
 
        if (last && !flushsnaps)
-               ceph_check_caps(ci, 0);
+               ceph_check_caps(ci, 0, 0);
        else if (flushsnaps)
                ceph_flush_snaps(ci);
        if (wake)
@@ -1050,7 +1050,7 @@ void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr,
        spin_unlock(&inode->i_lock);
 
        if (last) {
-               ceph_check_caps(ci, 0);
+               ceph_check_caps(ci, 0, 0);
        } else if (last_snap) {
                ceph_flush_snaps(ci);
                wake_up(&ci->i_cap_wq);
@@ -1619,7 +1619,7 @@ done:
        ceph_put_mds_session(session);
 
        if (check_caps)
-               ceph_check_caps(ceph_inode(inode), 1);
+               ceph_check_caps(ceph_inode(inode), 1, 0);
        if (inode)
                iput(inode);
        return;
@@ -1659,14 +1659,9 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc)
                list_del_init(&ci->i_cap_delay_list);
                spin_unlock(&mdsc->cap_delay_lock);
                dout(10, "check_delayed_caps on %p\n", &ci->vfs_inode);
-               ceph_check_caps(ci, 1);
+               ceph_check_caps(ci, 1, 0);
                iput(&ci->vfs_inode);
        }
        spin_unlock(&mdsc->cap_delay_lock);
 }
 
-void ceph_caps_release(struct inode *inode, int mask)
-{
-       /* TODO */
-}
-
index cb29a9f77775f0a77af50fa0fe31f76d1d529c1d..ff73f7663c2084a49cbf9bf19beccaa78ff3284a 100644 (file)
@@ -437,7 +437,7 @@ static int ceph_mknod(struct inode *dir, struct dentry *dentry,
        rhead = req->r_request->front.iov_base;
        rhead->args.mknod.mode = cpu_to_le32(mode);
        rhead->args.mknod.rdev = cpu_to_le32(rdev);
-       ceph_caps_release(dir, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        if (!err && req->r_reply_info.trace_numd == 0) {
                /*
@@ -511,7 +511,7 @@ static int ceph_symlink(struct inode *dir, struct dentry *dentry,
                return PTR_ERR(req);
        }
        req->r_locked_dir = dir;
-       ceph_caps_release(dir, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        if (err)
@@ -567,7 +567,7 @@ static int ceph_mkdir(struct inode *dir, struct dentry *dentry, int mode)
        rhead = req->r_request->front.iov_base;
        rhead->args.mkdir.mode = cpu_to_le32(mode);
 
-       ceph_caps_release(dir, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        if (err < 0)
@@ -613,7 +613,7 @@ static int ceph_link(struct dentry *old_dentry, struct inode *dir,
        req->r_last_dentry = dget(dentry); /* use this dentry in fill_trace */
        req->r_locked_dir = old_dentry->d_inode;
 
-       ceph_caps_release(dir, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        if (err) {
                d_drop(dentry);
@@ -677,10 +677,10 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry)
 
        req->r_locked_dir = dir;  /* by VFS */
 
-       ceph_caps_release(dir, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
        ceph_mdsc_lease_release(mdsc, dir, dentry,
                                CEPH_LOCK_DN);
-       ceph_caps_release(inode, CEPH_CAP_LINK_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_LINK_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
 
@@ -725,11 +725,11 @@ static int ceph_rename(struct inode *old_dir, struct dentry *old_dentry,
        req->r_old_dentry = dget(old_dentry);
        req->r_last_dentry = dget(new_dentry);
        req->r_locked_dir = new_dir;
-       ceph_caps_release(old_dir, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(old_dir, CEPH_CAP_FILE_RDCACHE);
        ceph_mdsc_lease_release(mdsc, old_dir, old_dentry,
                                CEPH_LOCK_DN);
        if (new_dentry->d_inode)
-               ceph_caps_release(new_dentry->d_inode, CEPH_CAP_FILE_RDCACHE);
+               ceph_release_caps(new_dentry->d_inode, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        if (!err && req->r_reply_info.trace_numd == 0) {
                /*
index 9b1795a97f12d8288dd5edce4f066b07d6c935c9..f1e809ddfc7e11d066857e3d7fab10f9b4e68906 100644 (file)
@@ -130,7 +130,7 @@ int ceph_open(struct inode *inode, struct file *file)
        dentry = d_find_alias(inode);
        if (!dentry)
                return -ESTALE;  /* yuck */
-       ceph_caps_release(inode, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_FILE_RDCACHE);
        req = prepare_open_request(inode->i_sb, dentry, flags, 0);
        if (IS_ERR(req)) {
                err = PTR_ERR(req);
@@ -178,7 +178,7 @@ struct dentry *ceph_lookup_open(struct inode *dir, struct dentry *dentry,
        if (IS_ERR(req))
                return ERR_PTR(PTR_ERR(req));
        if (flags & O_CREAT)
-               ceph_caps_release(dir, CEPH_CAP_FILE_RDCACHE);
+               ceph_release_caps(dir, CEPH_CAP_FILE_RDCACHE);
        req->r_last_dentry = dget(dentry); /* use this dentry in fill_trace */
        req->r_locked_dir = dir;           /* caller holds dir->i_mutex */
        err = ceph_mdsc_do_request(mdsc, req);
@@ -342,7 +342,7 @@ static void check_max_size(struct inode *inode, loff_t endoff)
        }
        spin_unlock(&inode->i_lock);
        if (check)
-               ceph_check_caps(ci, 0);
+               ceph_check_caps(ci, 0, 0);
 }
 
 /*
index 086050b5e075b46c13358ecf502c87150b711aff..43d1d239aa5f1b3d3127459ad800d3eac04228c5 100644 (file)
@@ -1188,7 +1188,7 @@ void ceph_inode_set_size(struct inode *inode, loff_t size)
        if ((size << 1) >= ci->i_max_size &&
            (ci->i_reported_size << 1) < ci->i_max_size) {
                spin_unlock(&inode->i_lock);
-               ceph_check_caps(ci, 0);
+               ceph_check_caps(ci, 0, 0);
        } else {
                spin_unlock(&inode->i_lock);
        }
@@ -1212,7 +1212,7 @@ void ceph_put_fmode(struct ceph_inode_info *ci, int fmode)
        spin_unlock(&ci->vfs_inode.i_lock);
 
        if (last && ci->i_vino.snap == CEPH_NOSNAP)
-               ceph_check_caps(ci, 0);
+               ceph_check_caps(ci, 0, 0);
 }
 
 
@@ -1273,7 +1273,7 @@ static void ceph_inode_invalidate_pages(struct work_struct *work)
        spin_unlock(&inode->i_lock);
 
        if (check)
-               ceph_check_caps(ci, 0);
+               ceph_check_caps(ci, 0, 0);
 out:
        iput(inode);
 }
@@ -1319,7 +1319,7 @@ void __ceph_do_pending_vmtruncate(struct inode *inode)
                dout(10, "__do_pending_vmtruncate %p to %lld\n", inode, to);
                truncate_inode_pages(inode->i_mapping, to);
                if (wrbuffer_refs == 0)
-                       ceph_check_caps(ci, 0);
+                       ceph_check_caps(ci, 0, 0);
        } else {
                dout(10, "__do_pending_vmtruncate %p nothing to do\n", inode);
        }
@@ -1415,7 +1415,7 @@ static int ceph_setattr_chown(struct dentry *dentry, struct iattr *attr)
                mask |= CEPH_CHOWN_GID;
        }
        reqh->args.chown.mask = cpu_to_le32(mask);
-       ceph_caps_release(inode, CEPH_CAP_AUTH_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_AUTH_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        dout(10, "chown result %d\n", err);
@@ -1448,7 +1448,7 @@ static int ceph_setattr_chmod(struct dentry *dentry, struct iattr *attr)
                return PTR_ERR(req);
        reqh = req->r_request->front.iov_base;
        reqh->args.chmod.mode = cpu_to_le32(attr->ia_mode);
-       ceph_caps_release(inode, CEPH_CAP_AUTH_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_AUTH_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        dout(10, "chmod result %d\n", err);
@@ -1517,7 +1517,7 @@ static int ceph_setattr_time(struct dentry *dentry, struct iattr *attr)
        if (ia_valid & ATTR_MTIME)
                reqh->args.utime.mask |= cpu_to_le32(CEPH_UTIME_MTIME);
 
-       ceph_caps_release(inode, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        dout(10, "utime result %d\n", err);
@@ -1560,7 +1560,7 @@ static int ceph_setattr_size(struct dentry *dentry, struct iattr *attr)
                return PTR_ERR(req);
        reqh = req->r_request->front.iov_base;
        reqh->args.truncate.length = cpu_to_le64(attr->ia_size);
-       ceph_caps_release(inode, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        dout(10, "truncate result %d\n", err);
@@ -1984,7 +1984,7 @@ int ceph_setxattr(struct dentry *dentry, const char *name,
        req->r_request->hdr.data_len = cpu_to_le32(size);
        req->r_request->hdr.data_off = cpu_to_le32(0);
 
-       ceph_caps_release(inode, CEPH_CAP_XATTR_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_XATTR_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
 
@@ -2028,7 +2028,7 @@ int ceph_removexattr(struct dentry *dentry, const char *name)
        if (IS_ERR(req))
                return PTR_ERR(req);
 
-       ceph_caps_release(inode, CEPH_CAP_XATTR_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_XATTR_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        return err;
index 294f077fbde10833184fc26152dccbd6c442b540..4b253a8c5417e28b8f19c7e749ce0a6449805e29 100644 (file)
@@ -51,7 +51,7 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
        kfree(path);
        reqh = req->r_request->front.iov_base;
        reqh->args.setlayout.layout = layout;
-       ceph_caps_release(inode, CEPH_CAP_FILE_RDCACHE);
+       ceph_release_caps(inode, CEPH_CAP_FILE_RDCACHE);
        err = ceph_mdsc_do_request(mdsc, req);
        ceph_mdsc_put_request(req);
        return err;
index a2085e6d41a39521ce71815fa8c8efa2acaf6c1a..3cda5e9b485df5c485b65a85b372cfaf82b84cfd 100644 (file)
@@ -925,7 +925,7 @@ static void check_all_caps(struct ceph_mds_client *mdsc,
 
                igrab(inode);
                mutex_unlock(&session->s_mutex);
-               ceph_check_caps(ceph_inode(inode), 1);
+               ceph_check_caps(ceph_inode(inode), 1, 0);
                mutex_lock(&session->s_mutex);
                iput(inode);
        }
index 88078d646208b77ae0a40f762dc18ae1e383c7c2..9fda42f28d7113daeba9d8f461cceabe87697e86 100644 (file)
@@ -667,9 +667,12 @@ extern void ceph_put_wrbuffer_cap_refs(struct ceph_inode_info *ci, int nr,
                                       struct ceph_snap_context *snapc);
 extern void __ceph_flush_snaps(struct ceph_inode_info *ci,
                               struct ceph_mds_session **psession);
-extern void ceph_check_caps(struct ceph_inode_info *ci, int delayed);
+extern void ceph_check_caps(struct ceph_inode_info *ci, int delayed, int drop);
 extern void ceph_check_delayed_caps(struct ceph_mds_client *mdsc);
-extern void ceph_caps_release(struct inode *inode, int mask);
+extern inline void ceph_release_caps(struct inode *inode, int mask)
+{
+       ceph_check_caps(ceph_inode(inode), 1, mask);
+}
 
 /* addr.c */
 extern const struct address_space_operations ceph_aops;