summaryrefslogtreecommitdiff
path: root/volumes.c
diff options
context:
space:
mode:
authorjames harvey <jamespharvey20@gmail.com>2018-06-06 02:30:41 -0400
committerDavid Sterba <dsterba@suse.com>2018-08-06 15:03:33 +0200
commit7c5a355b747215f05a2b94d7efad3ea3c0218763 (patch)
tree166b525df073b1f09ed50473ea764ed67be41ba7 /volumes.c
parentef00e4264c6d113e4ba2d377520ff61d5775be39 (diff)
btrfs-progs: btrfs_close_devices: only fsync if device->writeable is set
Prevent unnecessary error from failing fsync(), if opened read only. Performed 'grep "writeable = " *.h *.c' to make sure there were no odd situations where fsync() might still be desired here. They're all straight- forward. The only situation where writeable will be 0 is if btrfs_open_devices is given flags without O_RDWR. There is no situation where a writeable volume temporarily becomes unwriteable, or anything like that. Given that it's being opened O_RDWR, there's no reason to attempt fsync(). utils.c int btrfs_add_to_fsid() { ... device->writeable = 1; volumes.c int btrfs_close_devices() { ... while (!list_empty(&fs_devices->devices)) { ... // just after the fsync() being patched 267: device->writeable = 0; ... int btrfs_open_devices() { ... list_for_each_entry(device, &fs_devices->devices, dev_list) { ... if (flags & O_RDWR) 332: device->writeable = 1 kernel btrfs_close_devices() does not have a corresponding fsync() that I see. Signed-off-by: James Harvey <jamespharvey20@gmail.com> Signed-off-by: David Sterba <dsterba@suse.com>
Diffstat (limited to 'volumes.c')
-rw-r--r--volumes.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/volumes.c b/volumes.c
index 21a1fc3..d81b348 100644
--- a/volumes.c
+++ b/volumes.c
@@ -254,7 +254,7 @@ again:
device = list_entry(fs_devices->devices.next,
struct btrfs_device, dev_list);
if (device->fd != -1) {
- if (fsync(device->fd) == -1) {
+ if (device->writeable && fsync(device->fd) == -1) {
warning("fsync on device %llu failed: %m",
device->devid);
ret = -errno;