libf2fs: propagate error from f2fs_{finalize,fsync}_device
authorChao Yu <yuchao0@huawei.com>
Fri, 24 Nov 2017 09:33:39 +0000 (17:33 +0800)
committerJaegeuk Kim <jaegeuk@kernel.org>
Tue, 28 Nov 2017 03:26:50 +0000 (19:26 -0800)
tests/generic/405 of fstest suit expects that mkfs will return error
when it hits EIO, so let's propagate error from
f2fs_{finalize,fsync}_device, then mkfs can be aware of fsync error.

Signed-off-by: Chao Yu <yuchao0@huawei.com>
[Jaegeuk Kim: initialize ret to zero]
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fsck/main.c
fsck/mount.c
include/f2fs_fs.h
lib/libf2fs_io.c
mkfs/f2fs_format_main.c

index b62fc29..543c10f 100644 (file)
@@ -676,7 +676,9 @@ retry:
                                goto fsck_again;
                }
        }
-       f2fs_finalize_device();
+       ret = f2fs_finalize_device();
+       if (ret < 0)
+               return ret;
 
        printf("\nDone.\n");
        return 0;
index 4ad22a1..3efa298 100644 (file)
@@ -2098,7 +2098,8 @@ void write_checkpoint(struct f2fs_sb_info *sbi)
                write_nat_bits(sbi, sb, cp, sbi->cur_cp);
 
        /* in case of sudden power off */
-       f2fs_fsync_device();
+       ret = f2fs_fsync_device();
+       ASSERT(ret >= 0);
 
        /* write the last cp */
        ret = dev_write_block(cp, cp_blk_no++);
index 7221844..2b39d12 100644 (file)
@@ -1060,8 +1060,8 @@ extern int f2fs_devs_are_umounted(void);
 extern int f2fs_dev_is_umounted(char *);
 extern int f2fs_get_device_info(void);
 extern int get_device_info(int);
-extern void f2fs_finalize_device(void);
-extern void f2fs_fsync_device(void);
+extern int f2fs_finalize_device(void);
+extern int f2fs_fsync_device(void);
 
 extern int dev_read(void *, __u64, size_t);
 extern int dev_write(void *, __u64, size_t);
index 268dcfa..f39133a 100644 (file)
@@ -213,19 +213,24 @@ int dev_reada_block(__u64 blk_addr)
        return dev_readahead(blk_addr << F2FS_BLKSIZE_BITS, F2FS_BLKSIZE);
 }
 
-void f2fs_fsync_device(void)
+int f2fs_fsync_device(void)
 {
        int i;
 
        for (i = 0; i < c.ndevs; i++) {
-               if (fsync(c.devices[i].fd) < 0)
+               if (fsync(c.devices[i].fd) < 0) {
                        MSG(0, "\tError: Could not conduct fsync!!!\n");
+                       return -1;
+               }
        }
+
+       return 0;
 }
 
-void f2fs_finalize_device(void)
+int f2fs_finalize_device(void)
 {
        int i;
+       int ret = 0;
 
 #ifdef WITH_ANDROID
        if (c.sparse_mode) {
@@ -246,11 +251,19 @@ void f2fs_finalize_device(void)
         * in the block device page cache.
         */
        for (i = 0; i < c.ndevs; i++) {
-               if (fsync(c.devices[i].fd) < 0)
+               ret = fsync(c.devices[i].fd);
+               if (ret < 0) {
                        MSG(0, "\tError: Could not conduct fsync!!!\n");
+                       break;
+               }
 
-               if (close(c.devices[i].fd) < 0)
+               ret = close(c.devices[i].fd);
+               if (ret < 0) {
                        MSG(0, "\tError: Failed to close device file!!!\n");
+                       break;
+               }
        }
        close(c.kd);
+
+       return ret;
 }
index 50735d3..21caff8 100644 (file)
@@ -333,7 +333,8 @@ int main(int argc, char *argv[])
        if (f2fs_format_device() < 0)
                return -1;
 
-       f2fs_finalize_device();
+       if (f2fs_finalize_device() < 0)
+               return -1;
 
        MSG(0, "Info: format successful\n");