From: Omar Sandoval Date: Fri, 3 Mar 2017 17:02:14 +0000 (-0800) Subject: btrfs-progs: report I/O errors when closing the filesystem X-Git-Tag: upstream/4.16.1~727 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7fbb89d167ec2d8f3e7c0b46285778c1c481a742;p=platform%2Fupstream%2Fbtrfs-progs.git btrfs-progs: report I/O errors when closing the filesystem If the final fsync() on the Btrfs device fails, we just swallow the error and don't alert the user in any way. This was uncovered by xfstest generic/405, which checks that mkfs fails when it encounters EIO. Signed-off-by: Omar Sandoval Reviewed-by: Qu Wenruo Signed-off-by: David Sterba --- diff --git a/disk-io.c b/disk-io.c index be6e28a..985c4a9 100644 --- a/disk-io.c +++ b/disk-io.c @@ -1815,10 +1815,10 @@ int close_ctree_fs_info(struct btrfs_fs_info *fs_info) free_fs_roots_tree(&fs_info->fs_root_tree); btrfs_release_all_roots(fs_info); - btrfs_close_devices(fs_info->fs_devices); + ret = btrfs_close_devices(fs_info->fs_devices); btrfs_cleanup_all_caches(fs_info); btrfs_free_fs_info(fs_info); - return 0; + return ret; } int clean_tree_block(struct btrfs_trans_handle *trans, struct btrfs_root *root, diff --git a/volumes.c b/volumes.c index 59670c0..b350e25 100644 --- a/volumes.c +++ b/volumes.c @@ -160,6 +160,7 @@ int btrfs_close_devices(struct btrfs_fs_devices *fs_devices) { struct btrfs_fs_devices *seed_devices; struct btrfs_device *device; + int ret = 0; again: if (!fs_devices) @@ -168,7 +169,11 @@ again: device = list_entry(fs_devices->devices.next, struct btrfs_device, dev_list); if (device->fd != -1) { - fsync(device->fd); + if (fsync(device->fd) == -1) { + warning("fsync on device %llu failed: %s", + device->devid, strerror(errno)); + ret = -errno; + } if (posix_fadvise(device->fd, 0, 0, POSIX_FADV_DONTNEED)) fprintf(stderr, "Warning, could not drop caches\n"); close(device->fd); @@ -197,7 +202,7 @@ again: free(fs_devices); } - return 0; + return ret; } void btrfs_close_all_devices(void)