Lines Matching refs:fs
102 lfs_setup_resblks(struct lfs *fs)
107 ASSERT_NO_SEGLOCK(fs);
108 fs->lfs_resblk = malloc(LFS_N_TOTAL * sizeof(res_t), M_SEGMENT,
111 fs->lfs_resblk[i].inuse = 0;
112 fs->lfs_resblk[i].p = NULL;
115 LIST_INIT(fs->lfs_reshash + i);
122 fs->lfs_resblk[i].size = lfs_sb_getsumsize(fs);
124 fs->lfs_resblk[i].size = LFS_SBPAD;
126 fs->lfs_resblk[i].size = lfs_sb_getbsize(fs);
128 fs->lfs_resblk[i].size = MAXPHYS;
130 fs->lfs_resblk[i].size = MAXPHYS;
132 fs->lfs_resblk[i].size = LFS_MARKV_MAXBLKCNT * sizeof(BLOCK_INFO);
135 fs->lfs_resblk[i].p = malloc(fs->lfs_resblk[i].size,
142 pool_init(&fs->lfs_clpool, sizeof(struct lfs_cluster), 0, 0, 0,
144 pool_init(&fs->lfs_segpool, sizeof(struct segment), 0, 0, 0,
147 maxbpp = ((lfs_sb_getsumsize(fs) - SEGSUM_SIZE(fs)) / sizeof(int32_t) + 2);
148 maxbpp = MIN(maxbpp, lfs_segsize(fs) / lfs_sb_getfsize(fs) + 2);
149 pool_init(&fs->lfs_bpppool, maxbpp * sizeof(struct buf *), 0, 0, 0,
154 lfs_free_resblks(struct lfs *fs)
158 pool_destroy(&fs->lfs_bpppool);
159 pool_destroy(&fs->lfs_segpool);
160 pool_destroy(&fs->lfs_clpool);
164 while (fs->lfs_resblk[i].inuse)
165 mtsleep(&fs->lfs_resblk, PRIBIO + 1, "lfs_free", 0,
167 if (fs->lfs_resblk[i].p != NULL)
168 free(fs->lfs_resblk[i].p, M_SEGMENT);
170 free(fs->lfs_resblk, M_SEGMENT);
185 lfs_malloc(struct lfs *fs, size_t size, int type)
192 ASSERT_MAYBE_SEGLOCK(fs);
219 if (fs->lfs_resblk[start + i].inuse == 0) {
220 re = fs->lfs_resblk + start + i;
225 LIST_INSERT_HEAD(&fs->lfs_reshash[h], re, res);
232 mtsleep(&fs->lfs_resblk, PVM, "lfs_malloc", 0,
243 lfs_free(struct lfs *fs, void *p, int type)
248 ASSERT_MAYBE_SEGLOCK(fs);
251 LIST_FOREACH(re, &fs->lfs_reshash[h], res) {
256 wakeup(&fs->lfs_resblk);
264 KDASSERTMSG(fs->lfs_resblk[i].p == p,
282 lfs_seglock(struct lfs *fs, unsigned long flags)
287 if (fs->lfs_seglock) {
288 if (fs->lfs_lockpid == curproc->p_pid &&
289 fs->lfs_locklwp == curlwp->l_lid) {
290 ++fs->lfs_seglock;
291 fs->lfs_sp->seg_flags |= flags;
298 while (fs->lfs_seglock) {
299 (void)mtsleep(&fs->lfs_seglock, PRIBIO + 1,
305 fs->lfs_seglock = 1;
306 fs->lfs_lockpid = curproc->p_pid;
307 fs->lfs_locklwp = curlwp->l_lid;
309 fs->lfs_cleanind = 0;
314 rw_enter(&fs->lfs_fraglock, RW_WRITER);
316 sp = fs->lfs_sp = pool_get(&fs->lfs_segpool, PR_WAITOK);
317 sp->bpp = pool_get(&fs->lfs_bpppool, PR_WAITOK);
321 (void) lfs_initseg(fs, 0);
330 ++fs->lfs_iocount;
331 fs->lfs_startseg = lfs_sb_getcurseg(fs);
339 lfs_unmark_dirop(struct lfs *fs)
345 ASSERT_NO_SEGLOCK(fs);
347 doit = !(fs->lfs_flags & LFS_UNDIROP);
349 fs->lfs_flags |= LFS_UNDIROP;
356 KASSERT(fs != NULL);
363 TAILQ_INSERT_HEAD(&fs->lfs_dchainhd, marker, i_lfs_dchain);
365 TAILQ_REMOVE(&fs->lfs_dchainhd, marker, i_lfs_dchain);
366 TAILQ_INSERT_AFTER(&fs->lfs_dchainhd, ip, marker,
373 --fs->lfs_dirvcount;
375 TAILQ_REMOVE(&fs->lfs_dchainhd, ip, i_lfs_dchain);
377 fs->lfs_unlockvp = vp;
381 fs->lfs_unlockvp = NULL;
385 TAILQ_REMOVE(&fs->lfs_dchainhd, marker, i_lfs_dchain);
386 fs->lfs_flags &= ~LFS_UNDIROP;
387 wakeup(&fs->lfs_flags);
395 lfs_auto_segclean(struct lfs *fs)
399 ASSERT_SEGLOCK(fs);
407 for (i = 0; i < lfs_sb_getnseg(fs); i++) {
408 if ((fs->lfs_suflags[0][i] &
411 (fs->lfs_suflags[1][i] &
417 while (waited == 0 && fs->lfs_sbactive)
418 mtsleep(&fs->lfs_sbactive, PRIBIO+1, "lfs asb",
423 if ((error = lfs_do_segclean(fs, i)) != 0) {
427 fs->lfs_suflags[1 - fs->lfs_activesb][i] =
428 fs->lfs_suflags[fs->lfs_activesb][i];
437 lfs_segunlock(struct lfs *fs)
444 sp = fs->lfs_sp;
448 if (!LFS_SEGLOCK_HELD(fs))
451 if (fs->lfs_seglock == 1) {
462 lfs_sb_suboffset(fs, lfs_btofsb(fs, lfs_sb_getsumsize(fs)));
464 lfs_freebuf(fs, bp);
466 pool_put(&fs->lfs_bpppool, sp->bpp);
472 * fs->lfs_sp so another process can use it (we have to
476 pool_put(&fs->lfs_segpool, sp);
477 fs->lfs_sp = NULL;
485 if (--fs->lfs_iocount <= 1)
486 wakeup(&fs->lfs_iocount);
498 --fs->lfs_seglock;
499 fs->lfs_lockpid = 0;
500 fs->lfs_locklwp = 0;
502 wakeup(&fs->lfs_seglock);
512 while (ckp && sync && fs->lfs_iocount) {
513 (void)mtsleep(&fs->lfs_iocount, PRIBIO + 1,
515 DLOG((DLOG_SEG, "sleeping on iocount %x == %d\n", fs, fs->lfs_iocount));
524 pool_put(&fs->lfs_segpool, sp);
527 fs->lfs_nactive = 0;
531 lfs_writesuper(fs, lfs_sb_getsboff(fs, fs->lfs_activesb));
532 lfs_writesuper(fs, lfs_sb_getsboff(fs, 1 - fs->lfs_activesb));
533 if (!(fs->lfs_ivnode->v_mount->mnt_iflag & IMNT_UNMOUNT)) {
534 lfs_auto_segclean(fs);
537 lfs_auto_segclean(fs);
539 fs->lfs_activesb = 1 - fs->lfs_activesb;
544 --fs->lfs_seglock;
545 fs->lfs_lockpid = 0;
546 fs->lfs_locklwp = 0;
548 wakeup(&fs->lfs_seglock);
551 rw_exit(&fs->lfs_fraglock);
553 lfs_unmark_dirop(fs);
555 --fs->lfs_seglock;
556 KASSERT(fs->lfs_seglock != 0);
567 lfs_writer_enter(struct lfs *fs, const char *wmesg)
571 ASSERT_NO_SEGLOCK(fs);
575 fs->lfs_writer++;
577 while (fs->lfs_dirops > 0) {
578 ++fs->lfs_diropwait;
579 error = mtsleep(&fs->lfs_writer, PRIBIO+1, wmesg, 0,
582 --fs->lfs_diropwait;
589 lfs_writer_tryenter(struct lfs *fs)
593 ASSERT_MAYBE_SEGLOCK(fs);
595 writer_set = (fs->lfs_dirops == 0);
597 fs->lfs_writer++;
604 lfs_writer_leave(struct lfs *fs)
608 ASSERT_MAYBE_SEGLOCK(fs);
610 dowakeup = !(--fs->lfs_writer);
612 cv_broadcast(&fs->lfs_diropscv);
622 lfs_segunlock_relock(struct lfs *fs)
624 int n = fs->lfs_seglock;
633 lfs_writeseg(fs, fs->lfs_sp);
636 LFS_CLEANERINFO(cip, fs, bp);
637 lfs_ci_setflags(fs, cip,
638 lfs_ci_getflags(fs, cip) | LFS_CLEANER_MUST_CLEAN);
639 LFS_SYNC_CLEANERINFO(cip, fs, bp, 1);
642 seg_flags = fs->lfs_sp->seg_flags;
644 fs->lfs_sp->seg_flags |= SEGM_PROT; /* Don't unmark dirop nodes */
645 while(fs->lfs_seglock)
646 lfs_segunlock(fs);
649 lfs_wakeup_cleaner(fs);
651 while (LFS_STARVED_FOR_SEGS(fs))
652 mtsleep(&fs->lfs_availsleep, PRIBIO, "relock", 0,
658 lfs_seglock(fs, seg_flags);
661 LFS_CLEANERINFO(cip, fs, bp);
662 lfs_ci_setflags(fs, cip,
663 lfs_ci_getflags(fs, cip) & ~LFS_CLEANER_MUST_CLEAN);
664 LFS_SYNC_CLEANERINFO(cip, fs, bp, 1);
673 lfs_wakeup_cleaner(struct lfs *fs)
675 if (fs->lfs_nowrap > 0)
678 cv_broadcast(&fs->lfs_nextsegsleep);