From 50cb4373254433ad015dd50a061194c693b37c16 Mon Sep 17 00:00:00 2001 From: Baokun Li Date: Mon, 15 Nov 2021 09:31:44 +0800 Subject: [PATCH] ubifs: read-only if LEB may always be taken in ubifs_garbage_collect If ubifs_garbage_collect_leb() returns -EAGAIN and ubifs_return_leb returns error, a LEB will always has a "taken" flag. In this case, set the ubifs to read-only to prevent a worse situation. Signed-off-by: Baokun Li Signed-off-by: Richard Weinberger --- fs/ubifs/gc.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fs/ubifs/gc.c b/fs/ubifs/gc.c index 1f74a127fe3a..3134d070fcc0 100644 --- a/fs/ubifs/gc.c +++ b/fs/ubifs/gc.c @@ -756,8 +756,17 @@ int ubifs_garbage_collect(struct ubifs_info *c, int anyway) * caller instead of the original '-EAGAIN'. */ err = ubifs_return_leb(c, lp.lnum); - if (err) + if (err) { ret = err; + /* + * An LEB may always be "taken", + * so setting ubifs to read-only, + * and then executing sync wbuf will + * return -EROFS and enter the "out" + * error branch. + */ + ubifs_ro_mode(c, ret); + } /* Maybe double return LEB if goto out */ lp.lnum = -1; break;