diff options
Diffstat (limited to 'fs/ocfs2/dcache.c')
| -rw-r--r-- | fs/ocfs2/dcache.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 7d604480557a..b574431a031d 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c | |||
| @@ -290,6 +290,21 @@ out_attach: | |||
| 290 | else | 290 | else |
| 291 | mlog_errno(ret); | 291 | mlog_errno(ret); |
| 292 | 292 | ||
| 293 | /* | ||
| 294 | * In case of error, manually free the allocation and do the iput(). | ||
| 295 | * We need to do this because error here means no d_instantiate(), | ||
| 296 | * which means iput() will not be called during dput(dentry). | ||
| 297 | */ | ||
| 298 | if (ret < 0 && !alias) { | ||
| 299 | ocfs2_lock_res_free(&dl->dl_lockres); | ||
| 300 | BUG_ON(dl->dl_count != 1); | ||
| 301 | spin_lock(&dentry_attach_lock); | ||
| 302 | dentry->d_fsdata = NULL; | ||
| 303 | spin_unlock(&dentry_attach_lock); | ||
| 304 | kfree(dl); | ||
| 305 | iput(inode); | ||
| 306 | } | ||
| 307 | |||
| 293 | dput(alias); | 308 | dput(alias); |
| 294 | 309 | ||
| 295 | return ret; | 310 | return ret; |
