1/*- 2 * Copyright 2009, 2010 Jeffrey W. Roberson <jeff@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: stable/10/sbin/fsck_ffs/suj.c 260178 2014-01-02 01:44:14Z scottl $"); |
29 30#include <sys/param.h> 31#include <sys/disk.h> 32#include <sys/disklabel.h> 33#include <sys/mount.h> 34#include <sys/stat.h> 35 36#include <ufs/ufs/ufsmount.h> --- 83 unchanged lines hidden (view full) --- 120 struct suj_ino *sc_lastino; 121 struct suj_blk *sc_lastblk; 122 uint8_t *sc_cgbuf; 123 struct cg *sc_cgp; 124 int sc_dirty; 125 int sc_cgx; 126}; 127 |
128static LIST_HEAD(cghd, suj_cg) cghash[SUJ_HASHSIZE]; 129static LIST_HEAD(dblkhd, data_blk) dbhash[SUJ_HASHSIZE]; 130static struct suj_cg *lastcg; 131static struct data_blk *lastblk; |
132 |
133static TAILQ_HEAD(seghd, suj_seg) allsegs; 134static uint64_t oldseq; |
135static struct uufsd *disk = NULL; 136static struct fs *fs = NULL; |
137static ino_t sujino; |
138 139/* 140 * Summary statistics. 141 */ |
142static uint64_t freefrags; 143static uint64_t freeblocks; 144static uint64_t freeinos; 145static uint64_t freedir; 146static uint64_t jbytes; 147static uint64_t jrecs; |
148 149static jmp_buf jmpbuf; 150 151typedef void (*ino_visitor)(ino_t, ufs_lbn_t, ufs2_daddr_t, int); 152static void err_suj(const char *, ...) __dead2; 153static void ino_trunc(ino_t, off_t); 154static void ino_decr(ino_t); 155static void ino_adjust(struct suj_ino *); 156static void ino_build(struct suj_ino *); 157static int blk_isfree(ufs2_daddr_t); |
158static void initsuj(void); |
159 160static void * 161errmalloc(size_t n) 162{ 163 void *a; 164 165 a = Malloc(n); 166 if (a == NULL) --- 2242 unchanged lines hidden (view full) --- 2409 int jb_head; /* Allocator head. */ 2410 int jb_off; /* Allocator extent offset. */ 2411}; 2412struct jextent { 2413 ufs2_daddr_t je_daddr; /* Disk block address. */ 2414 int je_blocks; /* Disk block count. */ 2415}; 2416 |
2417static struct jblocks *suj_jblocks; |
2418 2419static struct jblocks * 2420jblocks_create(void) 2421{ 2422 struct jblocks *jblocks; 2423 int size; 2424 2425 jblocks = errmalloc(sizeof(*jblocks)); --- 243 unchanged lines hidden (view full) --- 2669{ 2670 union dinode *jip; 2671 union dinode *ip; 2672 uint64_t blocks; 2673 int retval; 2674 struct suj_seg *seg; 2675 struct suj_seg *segn; 2676 |
2677 initsuj(); |
2678 opendisk(filesys); |
2679 2680 /* 2681 * Set an exit point when SUJ check failed 2682 */ 2683 retval = setjmp(jmpbuf); 2684 if (retval != 0) { 2685 pwarn("UNEXPECTED SU+J INCONSISTENCY\n"); 2686 TAILQ_FOREACH_SAFE(seg, &allsegs, ss_next, segn) { --- 72 unchanged lines hidden (view full) --- 2759 printf("** %jd journal records in %jd bytes for %.2f%% utilization\n", 2760 jrecs, jbytes, ((float)jrecs / (float)(jbytes / JREC_SIZE)) * 100); 2761 printf("** Freed %jd inodes (%jd dirs) %jd blocks, and %jd frags.\n", 2762 freeinos, freedir, freeblocks, freefrags); 2763 } 2764 2765 return (0); 2766} |
2767 2768static void 2769initsuj(void) 2770{ 2771 int i; 2772 2773 for (i = 0; i < SUJ_HASHSIZE; i++) { 2774 LIST_INIT(&cghash[i]); 2775 LIST_INIT(&dbhash[i]); 2776 } 2777 lastcg = NULL; 2778 lastblk = NULL; 2779 TAILQ_INIT(&allsegs); 2780 oldseq = 0; 2781 disk = NULL; 2782 fs = NULL; 2783 sujino = 0; 2784 freefrags = 0; 2785 freeblocks = 0; 2786 freeinos = 0; 2787 freedir = 0; 2788 jbytes = 0; 2789 jrecs = 0; 2790 suj_jblocks = NULL; 2791} |