From 84aec7d31238813a747841413928ebc885b96480 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 18 Sep 2009 16:32:26 -0700 Subject: [PATCH] kclient: fix symlink kmalloc under spinlock --- src/kernel/inode.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) 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: -- 2.47.3