UBIFS: remount ro fixes
authorAdrian Hunter <ext-adrian.hunter@nokia.com>
Thu, 29 Jan 2009 10:59:33 +0000 (12:59 +0200)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Thu, 29 Jan 2009 14:19:36 +0000 (16:19 +0200)
- preserve the idx_gc list - it will be needed in the same
state, should UBIFS be remounted rw again
- prevent remounting ro if we have switched to read only
mode (due to a fatal error)

Signed-off-by: Adrian Hunter <ext-adrian.hunter@nokia.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
fs/ubifs/gc.c
fs/ubifs/super.c
fs/ubifs/ubifs.h

index bad3339a800d6aad2762818c284301f464800ffb..a711d33b3d3e1434f27dc763983200886155e9fd 100644 (file)
@@ -830,29 +830,21 @@ out:
  * ubifs_destroy_idx_gc - destroy idx_gc list.
  * @c: UBIFS file-system description object
  *
- * This function destroys the @c->idx_gc list. It is called when unmounting or
- * remounting read-only so locks are not needed. Returns zero in case of
- * success and a negative error code in case of failure.
+ * This function destroys the @c->idx_gc list. It is called when unmounting
+ * so locks are not needed. Returns zero in case of success and a negative
+ * error code in case of failure.
  */
-int ubifs_destroy_idx_gc(struct ubifs_info *c)
+void ubifs_destroy_idx_gc(struct ubifs_info *c)
 {
-       int ret = 0;
-
        while (!list_empty(&c->idx_gc)) {
-               int err;
                struct ubifs_gced_idx_leb *idx_gc;
 
                idx_gc = list_entry(c->idx_gc.next, struct ubifs_gced_idx_leb,
                                    list);
-               err = ubifs_change_one_lp(c, idx_gc->lnum, LPROPS_NC,
-                                         LPROPS_NC, 0, LPROPS_TAKEN, -1);
-               if (err && !ret)
-                       ret = err;
+               c->idx_gc_cnt -= 1;
                list_del(&idx_gc->list);
                kfree(idx_gc);
        }
-
-       return ret;
 }
 
 /**
index 3ddd754262b4f14b743eafaa358f8a4b8e1a1b1d..daa679d3a03efdf1d8d3be3ec0756e95f1a53d4e 100644 (file)
@@ -1687,10 +1687,6 @@ static void ubifs_remount_ro(struct ubifs_info *c)
        if (err)
                ubifs_ro_mode(c, err);
 
-       err = ubifs_destroy_idx_gc(c);
-       if (err)
-               ubifs_ro_mode(c, err);
-
        free_wbufs(c);
        vfree(c->orph_buf);
        c->orph_buf = NULL;
@@ -1793,15 +1789,19 @@ static int ubifs_remount_fs(struct super_block *sb, int *flags, char *data)
 
        if ((sb->s_flags & MS_RDONLY) && !(*flags & MS_RDONLY)) {
                if (c->ro_media) {
-                       ubifs_msg("cannot re-mount R/W, UBIFS is working in "
-                                 "R/O mode");
+                       ubifs_msg("cannot re-mount due to prior errors");
                        return -EINVAL;
                }
                err = ubifs_remount_rw(c);
                if (err)
                        return err;
-       } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY))
+       } else if (!(sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY)) {
+               if (c->ro_media) {
+                       ubifs_msg("cannot re-mount due to prior errors");
+                       return -EINVAL;
+               }
                ubifs_remount_ro(c);
+       }
 
        if (c->bulk_read == 1)
                bu_init(c);
index 29dfa816077b8476748edf70f7cb94df19b8c0ec..535f87426791f8691cf792e118bcda06df4ba035 100644 (file)
@@ -1594,7 +1594,7 @@ int ubifs_replay_journal(struct ubifs_info *c);
 int ubifs_garbage_collect(struct ubifs_info *c, int anyway);
 int ubifs_gc_start_commit(struct ubifs_info *c);
 int ubifs_gc_end_commit(struct ubifs_info *c);
-int ubifs_destroy_idx_gc(struct ubifs_info *c);
+void ubifs_destroy_idx_gc(struct ubifs_info *c);
 int ubifs_get_idx_gc_leb(struct ubifs_info *c);
 int ubifs_garbage_collect_leb(struct ubifs_info *c, struct ubifs_lprops *lp);