]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: rework iterate_session_caps
authorSage Weil <sage@newdream.net>
Fri, 29 May 2009 18:56:27 +0000 (11:56 -0700)
committerSage Weil <sage@newdream.net>
Fri, 29 May 2009 21:30:20 +0000 (14:30 -0700)
Do not drop s_cap_lock if we failed to get an inode ref.  Othwerise we
risk the next *n pointer being invalid.

src/kernel/mds_client.c

index 0769c71ac2cec977e079a503992b2ac203e4518f..0a047c3fd82e1e04348cf033805a5cae6f421ddd 100644 (file)
@@ -631,23 +631,20 @@ static int iterate_session_caps(struct ceph_mds_session *session,
        struct ceph_cap *cap;
        struct inode *inode;
        struct list_head *n;
+       int ret;
 
        dout(10, "iterate_session_caps %p mds%d\n", session, session->s_mds);
        spin_lock(&session->s_cap_lock);
        list_for_each_safe(p, n, &session->s_caps) {
                cap = list_entry(p, struct ceph_cap, session_caps);
                inode = igrab(&cap->ci->vfs_inode);
+               if (!inode)
+                       continue;
                spin_unlock(&session->s_cap_lock);
-
-               if (inode) {
-                       int ret;
-
-                       ret = cb(inode, cap, arg);
-                       iput(inode);
-                       if (ret < 0)
-                               return ret;
-               }
-
+               ret = cb(inode, cap, arg);
+               iput(inode);
+               if (ret < 0)
+                       return ret;
                spin_lock(&session->s_cap_lock);
        }
        spin_unlock(&session->s_cap_lock);