fs: take_dentry_name_snapshot: avoid kfree under spinlock

Change-Id: Ib4eb26611ff808b380ec9f2efb1e090dd0f756e6
Signed-off-by: Corinna Vinschen <xda@vinschen.de>
This commit is contained in:
Corinna Vinschen 2017-12-11 19:12:21 +01:00 committed by Luca Stefani
parent c0860b5272
commit b7f6cb2f76

View file

@ -243,18 +243,19 @@ void take_dentry_name_snapshot(struct name_snapshot *name, struct dentry *dentry
spin_lock(&dentry->d_lock);
if (unlikely(dname_external(dentry))) {
u32 len;
char *p;
char *p = NULL;
for (;;) {
len = dentry->d_name.len;
spin_unlock(&dentry->d_lock);
if (p)
kfree(p);
p = kmalloc(len + 1, GFP_KERNEL | __GFP_NOFAIL);
spin_lock(&dentry->d_lock);
if (dentry->d_name.len <= len)
break;
kfree(p);
}
memcpy(p, dentry->d_name.name, dentry->d_name.len + 1);
spin_unlock(&dentry->d_lock);