diff options
| author | Ben Gardiner <bengardiner@nanometrics.ca> | 2011-05-30 14:56:16 -0400 |
|---|---|---|
| committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-06-03 11:12:31 -0400 |
| commit | 098011940a2549ae7182db4bf101c3e3d2b4e6df (patch) | |
| tree | 2c4c1e51beee85fba008a81598a58efffa1443d0 | |
| parent | 781c5717a95a74b294beb38b8276943b0f8b5bb4 (diff) | |
UBIFS: fix-up free space earlier
The free space fixup is currently initiated during mount after the call to
ubifs_write_master() which results in a write to PEBs; this has been observed
with the patch 'assert no fixup when writing a node' applied:
Move the free space fixup on mount to before the calls to
ubifs_recover_inl_heads() and ubifs_write_master(). This results in no
assertions with the previously mentioned patch applied.
Artem: tweaked the patch a bit
Signed-off-by: Ben Gardiner <bengardiner@nanometrics>
Reviewed-by: Matthew L. Creech <mlcreech@gmail.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
| -rw-r--r-- | fs/ubifs/super.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index 6d357fd9c289..b5aeb5a8ebed 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
| @@ -1282,13 +1282,13 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1282 | if (err) | 1282 | if (err) |
| 1283 | goto out_master; | 1283 | goto out_master; |
| 1284 | 1284 | ||
| 1285 | init_constants_master(c); | ||
| 1286 | |||
| 1285 | if ((c->mst_node->flags & cpu_to_le32(UBIFS_MST_DIRTY)) != 0) { | 1287 | if ((c->mst_node->flags & cpu_to_le32(UBIFS_MST_DIRTY)) != 0) { |
| 1286 | ubifs_msg("recovery needed"); | 1288 | ubifs_msg("recovery needed"); |
| 1287 | c->need_recovery = 1; | 1289 | c->need_recovery = 1; |
| 1288 | } | 1290 | } |
| 1289 | 1291 | ||
| 1290 | init_constants_master(c); | ||
| 1291 | |||
| 1292 | if (c->need_recovery && !c->ro_mount) { | 1292 | if (c->need_recovery && !c->ro_mount) { |
| 1293 | err = ubifs_recover_inl_heads(c, c->sbuf); | 1293 | err = ubifs_recover_inl_heads(c, c->sbuf); |
| 1294 | if (err) | 1294 | if (err) |
| @@ -1299,6 +1299,12 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1299 | if (err) | 1299 | if (err) |
| 1300 | goto out_master; | 1300 | goto out_master; |
| 1301 | 1301 | ||
| 1302 | if (!c->ro_mount && c->space_fixup) { | ||
| 1303 | err = ubifs_fixup_free_space(c); | ||
| 1304 | if (err) | ||
| 1305 | goto out_master; | ||
| 1306 | } | ||
| 1307 | |||
| 1302 | if (!c->ro_mount) { | 1308 | if (!c->ro_mount) { |
| 1303 | /* | 1309 | /* |
| 1304 | * Set the "dirty" flag so that if we reboot uncleanly we | 1310 | * Set the "dirty" flag so that if we reboot uncleanly we |
| @@ -1402,12 +1408,6 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1402 | } else | 1408 | } else |
| 1403 | ubifs_assert(c->lst.taken_empty_lebs > 0); | 1409 | ubifs_assert(c->lst.taken_empty_lebs > 0); |
| 1404 | 1410 | ||
| 1405 | if (!c->ro_mount && c->space_fixup) { | ||
| 1406 | err = ubifs_fixup_free_space(c); | ||
| 1407 | if (err) | ||
| 1408 | goto out_infos; | ||
| 1409 | } | ||
| 1410 | |||
| 1411 | err = dbg_check_filesystem(c); | 1411 | err = dbg_check_filesystem(c); |
| 1412 | if (err) | 1412 | if (err) |
| 1413 | goto out_infos; | 1413 | goto out_infos; |
