]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix ceph_add_cap for non-inline caps
authorSage Weil <sage@newdream.net>
Thu, 14 Aug 2008 17:35:16 +0000 (10:35 -0700)
committerSage Weil <sage@newdream.net>
Thu, 14 Aug 2008 17:35:16 +0000 (10:35 -0700)
src/kernel/inode.c

index 67f5bc6bb3c73572c30429f5416b727009c3a5b6..44ddd1b7a9a9b200ca749ef9006d40418c2a9e45 100644 (file)
@@ -1149,6 +1149,7 @@ int ceph_add_cap(struct inode *inode,
 
        dout(10, "ceph_add_cap on %p mds%d cap %d seq %d\n", inode,
             session->s_mds, issued, seq);
+retry:
        spin_lock(&inode->i_lock);
        cap = __get_cap_for_mds(inode, mds);
        if (!cap) {
@@ -1158,14 +1159,15 @@ int ceph_add_cap(struct inode *inode,
                                break;
                        }
                if (!cap) {
-                       if (new_cap)
+                       if (new_cap) {
                                cap = new_cap;
-                       else {
+                               new_cap = 0;
+                       } else {
                                spin_unlock(&inode->i_lock);
                                new_cap = kmalloc(sizeof(*cap), GFP_NOFS);
                                if (new_cap == 0)
                                        return -ENOMEM;
-                               spin_lock(&inode->i_lock);
+                               goto retry;
                        }
                }
 
@@ -1208,6 +1210,8 @@ int ceph_add_cap(struct inode *inode,
        spin_unlock(&inode->i_lock);
        if (is_new)
                igrab(inode);
+       if (new_cap)
+               kfree(new_cap);
        return 0;
 }