From: Yehuda Sadeh Date: Fri, 12 Sep 2008 16:23:14 +0000 (-0700) Subject: kclient: dirfrag access using mutex and not inode's spinlock X-Git-Tag: v0.4~115 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d572871b9eec36fb45e7f70ba78bf31dad505133;p=ceph.git kclient: dirfrag access using mutex and not inode's spinlock --- diff --git a/src/kernel/inode.c b/src/kernel/inode.c index ddc3f2962ef5..f097eaa4f305 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -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; } diff --git a/src/kernel/super.c b/src/kernel/super.c index 42831b1248e1..eb5ba2873da8 100644 --- a/src/kernel/super.c +++ b/src/kernel/super.c @@ -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; diff --git a/src/kernel/super.h b/src/kernel/super.h index 6a39033c7d03..e4d56cc53ac7 100644 --- a/src/kernel/super.h +++ b/src/kernel/super.h @@ -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;