From: Sage Weil Date: Fri, 18 Sep 2009 23:32:26 +0000 (-0700) Subject: kclient: fix symlink kmalloc under spinlock X-Git-Tag: v0.15~22 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=84aec7d31238813a747841413928ebc885b96480;p=ceph.git kclient: fix symlink kmalloc under spinlock --- diff --git a/src/kernel/inode.c b/src/kernel/inode.c index 5a68ada3289a..8ae6a7b65c60 100644 --- a/src/kernel/inode.c +++ b/src/kernel/inode.c @@ -591,14 +591,23 @@ static int fill_inode(struct inode *inode, inode->i_op = &ceph_symlink_iops; if (!ci->i_symlink) { int symlen = iinfo->symlink_len; + char *sym; BUG_ON(symlen != inode->i_size); + spin_unlock(&inode->i_lock); + err = -ENOMEM; - ci->i_symlink = kmalloc(symlen+1, GFP_NOFS); - if (!ci->i_symlink) + sym = kmalloc(symlen+1, GFP_NOFS); + if (!sym) goto out; - memcpy(ci->i_symlink, iinfo->symlink, symlen); - ci->i_symlink[symlen] = 0; + memcpy(sym, iinfo->symlink, symlen); + sym[symlen] = 0; + + spin_lock(&inode->i_lock); + if (!ci->i_symlink) + ci->i_symlink = sym; + else + kfree(sym); /* lost a race */ } break; case S_IFDIR: