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 <libaokun1@huawei.com> Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
0d76502172
commit
50cb437325
|
@ -756,8 +756,17 @@ int ubifs_garbage_collect(struct ubifs_info *c, int anyway)
|
||||||
* caller instead of the original '-EAGAIN'.
|
* caller instead of the original '-EAGAIN'.
|
||||||
*/
|
*/
|
||||||
err = ubifs_return_leb(c, lp.lnum);
|
err = ubifs_return_leb(c, lp.lnum);
|
||||||
if (err)
|
if (err) {
|
||||||
ret = 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 */
|
/* Maybe double return LEB if goto out */
|
||||||
lp.lnum = -1;
|
lp.lnum = -1;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue