diff options
Diffstat (limited to 'fs/sync.c')
-rw-r--r-- | fs/sync.c | 19 |
1 files changed, 9 insertions, 10 deletions
@@ -73,12 +73,6 @@ static void sync_inodes_one_sb(struct super_block *sb, void *arg) | |||
73 | sync_inodes_sb(sb); | 73 | sync_inodes_sb(sb); |
74 | } | 74 | } |
75 | 75 | ||
76 | static void writeback_inodes_one_sb(struct super_block *sb, void *arg) | ||
77 | { | ||
78 | if (!(sb->s_flags & MS_RDONLY)) | ||
79 | writeback_inodes_sb(sb, WB_REASON_SYNC); | ||
80 | } | ||
81 | |||
82 | static void sync_fs_one_sb(struct super_block *sb, void *arg) | 76 | static void sync_fs_one_sb(struct super_block *sb, void *arg) |
83 | { | 77 | { |
84 | if (!(sb->s_flags & MS_RDONLY) && sb->s_op->sync_fs) | 78 | if (!(sb->s_flags & MS_RDONLY) && sb->s_op->sync_fs) |
@@ -96,17 +90,22 @@ static void fdatawait_one_bdev(struct block_device *bdev, void *arg) | |||
96 | } | 90 | } |
97 | 91 | ||
98 | /* | 92 | /* |
99 | * sync everything. Start out by waking pdflush, because that writes back | 93 | * Sync everything. We start by waking flusher threads so that most of |
100 | * all queues in parallel. | 94 | * writeback runs on all devices in parallel. Then we sync all inodes reliably |
95 | * which effectively also waits for all flusher threads to finish doing | ||
96 | * writeback. At this point all data is on disk so metadata should be stable | ||
97 | * and we tell filesystems to sync their metadata via ->sync_fs() calls. | ||
98 | * Finally, we writeout all block devices because some filesystems (e.g. ext2) | ||
99 | * just write metadata (such as inodes or bitmaps) to block device page cache | ||
100 | * and do not sync it on their own in ->sync_fs(). | ||
101 | */ | 101 | */ |
102 | SYSCALL_DEFINE0(sync) | 102 | SYSCALL_DEFINE0(sync) |
103 | { | 103 | { |
104 | int nowait = 0, wait = 1; | 104 | int nowait = 0, wait = 1; |
105 | 105 | ||
106 | wakeup_flusher_threads(0, WB_REASON_SYNC); | 106 | wakeup_flusher_threads(0, WB_REASON_SYNC); |
107 | iterate_supers(writeback_inodes_one_sb, NULL); | ||
108 | iterate_supers(sync_fs_one_sb, &nowait); | ||
109 | iterate_supers(sync_inodes_one_sb, NULL); | 107 | iterate_supers(sync_inodes_one_sb, NULL); |
108 | iterate_supers(sync_fs_one_sb, &nowait); | ||
110 | iterate_supers(sync_fs_one_sb, &wait); | 109 | iterate_supers(sync_fs_one_sb, &wait); |
111 | iterate_bdevs(fdatawrite_one_bdev, NULL); | 110 | iterate_bdevs(fdatawrite_one_bdev, NULL); |
112 | iterate_bdevs(fdatawait_one_bdev, NULL); | 111 | iterate_bdevs(fdatawait_one_bdev, NULL); |