kern/127951: kernel crash in fsck_ufs
Tor Egge
Tor.Egge at cvsup.no.freebsd.org
Thu Oct 9 22:40:04 UTC 2008
The following reply was made to PR kern/127951; it has been noted by GNATS.
From: Tor Egge <Tor.Egge at cvsup.no.freebsd.org>
To: dirk.meyer at dinoex.sub.org
Cc: FreeBSD-gnats-submit at freebsd.org, kib at freebsd.org, jhb at freebsd.org
Subject: Re: kern/127951: kernel crash in fsck_ufs
Date: Thu, 09 Oct 2008 22:04:50 +0000 (UTC)
----Next_Part(Thu_Oct__9_22_04_50_2008_475)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
check_maps() in /usr/src/sbin/fsck_ffs/pass5.c seems to be limited to file
systems less than 1 TB, due to using 32-bits integers for file system block
numbers.
This also causes incorrect error reporting for foreground fsck.
- Tor Egge
----Next_Part(Thu_Oct__9_22_04_50_2008_475)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename=fsckdiff
Index: pass5.c
===================================================================
RCS file: /home/ncvs/src/sbin/fsck_ffs/pass5.c,v
retrieving revision 1.43
diff -u -r1.43 pass5.c
--- pass5.c 31 Oct 2006 22:06:56 -0000 1.43
+++ pass5.c 9 Oct 2008 21:56:51 -0000
@@ -48,7 +48,7 @@
#include "fsck.h"
-static void check_maps(u_char *, u_char *, int, int, const char *, int *, int, int);
+static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *, int *, int, int);
void
pass5(void)
@@ -321,13 +321,17 @@
}
if (excessdirs > 0)
check_maps(cg_inosused(newcg), cg_inosused(cg),
- inomapsize, cg->cg_cgx * fs->fs_ipg, "DIR",
+ inomapsize,
+ cg->cg_cgx * (ufs2_daddr_t) fs->fs_ipg,
+ "DIR",
freedirs, 0, excessdirs);
check_maps(cg_inosused(newcg), cg_inosused(cg),
- inomapsize, cg->cg_cgx * fs->fs_ipg, "FILE",
+ inomapsize,
+ cg->cg_cgx * (ufs2_daddr_t) fs->fs_ipg, "FILE",
freefiles, excessdirs, fs->fs_ipg);
check_maps(cg_blksfree(cg), cg_blksfree(newcg),
- blkmapsize, cg->cg_cgx * fs->fs_fpg, "FRAG",
+ blkmapsize,
+ cg->cg_cgx * (ufs2_daddr_t) fs->fs_fpg, "FRAG",
freeblks, 0, fs->fs_fpg);
}
if (cursnapshot == 0 &&
@@ -407,7 +411,7 @@
u_char *map1, /* map of claimed allocations */
u_char *map2, /* map of determined allocations */
int mapsize, /* size of above two maps */
- int startvalue, /* resource value for first element in map */
+ ufs2_daddr_t startvalue, /* resource value for first element in map */
const char *name, /* name of resource found in maps */
int *opcode, /* sysctl opcode to free resource */
int skip, /* number of entries to skip before starting to free */
@@ -415,8 +419,8 @@
{
# define BUFSIZE 16
char buf[BUFSIZE];
- long i, j, k, l, m, n, size;
- int astart, aend, ustart, uend;
+ long i, j, k, l, m, size;
+ ufs2_daddr_t n, astart, aend, ustart, uend;
void (*msg)(const char *fmt, ...);
if (bkgrdflag)
@@ -443,10 +447,12 @@
continue;
}
if (astart == aend)
- (*msg)("ALLOCATED %s %d MARKED FREE\n",
+ (*msg)("ALLOCATED %s %" PRId64
+ " MARKED FREE\n",
name, astart);
else
- (*msg)("%s %sS %d-%d MARKED FREE\n",
+ (*msg)("%s %sS %" PRId64 "-%" PRId64
+ " MARKED FREE\n",
"ALLOCATED", name, astart, aend);
astart = aend = n;
} else {
@@ -472,10 +478,12 @@
if (size > limit)
size = limit;
if (debug && size == 1)
- pwarn("%s %s %d MARKED USED\n",
+ pwarn("%s %s %" PRId64
+ " MARKED USED\n",
"UNALLOCATED", name, ustart);
else if (debug)
- pwarn("%s %sS %d-%ld MARKED USED\n",
+ pwarn("%s %sS %" PRId64 "-%" PRId64
+ " MARKED USED\n",
"UNALLOCATED", name, ustart,
ustart + size - 1);
if (bkgrdflag != 0) {
@@ -497,9 +505,11 @@
}
if (astart != -1) {
if (astart == aend)
- (*msg)("ALLOCATED %s %d MARKED FREE\n", name, astart);
+ (*msg)("ALLOCATED %s %" PRId64
+ " MARKED FREE\n", name, astart);
else
- (*msg)("ALLOCATED %sS %d-%d MARKED FREE\n",
+ (*msg)("ALLOCATED %sS %" PRId64 "-%" PRId64
+ " MARKED FREE\n",
name, astart, aend);
}
if (ustart != -1) {
@@ -514,10 +524,12 @@
size = limit;
if (debug) {
if (size == 1)
- pwarn("UNALLOCATED %s %d MARKED USED\n",
+ pwarn("UNALLOCATED %s %" PRId64
+ " MARKED USED\n",
name, ustart);
else
- pwarn("UNALLOCATED %sS %d-%ld MARKED USED\n",
+ pwarn("UNALLOCATED %sS %" PRId64 "-%" PRId64
+ " MARKED USED\n",
name, ustart, ustart + size - 1);
}
if (bkgrdflag != 0) {
----Next_Part(Thu_Oct__9_22_04_50_2008_475)----
More information about the freebsd-bugs
mailing list