diff options
Diffstat (limited to 'fs/ubifs')
-rw-r--r-- | fs/ubifs/super.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index a14703e0a9ad..1c1bbe4135c6 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
@@ -1570,20 +1570,24 @@ out: | |||
1570 | * @c: UBIFS file-system description object | 1570 | * @c: UBIFS file-system description object |
1571 | * | 1571 | * |
1572 | * This function is called during un-mounting and re-mounting, and it commits | 1572 | * This function is called during un-mounting and re-mounting, and it commits |
1573 | * the journal unless the "fast unmount" mode is enabled. It also avoids | 1573 | * the journal unless the "fast unmount" mode is enabled. |
1574 | * committing the journal if it contains too few data. | ||
1575 | */ | 1574 | */ |
1576 | static void commit_on_unmount(struct ubifs_info *c) | 1575 | static void commit_on_unmount(struct ubifs_info *c) |
1577 | { | 1576 | { |
1578 | if (!c->fast_unmount) { | 1577 | struct super_block *sb = c->vfs_sb; |
1579 | long long bud_bytes; | 1578 | long long bud_bytes; |
1580 | 1579 | ||
1581 | spin_lock(&c->buds_lock); | 1580 | /* |
1582 | bud_bytes = c->bud_bytes; | 1581 | * This function is called before the background thread is stopped, so |
1583 | spin_unlock(&c->buds_lock); | 1582 | * we may race with ongoing commit, which means we have to take |
1584 | if (bud_bytes > c->leb_size) | 1583 | * @c->bud_lock to access @c->bud_bytes. |
1585 | ubifs_run_commit(c); | 1584 | */ |
1586 | } | 1585 | spin_lock(&c->buds_lock); |
1586 | bud_bytes = c->bud_bytes; | ||
1587 | spin_unlock(&c->buds_lock); | ||
1588 | |||
1589 | if (!c->fast_unmount && !(sb->s_flags & MS_RDONLY) && bud_bytes) | ||
1590 | ubifs_run_commit(c); | ||
1587 | } | 1591 | } |
1588 | 1592 | ||
1589 | /** | 1593 | /** |
@@ -2009,7 +2013,7 @@ static void ubifs_kill_sb(struct super_block *sb) | |||
2009 | * We do 'commit_on_unmount()' here instead of 'ubifs_put_super()' | 2013 | * We do 'commit_on_unmount()' here instead of 'ubifs_put_super()' |
2010 | * in order to be outside BKL. | 2014 | * in order to be outside BKL. |
2011 | */ | 2015 | */ |
2012 | if (sb->s_root && !(sb->s_flags & MS_RDONLY)) | 2016 | if (sb->s_root) |
2013 | commit_on_unmount(c); | 2017 | commit_on_unmount(c); |
2014 | /* The un-mount routine is actually done in put_super() */ | 2018 | /* The un-mount routine is actually done in put_super() */ |
2015 | generic_shutdown_super(sb); | 2019 | generic_shutdown_super(sb); |