ceph: fix comments, locking in destroy_inode
authorSage Weil <sage@newdream.net>
Mon, 22 Feb 2010 21:59:00 +0000 (13:59 -0800)
committerSage Weil <sage@newdream.net>
Tue, 23 Feb 2010 22:26:35 +0000 (14:26 -0800)
The destroy_inode path needs no inode locks since there are no
inode references.  Update __ceph_remove_cap comment to reflect
that it is called without cap->session->s_mutex in this case.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/caps.c

index 289f6c65a17e1245cc9a60f9f0f8b54ba10afc35..b6154ffe70df5aa50a5c75abf90876d4743b46dd 100644 (file)
@@ -856,8 +856,8 @@ static int __ceph_is_any_caps(struct ceph_inode_info *ci)
 }
 
 /*
- * caller should hold i_lock, and session s_mutex.
- * returns true if this is the last cap.  if so, caller should iput.
+ * caller should hold i_lock.
+ * caller will not hold session s_mutex if called from destroy_inode.
  */
 void __ceph_remove_cap(struct ceph_cap *cap)
 {
@@ -974,15 +974,14 @@ static int send_cap_msg(struct ceph_mds_session *session,
 }
 
 /*
- * Queue cap releases when an inode is dropped from our
- * cache.
+ * Queue cap releases when an inode is dropped from our cache.  Since
+ * inode is about to be destroyed, there is no need for i_lock.
  */
 void ceph_queue_caps_release(struct inode *inode)
 {
        struct ceph_inode_info *ci = ceph_inode(inode);
        struct rb_node *p;
 
-       spin_lock(&inode->i_lock);
        p = rb_first(&ci->i_caps);
        while (p) {
                struct ceph_cap *cap = rb_entry(p, struct ceph_cap, ci_node);
@@ -1024,9 +1023,7 @@ void ceph_queue_caps_release(struct inode *inode)
                spin_unlock(&session->s_cap_lock);
                p = rb_next(p);
                __ceph_remove_cap(cap);
-
        }
-       spin_unlock(&inode->i_lock);
 }
 
 /*