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}
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}