From owner-svn-src-all@FreeBSD.ORG Fri Jul 15 15:43:41 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 2B0DD1065673; Fri, 15 Jul 2011 15:43:41 +0000 (UTC) (envelope-from mckusick@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 105778FC08; Fri, 15 Jul 2011 15:43:41 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p6FFheDd085746; Fri, 15 Jul 2011 15:43:40 GMT (envelope-from mckusick@svn.freebsd.org) Received: (from mckusick@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p6FFhejK085743; Fri, 15 Jul 2011 15:43:40 GMT (envelope-from mckusick@svn.freebsd.org) Message-Id: <201107151543.p6FFhejK085743@svn.freebsd.org> From: Kirk McKusick Date: Fri, 15 Jul 2011 15:43:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r224059 - head/sbin/fsck_ffs X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 15 Jul 2011 15:43:41 -0000 Author: mckusick Date: Fri Jul 15 15:43:40 2011 New Revision: 224059 URL: http://svn.freebsd.org/changeset/base/224059 Log: Break out the pass 5 inode and block map updating into a separate function so that the function can be used by the journaling soft updates recovery. Modified: head/sbin/fsck_ffs/fsck.h head/sbin/fsck_ffs/pass5.c Modified: head/sbin/fsck_ffs/fsck.h ============================================================================== --- head/sbin/fsck_ffs/fsck.h Fri Jul 15 11:46:54 2011 (r224058) +++ head/sbin/fsck_ffs/fsck.h Fri Jul 15 15:43:40 2011 (r224059) @@ -395,5 +395,6 @@ void setinodebuf(ino_t); int setup(char *dev); void gjournal_check(const char *filesys); int suj_check(const char *filesys); +void update_maps(struct cg *, struct cg*, int); #endif /* !_FSCK_H_ */ Modified: head/sbin/fsck_ffs/pass5.c ============================================================================== --- head/sbin/fsck_ffs/pass5.c Fri Jul 15 11:46:54 2011 (r224058) +++ head/sbin/fsck_ffs/pass5.c Fri Jul 15 15:43:40 2011 (r224059) @@ -49,8 +49,8 @@ __FBSDID("$FreeBSD$"); #include "fsck.h" -static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *, int *, int, int); - +static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *, + int *, int, int, int); static void clear_blocks(ufs2_daddr_t start, ufs2_daddr_t end); void @@ -61,7 +61,7 @@ pass5(void) struct fs *fs = &sblock; struct cg *cg = &cgrp; ufs2_daddr_t d, dbase, dmax, start; - int excessdirs, rewritecg = 0; + int rewritecg = 0; struct csum *cs; struct csum_total cstotal; struct inodesc idesc[3]; @@ -333,27 +333,8 @@ pass5(void) memmove(cg, newcg, (size_t)basesize); cgdirty(); } - if (bkgrdflag != 0 || usedsoftdep || debug) { - excessdirs = cg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir; - if (excessdirs < 0) { - pfatal("LOST %d DIRECTORIES\n", -excessdirs); - excessdirs = 0; - } - if (excessdirs > 0) - check_maps(cg_inosused(newcg), cg_inosused(cg), - 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 * (ufs2_daddr_t) fs->fs_ipg, "FILE", - freefiles, excessdirs, fs->fs_ipg); - check_maps(cg_blksfree(cg), cg_blksfree(newcg), - blkmapsize, - cg->cg_cgx * (ufs2_daddr_t) fs->fs_fpg, "FRAG", - freeblks, 0, fs->fs_fpg); - } + if (bkgrdflag != 0 || usedsoftdep || debug) + update_maps(cg, newcg, bkgrdflag); if (cursnapshot == 0 && memcmp(cg_inosused(newcg), cg_inosused(cg), mapsize) != 0 && dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) { @@ -426,6 +407,40 @@ pass5(void) } } +/* + * Compare the original cylinder group inode and block bitmaps with the + * updated cylinder group inode and block bitmaps. Free inodes and blocks + * that have been added. Complain if any previously freed inodes blocks + * are now allocated. + */ +void +update_maps( + struct cg *oldcg, /* cylinder group of claimed allocations */ + struct cg *newcg, /* cylinder group of determined allocations */ + int usesysctl) /* 1 => use sysctl interface to update maps */ +{ + int inomapsize, excessdirs; + struct fs *fs = &sblock; + + inomapsize = howmany(fs->fs_ipg, CHAR_BIT); + excessdirs = oldcg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir; + if (excessdirs < 0) { + pfatal("LOST %d DIRECTORIES\n", -excessdirs); + excessdirs = 0; + } + if (excessdirs > 0) + check_maps(cg_inosused(newcg), cg_inosused(oldcg), inomapsize, + oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_ipg, "DIR", freedirs, + 0, excessdirs, usesysctl); + check_maps(cg_inosused(newcg), cg_inosused(oldcg), inomapsize, + oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_ipg, "FILE", freefiles, + excessdirs, fs->fs_ipg, usesysctl); + check_maps(cg_blksfree(oldcg), cg_blksfree(newcg), + howmany(fs->fs_fpg, CHAR_BIT), + oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_fpg, "FRAG", + freeblks, 0, fs->fs_fpg, usesysctl); +} + static void check_maps( u_char *map1, /* map of claimed allocations */ @@ -435,7 +450,8 @@ check_maps( 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 */ - int limit) /* limit on number of entries to free */ + int limit, /* limit on number of entries to free */ + int usesysctl) /* 1 => use sysctl interface to update maps */ { # define BUFSIZE 16 char buf[BUFSIZE]; @@ -443,7 +459,7 @@ check_maps( ufs2_daddr_t n, astart, aend, ustart, uend; void (*msg)(const char *fmt, ...); - if (bkgrdflag) + if (usesysctl) msg = pfatal; else msg = pwarn; @@ -506,7 +522,7 @@ check_maps( " MARKED USED\n", "UNALLOCATED", name, ustart, ustart + size - 1); - if (bkgrdflag != 0) { + if (usesysctl != 0) { cmd.value = ustart; cmd.size = size; if (sysctl(opcode, MIBSIZE, 0, 0, @@ -552,7 +568,7 @@ check_maps( " MARKED USED\n", name, ustart, ustart + size - 1); } - if (bkgrdflag != 0) { + if (usesysctl != 0) { cmd.value = ustart; cmd.size = size; if (sysctl(opcode, MIBSIZE, 0, 0, &cmd,