From 61c26279b72a5216fafd45fa291147f638cba3a2 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 6 Mar 2008 11:17:53 -0800 Subject: [PATCH] client: new cap code working --- src/kernel/inode.c | 29 +++++++++++------------------ src/kernel/mds_client.c | 7 ++----- src/kernel/super.c | 1 + src/kernel/super.h | 4 ++-- 4 files changed, 16 insertions(+), 25 deletions(-) diff --git a/src/kernel/inode.c b/src/kernel/inode.c index ce47bc693c754..5c24c7c8dea07 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -326,8 +326,8 @@ struct ceph_inode_cap *ceph_add_cap(struct inode *inode, struct ceph_mds_session spin_unlock(&session->s_cap_lock); } - dout(10, "add_cap inode %p (%llx) got cap %d %xh now %xh seq %d from %d\n", - inode, ceph_ino(inode), i, caps, caps|cap->caps, seq, mds); + dout(10, "add_cap inode %p (%llx) got cap %xh now %xh seq %d from %d\n", + inode, ceph_ino(inode), caps, caps|cap->caps, seq, mds); cap->caps |= caps; cap->seq = seq; return cap; @@ -346,12 +346,12 @@ int ceph_caps_issued(struct ceph_inode_info *ci) return have; } -void __ceph_remove_cap(struct ceph_inode_cap *cap) +void ceph_remove_cap(struct ceph_inode_cap *cap) { struct ceph_mds_session *session = cap->session; struct ceph_inode_info *ci = cap->ci; - dout(10, "__ceph_remove_cap %p from %p\n", cap, &ci->vfs_inode); + dout(10, "ceph_remove_cap %p from %p\n", cap, &ci->vfs_inode); /* remove from session list */ spin_lock(&session->s_cap_lock); @@ -361,32 +361,25 @@ void __ceph_remove_cap(struct ceph_inode_cap *cap) spin_unlock(&session->s_cap_lock); /* remove from inode list */ + spin_lock(&ci->vfs_inode.i_lock); list_del(&cap->ci_caps); if (list_empty(&ci->i_caps)) iput(&ci->vfs_inode); cap->ci = 0; - - if (cap >= ci->i_static_caps && - cap < ci->i_static_caps + STATIC_CAPS) - cap->mds = -1; - else + cap->mds = -1; /* mark unused */ + spin_unlock(&ci->vfs_inode.i_lock); + + if (cap < ci->i_static_caps || cap >= ci->i_static_caps + STATIC_CAPS) kfree(cap); } -/*void ceph_remove_cap(struct ceph_inode_info *ci, int mds) -{ - struct ceph_inode_cap *cap = get_cap_for_mds(ci, mds); - if (cap) - __ceph_remove_cap(cap); - }*/ - -void ceph_remove_caps(struct ceph_inode_info *ci) +void ceph_remove_all_caps(struct ceph_inode_info *ci) { struct ceph_inode_cap *cap; dout(10, "remove_caps on %p\n", &ci->vfs_inode); while (!list_empty(&ci->i_caps)) { cap = list_entry(ci->i_caps.next, struct ceph_inode_cap, ci_caps); - __ceph_remove_cap(cap); + ceph_remove_cap(cap); } } diff --git a/src/kernel/mds_client.c b/src/kernel/mds_client.c index f3c25f4a10162..c30aa6d371788 100644 --- a/src/kernel/mds_client.c +++ b/src/kernel/mds_client.c @@ -557,7 +557,7 @@ static void remove_session_caps(struct ceph_mds_session *session) igrab(&ci->vfs_inode); dout(10, "removing cap %p, ci is %p, inode is %p\n", cap, ci, &ci->vfs_inode); spin_unlock(&session->s_cap_lock); - ceph_remove_cap(ci, session->s_mds); + ceph_remove_cap(cap); spin_lock(&session->s_cap_lock); iput(&ci->vfs_inode); } @@ -1234,8 +1234,6 @@ int ceph_mdsc_update_cap_wanted(struct ceph_inode_info *ci, int wanted) struct ceph_mds_session *session; struct list_head *p; - int i; - dout(10, "update_cap_wanted %d -> %d\n", ci->i_cap_wanted, wanted); list_for_each(p, &ci->i_caps) { @@ -1251,9 +1249,8 @@ int ceph_mdsc_update_cap_wanted(struct ceph_inode_info *ci, int wanted) } ci->i_cap_wanted = wanted; - if (wanted == 0) - ceph_remove_caps(ci); + ceph_remove_all_caps(ci); return 0; } diff --git a/src/kernel/super.c b/src/kernel/super.c index 76d4e6bbc3bbe..834dcd54a8604 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -114,6 +114,7 @@ static struct inode *ceph_alloc_inode(struct super_block *sb) ci->i_frag_map_nr = 0; ci->i_frag_map = ci->i_frag_map_static; + INIT_LIST_HEAD(&ci->i_caps); for (i = 0; i < STATIC_CAPS; i++) ci->i_static_caps[i].mds = -1; for (i = 0; i < 4; i++) diff --git a/src/kernel/super.h b/src/kernel/super.h index 2b3210a818e2a..4b2266a6b2bfd 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -281,8 +281,8 @@ extern struct ceph_inode_cap *ceph_find_cap(struct inode *inode, int want); extern struct ceph_inode_cap *ceph_add_cap(struct inode *inode, struct ceph_mds_session *session, u32 cap, u32 seq); -extern void ceph_remove_cap(struct ceph_inode_info *ci, int mds); -extern void ceph_remove_caps(struct ceph_inode_info *ci); +extern void ceph_remove_cap(struct ceph_inode_cap *cap); +extern void ceph_remove_all_caps(struct ceph_inode_info *ci); extern int ceph_handle_cap_grant(struct inode *inode, struct ceph_mds_file_caps *grant, struct ceph_mds_session *session); -- 2.39.5