|
@@ -1671,14 +1671,25 @@ static int ubifs_remount_rw(struct ubifs_info *c)
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
|
+ dbg_gen("re-mounted read-write");
|
|
|
+ c->remounting_rw = 0;
|
|
|
+
|
|
|
if (c->need_recovery) {
|
|
|
c->need_recovery = 0;
|
|
|
ubifs_msg("deferred recovery completed");
|
|
|
+ } else {
|
|
|
+ /*
|
|
|
+ * Do not run the debugging space check if the were doing
|
|
|
+ * recovery, because when we saved the information we had the
|
|
|
+ * file-system in a state where the TNC and lprops has been
|
|
|
+ * modified in memory, but all the I/O operations (including a
|
|
|
+ * commit) were deferred. So the file-system was in
|
|
|
+ * "non-committed" state. Now the file-system is in committed
|
|
|
+ * state, and of course the amount of free space will change
|
|
|
+ * because, for example, the old index size was imprecise.
|
|
|
+ */
|
|
|
+ err = dbg_check_space_info(c);
|
|
|
}
|
|
|
-
|
|
|
- dbg_gen("re-mounted read-write");
|
|
|
- c->remounting_rw = 0;
|
|
|
- err = dbg_check_space_info(c);
|
|
|
mutex_unlock(&c->umount_mutex);
|
|
|
return err;
|
|
|
|
|
@@ -1761,10 +1772,12 @@ static void ubifs_put_super(struct super_block *sb)
|
|
|
* of the media. For example, there will be dirty inodes if we failed
|
|
|
* to write them back because of I/O errors.
|
|
|
*/
|
|
|
- ubifs_assert(atomic_long_read(&c->dirty_pg_cnt) == 0);
|
|
|
- ubifs_assert(c->budg_idx_growth == 0);
|
|
|
- ubifs_assert(c->budg_dd_growth == 0);
|
|
|
- ubifs_assert(c->budg_data_growth == 0);
|
|
|
+ if (!c->ro_error) {
|
|
|
+ ubifs_assert(atomic_long_read(&c->dirty_pg_cnt) == 0);
|
|
|
+ ubifs_assert(c->budg_idx_growth == 0);
|
|
|
+ ubifs_assert(c->budg_dd_growth == 0);
|
|
|
+ ubifs_assert(c->budg_data_growth == 0);
|
|
|
+ }
|
|
|
|
|
|
/*
|
|
|
* The 'c->umount_lock' prevents races between UBIFS memory shrinker
|