Whamcloud - gitweb
e2fsck: skip clearing bad extents if bitmaps are unreadable
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 18 Jul 2014 22:53:04 +0000 (15:53 -0700)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 22 Jul 2014 17:57:28 +0000 (13:57 -0400)
If the bitmaps are known to be unreadable, don't bother clearing them;
just mark fsck to restart itself after pass 5, by which time the
bitmaps should be fixed.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
e2fsck/pass1.c

index 9ef724a..e714b0f 100644 (file)
@@ -1816,6 +1816,26 @@ report_problem:
                        pctx->num = extent.e_len;
                        pctx->blkcount = extent.e_lblk + extent.e_len;
                        if (fix_problem(ctx, problem, pctx)) {
+                               if (ctx->invalid_bitmaps) {
+                                       /*
+                                        * If fsck knows the bitmaps are bad,
+                                        * skip to the next extent and
+                                        * try to clear this extent again
+                                        * after fixing the bitmaps, by
+                                        * restarting fsck.
+                                        */
+                                       pctx->errcode = ext2fs_extent_get(
+                                                         ehandle,
+                                                         EXT2_EXTENT_NEXT_SIB,
+                                                         &extent);
+                                       ctx->flags |= E2F_FLAG_RESTART_LATER;
+                                       if (pctx->errcode ==
+                                                   EXT2_ET_NO_CURRENT_NODE) {
+                                               pctx->errcode = 0;
+                                               break;
+                                       }
+                                       continue;
+                               }
                                e2fsck_read_bitmaps(ctx);
                                pctx->errcode =
                                        ext2fs_extent_delete(ehandle, 0);