jblocks
static struct jblocks *suj_jblocks;
static struct jblocks *
struct jblocks *jblocks;
jblocks = errmalloc(sizeof(*jblocks));
jblocks->jb_avail = 10;
jblocks->jb_used = 0;
jblocks->jb_head = 0;
jblocks->jb_off = 0;
size = sizeof(struct jextent) * jblocks->jb_avail;
jblocks->jb_extent = errmalloc(size);
bzero(jblocks->jb_extent, size);
return (jblocks);
jblocks_next(struct jblocks *jblocks, int bytes, int *actual)
jext = &jblocks->jb_extent[jblocks->jb_head];
freecnt = jext->je_blocks - jblocks->jb_off;
jblocks->jb_off = 0;
if (++jblocks->jb_head > jblocks->jb_used)
jext = &jblocks->jb_extent[jblocks->jb_head];
daddr = jext->je_daddr + jblocks->jb_off;
jblocks_advance(struct jblocks *jblocks, int bytes)
jblocks->jb_off += btodb(bytes);
jblocks_destroy(struct jblocks *jblocks)
free(jblocks->jb_extent);
free(jblocks);
jblocks_add(struct jblocks *jblocks, ufs2_daddr_t daddr, int blocks)
jext = &jblocks->jb_extent[jblocks->jb_used];
if (++jblocks->jb_used == jblocks->jb_avail) {
jblocks->jb_avail *= 2;
size = sizeof(struct jextent) * jblocks->jb_avail;
bcopy(jblocks->jb_extent, jext,
sizeof(struct jextent) * jblocks->jb_used);
free(jblocks->jb_extent);
jblocks->jb_extent = jext;
jext = &jblocks->jb_extent[jblocks->jb_used];
struct jblocks *jblocks;
jblocks = ump->softdep_jblocks;
jseg = TAILQ_LAST(&jblocks->jb_segs, jseglst);
static struct jblocks *
struct jblocks *jblocks;
jblocks = malloc(sizeof(*jblocks), M_JBLOCKS, M_WAITOK | M_ZERO);
TAILQ_INIT(&jblocks->jb_segs);
jblocks->jb_avail = 10;
jblocks->jb_extent = malloc(sizeof(struct jextent) * jblocks->jb_avail,
return (jblocks);
jblocks_alloc(struct jblocks *jblocks,
jext = &jblocks->jb_extent[jblocks->jb_head];
freecnt = jext->je_blocks - jblocks->jb_off;
jblocks->jb_off = 0;
if (++jblocks->jb_head > jblocks->jb_used)
jblocks->jb_head = 0;
jext = &jblocks->jb_extent[jblocks->jb_head];
daddr = jext->je_daddr + jblocks->jb_off;
jblocks->jb_off += freecnt;
jblocks->jb_free -= freecnt;
jblocks_free(struct jblocks *jblocks,
jblocks->jb_free += bytes / DEV_BSIZE;
if (jblocks->jb_suspended)
wakeup(jblocks);
jblocks_destroy(struct jblocks *jblocks)
if (jblocks->jb_extent)
free(jblocks->jb_extent, M_JBLOCKS);
free(jblocks, M_JBLOCKS);
jblocks_add(struct jblocks *jblocks,
jblocks->jb_blocks += blocks;
jblocks->jb_free += blocks;
jext = &jblocks->jb_extent[jblocks->jb_used];
if (++jblocks->jb_used == jblocks->jb_avail) {
jblocks->jb_avail *= 2;
jext = malloc(sizeof(struct jextent) * jblocks->jb_avail,
memcpy(jext, jblocks->jb_extent,
sizeof(struct jextent) * jblocks->jb_used);
free(jblocks->jb_extent, M_JBLOCKS);
jblocks->jb_extent = jext;
jext = &jblocks->jb_extent[jblocks->jb_used];
struct jblocks *jblocks;
jblocks = jblocks_create();
jblocks_add(jblocks, blkno, fsbtodb(fs, fs->fs_frag));
jblocks_destroy(jblocks);
jblocks->jb_low = jblocks->jb_free / 3; /* Reserve 33%. */
jblocks->jb_min = jblocks->jb_free / 10; /* Suspend at 10%. */
ump->softdep_jblocks = jblocks;
struct jblocks *jblocks;
jblocks = ump->softdep_jblocks;
if (jblocks == NULL)
thresh = jblocks->jb_min;
thresh = jblocks->jb_low;
avail = jblocks->jb_free - avail;
struct jblocks *jblocks;
jblocks = ump->softdep_jblocks;
jblocks->jb_suspended = 1;
struct jblocks *jblocks;
jblocks = ump->softdep_jblocks;
if (jblocks != NULL && jblocks->jb_suspended &&
journal_space(ump, jblocks->jb_min)) {
jblocks->jb_suspended = 0;
struct jblocks *jblocks;
jblocks = ump->softdep_jblocks;
jblocks->jb_needseg = 1;
struct jblocks *jblocks;
jblocks = ump->softdep_jblocks;
jblocks->jb_needseg == 0 && (segwritten || cnt == 0))
while (jblocks->jb_free == 0) {
msleep(jblocks, LOCK_PTR(ump), PRIBIO, "jblocks", hz);
jseg->js_jblocks = jblocks;
if (cnt + jblocks->jb_needseg == 0 || jblocks->jb_free == 0) {
bp->b_blkno = jblocks_alloc(jblocks, size, &size);
jseg->js_seq = jblocks->jb_nextseq++;
if (jblocks->jb_oldestseg == NULL)
jblocks->jb_oldestseg = jseg;
jseg->js_oldseq = jblocks->jb_oldestseg->js_seq;
TAILQ_INSERT_TAIL(&jblocks->jb_segs, jseg, js_next);
if (jblocks->jb_writeseg == NULL)
jblocks->jb_writeseg = jseg;
jblocks->jb_needseg = 0;
TAILQ_LAST(&jblocks->jb_segs, jseglst));
if (flags == 0 && jblocks->jb_suspended) {
struct jblocks *jblocks;
jblocks = jseg->js_jblocks;
if (jseg != jblocks->jb_writeseg)
jblocks->jb_oldestwrseq = jseg->js_oldseq;
jblocks->jb_writeseg = jseg;
free_jsegs(jblocks);
free_jseg(struct jseg *jseg, struct jblocks *jblocks)
if (jblocks->jb_oldestseg == jseg)
jblocks->jb_oldestseg = TAILQ_NEXT(jseg, js_next);
TAILQ_REMOVE(&jblocks->jb_segs, jseg, js_next);
jblocks_free(jblocks, jseg->js_list.wk_mp, jseg->js_size);
free_jsegs(struct jblocks *jblocks)
while ((jseg = TAILQ_FIRST(&jblocks->jb_segs)) != NULL) {
jblocks->jb_oldestseg = jseg;
if (jseg->js_seq > jblocks->jb_oldestwrseq)
if (jseg->js_seq == jblocks->jb_oldestwrseq &&
free_jseg(jseg, jblocks);
for (jseg = jblocks->jb_oldestseg; jseg != NULL;
jblocks->jb_oldestseg = jseg;
if (jblocks->jb_oldestseg == NULL && !TAILQ_EMPTY(&jblocks->jb_segs))
jblocks->jb_needseg = 1;
static void free_jsegs(struct jblocks *);
static void free_jseg(struct jseg *, struct jblocks *);
static struct jblocks *jblocks_create(void);
static ufs2_daddr_t jblocks_alloc(struct jblocks *, int, int *);
static void jblocks_free(struct jblocks *, struct mount *, int);
static void jblocks_destroy(struct jblocks *);
static void jblocks_add(struct jblocks *, ufs2_daddr_t, int);
struct jblocks *sd_jblocks; /* Journal block information */
struct jblocks *js_jblocks; /* Back pointer to block/seg list */
struct jblocks;