bmsafemap
struct bmsafemap *bmsafemap;
bmsafemap = bmsafemap_lookup(mp, bp, dtog(fs, blkno), NULL);
WORKLIST_INSERT(&bmsafemap->sm_freehd, wk);
bmsafemap = bmsafemap_lookup(mp, bp, dtog(fs, blkno), NULL);
LIST_FOREACH(jnewblk, &bmsafemap->sm_jnewblkhd, jn_deps) {
struct bmsafemap *bmsafemap,
if (bmsafemap->sm_state & IOSTARTED)
bmsafemap->sm_state |= IOSTARTED;
if (LIST_FIRST(&bmsafemap->sm_jaddrefhd) != NULL) {
fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs;
LIST_FOREACH(jaddref, &bmsafemap->sm_jaddrefhd, ja_bmdeps) {
if (LIST_FIRST(&bmsafemap->sm_jnewblkhd) != NULL) {
fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs;
LIST_FOREACH(jnewblk, &bmsafemap->sm_jnewblkhd, jn_deps) {
LIST_SWAP(&bmsafemap->sm_inodedephd, &bmsafemap->sm_inodedepwr,
LIST_SWAP(&bmsafemap->sm_newblkhd, &bmsafemap->sm_newblkwr,
LIST_SWAP(&bmsafemap->sm_freehd, &bmsafemap->sm_freewr, worklist,
struct bmsafemap *bmsafemap,
LOCK_OWNED(VFSTOUFS(bmsafemap->sm_list.wk_mp));
dirty = !LIST_EMPTY(&bmsafemap->sm_jaddrefhd) |
!LIST_EMPTY(&bmsafemap->sm_jnewblkhd);
initiate_write_bmsafemap(bmsafemap, bp);
struct bmsafemap *bmsafemap,
if ((bmsafemap->sm_state & IOSTARTED) == 0)
ump = VFSTOUFS(bmsafemap->sm_list.wk_mp);
bmsafemap->sm_state &= ~IOSTARTED;
handle_jwork(&bmsafemap->sm_freewr);
LIST_CONCAT(&bmsafemap->sm_freehd, &bmsafemap->sm_freewr,
if (!LIST_EMPTY(&bmsafemap->sm_jaddrefhd)) {
fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs;
LIST_FOREACH_SAFE(jaddref, &bmsafemap->sm_jaddrefhd,
if (LIST_FIRST(&bmsafemap->sm_jnewblkhd) != NULL) {
fs = VFSTOUFS(bmsafemap->sm_list.wk_mp)->um_fs;
LIST_FOREACH_SAFE(jnewblk, &bmsafemap->sm_jnewblkhd, jn_deps,
LIST_CONCAT(&bmsafemap->sm_newblkhd, &bmsafemap->sm_newblkwr,
LIST_CONCAT(&bmsafemap->sm_freehd, &bmsafemap->sm_freewr,
while ((newblk = LIST_FIRST(&bmsafemap->sm_newblkwr))) {
while ((inodedep = LIST_FIRST(&bmsafemap->sm_inodedepwr)) != NULL) {
LIST_REMOVE(bmsafemap, sm_next);
if (chgs == 0 && LIST_EMPTY(&bmsafemap->sm_jaddrefhd) &&
LIST_EMPTY(&bmsafemap->sm_jnewblkhd) &&
LIST_EMPTY(&bmsafemap->sm_newblkhd) &&
LIST_EMPTY(&bmsafemap->sm_inodedephd) &&
LIST_EMPTY(&bmsafemap->sm_freehd)) {
LIST_REMOVE(bmsafemap, sm_hash);
WORKITEM_FREE(bmsafemap, D_BMSAFEMAP);
LIST_INSERT_HEAD(&ump->softdep_dirtycg, bmsafemap, sm_next);
struct bmsafemap *bmsafemap;
struct bmsafemap *sentinel;
for (bmsafemap = LIST_NEXT(sentinel, sm_next); bmsafemap != NULL;
bmsafemap = LIST_NEXT(sentinel, sm_next)) {
if (bmsafemap->sm_cg == -1 ||
(LIST_EMPTY(&bmsafemap->sm_freehd) &&
LIST_EMPTY(&bmsafemap->sm_freewr))) {
LIST_INSERT_AFTER(bmsafemap, sentinel, sm_next);
bp = getdirtybuf(bmsafemap->sm_buf, LOCK_PTR(ump), waitfor);
LIST_INSERT_AFTER(bmsafemap, sentinel, sm_next);
struct bmsafemap *bmsafemap;
bmsafemap = WK_BMSAFEMAP(wk);
if (LIST_FIRST(&bmsafemap->sm_jaddrefhd)) {
if (LIST_FIRST(&bmsafemap->sm_jnewblkhd)) {
struct bmsafemap *bmsafemap;
bmsafemap = newblk->nb_bmsafemap;
LIST_INSERT_HEAD(&bmsafemap->sm_newblkhd, newblk,
struct bmsafemap *bmsafemap;
bmsafemap = malloc(sizeof(struct bmsafemap),
workitem_alloc(&bmsafemap->sm_list, D_BMSAFEMAP, mp);
bmsafemap = bmsafemap_lookup(mp, bp, ino_to_cg(fs, newinum), bmsafemap);
LIST_INSERT_HEAD(&bmsafemap->sm_jaddrefhd, jaddref, ja_bmdeps);
LIST_INSERT_HEAD(&bmsafemap->sm_inodedephd, inodedep, id_deps);
inodedep->id_bmsafemap = bmsafemap;
struct bmsafemap *bmsafemap;
newblk->nb_bmsafemap = bmsafemap = bmsafemap_lookup(mp, bp,
LIST_INSERT_HEAD(&bmsafemap->sm_jnewblkhd, jnewblk, jn_deps);
LIST_INSERT_HEAD(&bmsafemap->sm_newblkhd, newblk, nb_deps);
newblk->nb_bmsafemap = bmsafemap;
struct bmsafemap **bmsafemapp)
struct bmsafemap *bmsafemap;
LIST_FOREACH(bmsafemap, bmsafemaphd, sm_hash)
if (bmsafemap->sm_cg == cg)
if (bmsafemap) {
*bmsafemapp = bmsafemap;
static struct bmsafemap *
struct bmsafemap *newbmsafemap)
struct bmsafemap *bmsafemap, *collision;
if (bmsafemap_find(bmsafemaphd, cg, &bmsafemap) == 1) {
return (bmsafemap);
bmsafemap = newbmsafemap;
bmsafemap = malloc(sizeof(struct bmsafemap),
workitem_alloc(&bmsafemap->sm_list, D_BMSAFEMAP, mp);
bmsafemap->sm_buf = bp;
LIST_INIT(&bmsafemap->sm_inodedephd);
LIST_INIT(&bmsafemap->sm_inodedepwr);
LIST_INIT(&bmsafemap->sm_newblkhd);
LIST_INIT(&bmsafemap->sm_newblkwr);
LIST_INIT(&bmsafemap->sm_jaddrefhd);
LIST_INIT(&bmsafemap->sm_jnewblkhd);
LIST_INIT(&bmsafemap->sm_freehd);
LIST_INIT(&bmsafemap->sm_freewr);
WORKITEM_FREE(bmsafemap, D_BMSAFEMAP);
bmsafemap->sm_cg = cg;
LIST_INSERT_HEAD(bmsafemaphd, bmsafemap, sm_hash);
LIST_INSERT_HEAD(&ump->softdep_dirtycg, bmsafemap, sm_next);
WORKLIST_INSERT(&bp->b_dep, &bmsafemap->sm_list);
return (bmsafemap);
SOFTDEP_TYPE(BMSAFEMAP, bmsafemap,
static int handle_written_bmsafemap(struct bmsafemap *, struct buf *, int);
static void initiate_write_bmsafemap(struct bmsafemap *, struct buf *);
struct bmsafemap **);
static struct bmsafemap *bmsafemap_lookup(struct mount *, struct buf *,
int cg, struct bmsafemap *);
static int bmsafemap_backgroundwrite(struct bmsafemap *, struct buf *);
LIST_HEAD(bmsafemap_hashhead, bmsafemap);
#define WK_BMSAFEMAP(wk) ((struct bmsafemap *)(wk))
struct bmsafemap *id_bmsafemap; /* related bmsafemap (if pending) */
LIST_ENTRY(bmsafemap) sm_hash; /* Hash links. */
LIST_ENTRY(bmsafemap) sm_next; /* Mount list. */
struct bmsafemap *nb_bmsafemap;/* Cylgrp dep (if pending). */
LIST_HEAD(bmsafemaphd, bmsafemap);