diff options
Diffstat (limited to 'fs/ubifs/super.c')
-rw-r--r-- | fs/ubifs/super.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 1c1bbe4135c6..2c91d6fa4e05 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
@@ -1074,6 +1074,30 @@ again: | |||
1074 | } | 1074 | } |
1075 | 1075 | ||
1076 | /** | 1076 | /** |
1077 | * check_free_space - check if there is enough free space to mount. | ||
1078 | * @c: UBIFS file-system description object | ||
1079 | * | ||
1080 | * This function makes sure UBIFS has enough free space to be mounted in | ||
1081 | * read/write mode. UBIFS must always have some free space to allow deletions. | ||
1082 | */ | ||
1083 | static int check_free_space(struct ubifs_info *c) | ||
1084 | { | ||
1085 | ubifs_assert(c->dark_wm > 0); | ||
1086 | if (c->lst.total_free + c->lst.total_dirty < c->dark_wm) { | ||
1087 | ubifs_err("insufficient free space to mount in read/write mode"); | ||
1088 | dbg_dump_budg(c); | ||
1089 | dbg_dump_lprops(c); | ||
1090 | /* | ||
1091 | * We return %-EINVAL instead of %-ENOSPC because it seems to | ||
1092 | * be the closest error code mentioned in the mount function | ||
1093 | * documentation. | ||
1094 | */ | ||
1095 | return -EINVAL; | ||
1096 | } | ||
1097 | return 0; | ||
1098 | } | ||
1099 | |||
1100 | /** | ||
1077 | * mount_ubifs - mount UBIFS file-system. | 1101 | * mount_ubifs - mount UBIFS file-system. |
1078 | * @c: UBIFS file-system description object | 1102 | * @c: UBIFS file-system description object |
1079 | * | 1103 | * |
@@ -1154,7 +1178,7 @@ static int mount_ubifs(struct ubifs_info *c) | |||
1154 | 1178 | ||
1155 | /* | 1179 | /* |
1156 | * Make sure the compressor which is set as default in the superblock | 1180 | * Make sure the compressor which is set as default in the superblock |
1157 | * or overriden by mount options is actually compiled in. | 1181 | * or overridden by mount options is actually compiled in. |
1158 | */ | 1182 | */ |
1159 | if (!ubifs_compr_present(c->default_compr)) { | 1183 | if (!ubifs_compr_present(c->default_compr)) { |
1160 | ubifs_err("'compressor \"%s\" is not compiled in", | 1184 | ubifs_err("'compressor \"%s\" is not compiled in", |
@@ -1236,12 +1260,9 @@ static int mount_ubifs(struct ubifs_info *c) | |||
1236 | if (!mounted_read_only) { | 1260 | if (!mounted_read_only) { |
1237 | int lnum; | 1261 | int lnum; |
1238 | 1262 | ||
1239 | /* Check for enough free space */ | 1263 | err = check_free_space(c); |
1240 | if (ubifs_calc_available(c, c->min_idx_lebs) <= 0) { | 1264 | if (err) |
1241 | ubifs_err("insufficient available space"); | ||
1242 | err = -EINVAL; | ||
1243 | goto out_orphans; | 1265 | goto out_orphans; |
1244 | } | ||
1245 | 1266 | ||
1246 | /* Check for enough log space */ | 1267 | /* Check for enough log space */ |
1247 | lnum = c->lhead_lnum + 1; | 1268 | lnum = c->lhead_lnum + 1; |
@@ -1442,12 +1463,9 @@ static int ubifs_remount_rw(struct ubifs_info *c) | |||
1442 | c->remounting_rw = 1; | 1463 | c->remounting_rw = 1; |
1443 | c->always_chk_crc = 1; | 1464 | c->always_chk_crc = 1; |
1444 | 1465 | ||
1445 | /* Check for enough free space */ | 1466 | err = check_free_space(c); |
1446 | if (ubifs_calc_available(c, c->min_idx_lebs) <= 0) { | 1467 | if (err) |
1447 | ubifs_err("insufficient available space"); | ||
1448 | err = -EINVAL; | ||
1449 | goto out; | 1468 | goto out; |
1450 | } | ||
1451 | 1469 | ||
1452 | if (c->old_leb_cnt != c->leb_cnt) { | 1470 | if (c->old_leb_cnt != c->leb_cnt) { |
1453 | struct ubifs_sb_node *sup; | 1471 | struct ubifs_sb_node *sup; |