Factor out a helper to return a hole when no dnode was found.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 fs/f2fs/data.c | 47 ++++++++++++++++++++++++-----------------------
 1 file changed, 24 insertions(+), 23 deletions(-)

diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index f6124cedd121a2..3c802ce397de52 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -1449,6 +1449,28 @@ int f2fs_get_block_locked(struct dnode_of_data *dn, 
pgoff_t index)
        return err;
 }
 
+static int f2fs_map_no_dnode(struct inode *inode,
+               struct f2fs_map_blocks *map, struct dnode_of_data *dn,
+               pgoff_t pgoff)
+{
+       struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
+
+       /*
+        * There is one exceptional case that read_node_page() may return
+        * -ENOENT due to filesystem has been shutdown or cp_error, return
+        * -EIO in that case.
+        */
+       if (map->m_may_create &&
+           (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) || f2fs_cp_error(sbi)))
+               return -EIO;
+
+       if (map->m_next_pgofs)
+               *map->m_next_pgofs = f2fs_get_next_page_offset(dn, pgoff);
+       if (map->m_next_extent)
+               *map->m_next_extent = f2fs_get_next_page_offset(dn, pgoff);
+       return 0;
+}
+
 static bool f2fs_map_blocks_cached(struct inode *inode,
                struct f2fs_map_blocks *map, int flag)
 {
@@ -1530,29 +1552,8 @@ int f2fs_map_blocks(struct inode *inode, struct 
f2fs_map_blocks *map, int flag)
        if (err) {
                if (flag == F2FS_GET_BLOCK_BMAP)
                        map->m_pblk = 0;
-
-               if (err == -ENOENT) {
-                       /*
-                        * There is one exceptional case that read_node_page()
-                        * may return -ENOENT due to filesystem has been
-                        * shutdown or cp_error, so force to convert error
-                        * number to EIO for such case.
-                        */
-                       if (map->m_may_create &&
-                               (is_sbi_flag_set(sbi, SBI_IS_SHUTDOWN) ||
-                               f2fs_cp_error(sbi))) {
-                               err = -EIO;
-                               goto unlock_out;
-                       }
-
-                       err = 0;
-                       if (map->m_next_pgofs)
-                               *map->m_next_pgofs =
-                                       f2fs_get_next_page_offset(&dn, pgofs);
-                       if (map->m_next_extent)
-                               *map->m_next_extent =
-                                       f2fs_get_next_page_offset(&dn, pgofs);
-               }
+               if (err == -ENOENT)
+                       err = f2fs_map_no_dnode(inode, map, &dn, pgofs);
                goto unlock_out;
        }
 
-- 
2.30.2



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to