]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: dirfrag access using mutex and not inode's spinlock
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 12 Sep 2008 16:23:14 +0000 (09:23 -0700)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 12 Sep 2008 16:24:16 +0000 (09:24 -0700)
src/kernel/inode.c
src/kernel/super.c
src/kernel/super.h

index ddc3f2962ef51e9283216347152440d67cb3d7f6..f097eaa4f3050d6f904a362aeefd65fdedb76ecd 100644 (file)
@@ -106,9 +106,7 @@ retry:
        }
 
        if (!newfrag) {
-               spin_unlock(&ci->vfs_inode.i_lock);
                newfrag = kmalloc(sizeof(*frag), GFP_NOFS);
-               spin_lock(&ci->vfs_inode.i_lock);
                if (!newfrag)
                        return ERR_PTR(-ENOMEM);
                goto retry;
@@ -140,7 +138,7 @@ __u32 ceph_choose_frag(struct ceph_inode_info *ci, u32 v,
        unsigned nway, i;
        u32 n;
 
-       spin_lock(&ci->vfs_inode.i_lock);
+       mutex_lock(&ci->i_fragtree_mutex);
        while (1) {
                WARN_ON(!frag_contains_value(t, v));
                frag = __ceph_find_frag(ci, t);
@@ -168,7 +166,7 @@ __u32 ceph_choose_frag(struct ceph_inode_info *ci, u32 v,
        }
        dout(30, "choose_frag(%x) = %x\n", v, t);
 
-       spin_unlock(&ci->vfs_inode.i_lock);
+       mutex_unlock(&ci->i_fragtree_mutex);
        return t;
 }
 
@@ -188,7 +186,7 @@ static int ceph_fill_dirfrag(struct inode *inode,
        int i;
        int err = 0;
 
-       spin_lock(&inode->i_lock);
+       mutex_lock(&ci->i_fragtree_mutex);
        if (mds < 0 && ndist == 0) {
                /* no delegation info needed. */
                frag = __ceph_find_frag(ci, id);
@@ -228,7 +226,7 @@ static int ceph_fill_dirfrag(struct inode *inode,
             ceph_vinop(inode), frag->frag, frag->mds, frag->ndist);
 
 out:
-       spin_unlock(&inode->i_lock);
+       mutex_unlock(&ci->i_fragtree_mutex);
        return err;
 }
 
index 42831b1248e1e7eda5d87677980313fdae88e205..eb5ba2873da8972578074de30c29d6c16d2e81d5 100644 (file)
@@ -164,6 +164,7 @@ static struct inode *ceph_alloc_inode(struct super_block *sb)
        INIT_LIST_HEAD(&ci->i_lease_item);
 
        ci->i_fragtree = RB_ROOT;
+       mutex_init(&ci->i_fragtree_mutex);
 
        ci->i_xattr_len = 0;
        ci->i_xattr_data = 0;
index 6a39033c7d03a5b5bf9c670a386113c6aa0b2c09..e4d56cc53ac75a9fbd97a46674298586470975d5 100644 (file)
@@ -243,6 +243,7 @@ struct ceph_inode_info {
        struct list_head i_lease_item; /* mds session list */
 
        struct rb_root i_fragtree;
+       struct mutex i_fragtree_mutex;
 
        int i_xattr_len;
        char *i_xattr_data;