| From: Richard Weinberger <richard@nod.at> |
| Date: Wed, 17 Jan 2018 19:12:42 +0100 |
| Subject: ubifs: Check ubifs_wbuf_sync() return code |
| |
| commit aac17948a7ce01fb60b9ee6cf902967a47b3ce26 upstream. |
| |
| If ubifs_wbuf_sync() fails we must not write a master node with the |
| dirty marker cleared. |
| Otherwise it is possible that in case of an IO error while syncing we |
| mark the filesystem as clean and UBIFS refuses to recover upon next |
| mount. |
| |
| Fixes: 1e51764a3c2a ("UBIFS: add new flash file system") |
| Signed-off-by: Richard Weinberger <richard@nod.at> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| fs/ubifs/super.c | 14 ++++++++++---- |
| 1 file changed, 10 insertions(+), 4 deletions(-) |
| |
| --- a/fs/ubifs/super.c |
| +++ b/fs/ubifs/super.c |
| @@ -1726,8 +1726,11 @@ static void ubifs_remount_ro(struct ubif |
| |
| dbg_save_space_info(c); |
| |
| - for (i = 0; i < c->jhead_cnt; i++) |
| - ubifs_wbuf_sync(&c->jheads[i].wbuf); |
| + for (i = 0; i < c->jhead_cnt; i++) { |
| + err = ubifs_wbuf_sync(&c->jheads[i].wbuf); |
| + if (err) |
| + ubifs_ro_mode(c, err); |
| + } |
| |
| c->mst_node->flags &= ~cpu_to_le32(UBIFS_MST_DIRTY); |
| c->mst_node->flags |= cpu_to_le32(UBIFS_MST_NO_ORPHS); |
| @@ -1794,8 +1797,11 @@ static void ubifs_put_super(struct super |
| int err; |
| |
| /* Synchronize write-buffers */ |
| - for (i = 0; i < c->jhead_cnt; i++) |
| - ubifs_wbuf_sync(&c->jheads[i].wbuf); |
| + for (i = 0; i < c->jhead_cnt; i++) { |
| + err = ubifs_wbuf_sync(&c->jheads[i].wbuf); |
| + if (err) |
| + ubifs_ro_mode(c, err); |
| + } |
| |
| /* |
| * We are being cleanly unmounted which means the |