diff options
Diffstat (limited to 'fs/f2fs/inline.c')
-rw-r--r-- | fs/f2fs/inline.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c index d636cbcf68f2..bb6a152310ef 100644 --- a/fs/f2fs/inline.c +++ b/fs/f2fs/inline.c | |||
@@ -298,7 +298,7 @@ process_inline: | |||
298 | clear_inode_flag(inode, FI_INLINE_DATA); | 298 | clear_inode_flag(inode, FI_INLINE_DATA); |
299 | f2fs_put_page(ipage, 1); | 299 | f2fs_put_page(ipage, 1); |
300 | } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) { | 300 | } else if (ri && (ri->i_inline & F2FS_INLINE_DATA)) { |
301 | if (f2fs_truncate_blocks(inode, 0, false, false)) | 301 | if (f2fs_truncate_blocks(inode, 0, false)) |
302 | return false; | 302 | return false; |
303 | goto process_inline; | 303 | goto process_inline; |
304 | } | 304 | } |
@@ -470,7 +470,7 @@ static int f2fs_add_inline_entries(struct inode *dir, void *inline_dentry) | |||
470 | return 0; | 470 | return 0; |
471 | punch_dentry_pages: | 471 | punch_dentry_pages: |
472 | truncate_inode_pages(&dir->i_data, 0); | 472 | truncate_inode_pages(&dir->i_data, 0); |
473 | f2fs_truncate_blocks(dir, 0, false, false); | 473 | f2fs_truncate_blocks(dir, 0, false); |
474 | f2fs_remove_dirty_inode(dir); | 474 | f2fs_remove_dirty_inode(dir); |
475 | return err; | 475 | return err; |
476 | } | 476 | } |
@@ -659,6 +659,12 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, | |||
659 | if (IS_ERR(ipage)) | 659 | if (IS_ERR(ipage)) |
660 | return PTR_ERR(ipage); | 660 | return PTR_ERR(ipage); |
661 | 661 | ||
662 | /* | ||
663 | * f2fs_readdir was protected by inode.i_rwsem, it is safe to access | ||
664 | * ipage without page's lock held. | ||
665 | */ | ||
666 | unlock_page(ipage); | ||
667 | |||
662 | inline_dentry = inline_data_addr(inode, ipage); | 668 | inline_dentry = inline_data_addr(inode, ipage); |
663 | 669 | ||
664 | make_dentry_ptr_inline(inode, &d, inline_dentry); | 670 | make_dentry_ptr_inline(inode, &d, inline_dentry); |
@@ -667,7 +673,7 @@ int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, | |||
667 | if (!err) | 673 | if (!err) |
668 | ctx->pos = d.max; | 674 | ctx->pos = d.max; |
669 | 675 | ||
670 | f2fs_put_page(ipage, 1); | 676 | f2fs_put_page(ipage, 0); |
671 | return err < 0 ? err : 0; | 677 | return err < 0 ? err : 0; |
672 | } | 678 | } |
673 | 679 | ||