summaryrefslogtreecommitdiffstats
path: root/fs/ubifs/super.c
diff options
context:
space:
mode:
authorArtem Bityutskiy2008-12-28 07:04:17 +0100
committerArtem Bityutskiy2008-12-31 13:13:24 +0100
commit304d427cd99eb645b44b08d77e70ce308e6bcd8c (patch)
tree257a12f1b04d6fad8e40ccd1f9bd712e109c8cf8 /fs/ubifs/super.c
parentUBIFS: fix constants initialization (diff)
downloadkernel-qcow2-linux-304d427cd99eb645b44b08d77e70ce308e6bcd8c.tar.gz
kernel-qcow2-linux-304d427cd99eb645b44b08d77e70ce308e6bcd8c.tar.xz
kernel-qcow2-linux-304d427cd99eb645b44b08d77e70ce308e6bcd8c.zip
UBIFS: fix file-system synchronization
Argh. The ->sync_fs call is called _before_ all inodes are flushed. This means we first sync write buffers and commit, then all inodes are synced, and we end up with unflushed write buffers! Fix this by forcing synching all indoes from 'ubifs_sync_fs()'. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'fs/ubifs/super.c')
-rw-r--r--fs/ubifs/super.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c
index 13097830e8bc..471301799c52 100644
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -35,6 +35,7 @@
#include <linux/seq_file.h>
#include <linux/mount.h>
#include <linux/math64.h>
+#include <linux/writeback.h>
#include "ubifs.h"
/*
@@ -431,6 +432,23 @@ static int ubifs_sync_fs(struct super_block *sb, int wait)
struct ubifs_info *c = sb->s_fs_info;
int i, ret = 0, err;
long long bud_bytes;
+ struct writeback_control wbc = {
+ .sync_mode = wait ? WB_SYNC_ALL : WB_SYNC_HOLD,
+ .range_start = 0,
+ .range_end = LLONG_MAX,
+ .nr_to_write = LONG_MAX,
+ };
+
+ /*
+ * VFS calls '->sync_fs()' before synchronizing all dirty inodes and
+ * pages, so synchronize them first, then commit the journal. Strictly
+ * speaking, it is not necessary to commit the journal here,
+ * synchronizing write-buffers would be enough. But committing makes
+ * UBIFS free space predictions much more accurate, so we want to let
+ * the user be able to get more accurate results of 'statfs()' after
+ * they synchronize the file system.
+ */
+ generic_sync_sb_inodes(sb, &wbc);
if (c->jheads) {
for (i = 0; i < c->jhead_cnt; i++) {