summaryrefslogtreecommitdiff
path: root/disk-io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@fusionio.com>2013-02-01 10:44:22 -0500
committerChris Mason <chris.mason@fusionio.com>2013-02-01 10:51:10 -0500
commit8fe354744cd7b5c4f7a3314dcdbb5095192a032f (patch)
treecb575c48dd3b332b5ec8e36688c60cb23d3e05c7 /disk-io.c
parent6cd836d7d95ae61edfca2406f48eeca47b8cfd81 (diff)
Clear caches when opening and closing devices
This should fix problems with cache aliases in the kernel
Diffstat (limited to 'disk-io.c')
-rw-r--r--disk-io.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/disk-io.c b/disk-io.c
index c4d4631d..f00fe4e7 100644
--- a/disk-io.c
+++ b/disk-io.c
@@ -641,6 +641,9 @@ static struct btrfs_fs_info *__open_ctree_fd(int fp, const char *path,
if (sb_bytenr == 0)
sb_bytenr = BTRFS_SUPER_INFO_OFFSET;
+ /* try to drop all the caches */
+ posix_fadvise(fp, 0, 0, POSIX_FADV_DONTNEED);
+
ret = btrfs_scan_one_device(fp, path, &fs_devices,
&total_devs, sb_bytenr);
@@ -1091,6 +1094,10 @@ static int close_all_devices(struct btrfs_fs_info *fs_info)
list = &fs_info->fs_devices->devices;
list_for_each(next, list) {
device = list_entry(next, struct btrfs_device, dev_list);
+ if (device->fd) {
+ fsync(device->fd);
+ posix_fadvise(device->fd, 0, 0, POSIX_FADV_DONTNEED);
+ }
close(device->fd);
}
return 0;