|
@@ -360,6 +360,10 @@ int make_empty_inline_dir(struct inode *inode, struct inode *parent,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * NOTE: ipage is grabbed by caller, but if any error occurs, we should
|
|
|
+ * release ipage in this function.
|
|
|
+ */
|
|
|
static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,
|
|
|
struct f2fs_inline_dentry *inline_dentry)
|
|
|
{
|
|
@@ -369,8 +373,10 @@ static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,
|
|
|
int err;
|
|
|
|
|
|
page = grab_cache_page(dir->i_mapping, 0);
|
|
|
- if (!page)
|
|
|
+ if (!page) {
|
|
|
+ f2fs_put_page(ipage, 1);
|
|
|
return -ENOMEM;
|
|
|
+ }
|
|
|
|
|
|
set_new_dnode(&dn, dir, ipage, NULL, 0);
|
|
|
err = f2fs_reserve_block(&dn, 0);
|
|
@@ -434,8 +440,9 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
|
|
|
slots, NR_INLINE_DENTRY);
|
|
|
if (bit_pos >= NR_INLINE_DENTRY) {
|
|
|
err = f2fs_convert_inline_dir(dir, ipage, dentry_blk);
|
|
|
- if (!err)
|
|
|
- err = -EAGAIN;
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
+ err = -EAGAIN;
|
|
|
goto out;
|
|
|
}
|
|
|
|