On 24 Sep, sam wrote:
> hi, all
> http://lists.freebsd.org/pipermail/freebsd-questions/2007-June/151686.html
> 
> my problem
> # fsck /dev/aacd0s1f
> ** /dev/aacd0s1f (NO WRITE)
> ** Last Mounted on /usr
> ** Phase 1 - Check Blocks and Sizes
> fsck_ufs: cannot alloc 2378019004 bytes for inoinfo

I'd be willing to bet that one of the cylinder group blocks in your file
system got corrupted.
 
> any solutions ?

The patch below should allow a manual fsck to run to completion. I'd
recommend running "fsck -N" and capturing its output.  Then use the clri
command (either standalone or in fsdb) to zero out the uninitialized
inodes that are unmasked by setting cg_initediblk to its maximum
possible value based on the file system parameters.

Expect major file system lossage ...

I think this patch could be better, but this should get you going ...

Index: sbin/fsck_ffs/pass1.c
===================================================================
RCS file: /home/ncvs/src/sbin/fsck_ffs/pass1.c,v
retrieving revision 1.43
diff -u -r1.43 pass1.c
--- sbin/fsck_ffs/pass1.c       8 Oct 2004 20:44:47 -0000       1.43
+++ sbin/fsck_ffs/pass1.c       24 Sep 2007 23:15:22 -0000
@@ -93,9 +93,29 @@
                inumber = c * sblock.fs_ipg;
                setinodebuf(inumber);
                getblk(&cgblk, cgtod(&sblock, c), sblock.fs_cgsize);
-               if (sblock.fs_magic == FS_UFS2_MAGIC)
+               if (sblock.fs_magic == FS_UFS2_MAGIC) {
                        inosused = cgrp.cg_initediblk;
-               else
+                        if (inosused < 0 || inosused > sblock.fs_ipg) {
+                               pfatal("CG %d: PREPOSTEROUS NUMBER OF INODES %d 
(cg_initediblk), ASSUMING %d (fs_ipg)\n",
+                                   c, inosused, sblock.fs_ipg);
+                               /*
+                                * The cylinder group block is most likely
+                                * totally corrupted and will probably
+                                * fail the magic number check below as well.
+                                * Ignoring cg_initediblk and setting
+                                * inosused to sblock.fs_ipg will allow
+                                * a manual fsck to proceed further instead
+                                * of dying when it attempts to allocate
+                                * an insane amount of memory to store
+                                * the inode info for this cylinder group.
+                                * This may provide enough information
+                                * to allow the system administrator to
+                                * do a better job of patching the
+                                * filesystem with fsdb.
+                                */
+                               inosused = sblock.fs_ipg;
+                       }
+               } else
                        inosused = sblock.fs_ipg;
                if (got_siginfo) {
                        printf("%s: phase 1: cyl group %d of %d (%d%%)\n",

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to