ubifs: read-only if LEB may always be taken in ubifs_garbage_collect
authorBaokun Li <libaokun1@huawei.com>
Mon, 15 Nov 2021 01:31:44 +0000 (09:31 +0800)
committerRichard Weinberger <richard@nod.at>
Thu, 23 Dec 2021 21:30:38 +0000 (22:30 +0100)
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 <libaokun1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
fs/ubifs/gc.c

index 1f74a12..3134d07 100644 (file)
@@ -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;