f2fs: fix incorrect mapping in ->bmap
authorChao Yu <yuchao0@huawei.com>
Thu, 5 May 2016 11:13:02 +0000 (19:13 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Sat, 7 May 2016 17:32:32 +0000 (10:32 -0700)
Currently, generic_block_bmap is used in f2fs_bmap, its semantics is when
the mapping is been found, return position of target physical block,
otherwise return zero.

But, previously, when there is no mapping info for specified logical block,
f2fs_bmap will map target physical block to a uninitialized variable, which
should be wrong. Fix it.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/data.c

index 888f1781ae0bfb3df07e46fa21719ae978d37ee9..96b035319889f7932c906bf1665ce1b5e4e3932c 100644 (file)
@@ -648,6 +648,8 @@ next_dnode:
        set_new_dnode(&dn, inode, NULL, NULL, 0);
        err = get_dnode_of_data(&dn, pgofs, mode);
        if (err) {
+               if (flag == F2FS_GET_BLOCK_BMAP)
+                       map->m_pblk = 0;
                if (err == -ENOENT) {
                        err = 0;
                        if (map->m_next_pgofs)
@@ -683,17 +685,18 @@ next_block:
                        map->m_flags = F2FS_MAP_NEW;
                        blkaddr = dn.data_blkaddr;
                } else {
+                       if (flag == F2FS_GET_BLOCK_BMAP) {
+                               map->m_pblk = 0;
+                               goto sync_out;
+                       }
                        if (flag == F2FS_GET_BLOCK_FIEMAP &&
                                                blkaddr == NULL_ADDR) {
                                if (map->m_next_pgofs)
                                        *map->m_next_pgofs = pgofs + 1;
                        }
                        if (flag != F2FS_GET_BLOCK_FIEMAP ||
-                                               blkaddr != NEW_ADDR) {
-                               if (flag == F2FS_GET_BLOCK_BMAP)
-                                       err = -ENOENT;
+                                               blkaddr != NEW_ADDR)
                                goto sync_out;
-                       }
                }
        }