jremref
struct jremref *jremref;
while ((jremref = LIST_FIRST(&dirrem->dm_jremrefhd)) != NULL)
jwait(&jremref->jr_list, MNT_WAIT);
jremref_write(struct jremref *jremref,
inoref_write(&jremref->jr_ref, jseg, rec);
handle_written_jremref(struct jremref *jremref)
jsegdep = inoref_jseg(&jremref->jr_ref);
if (inodedep_lookup(jremref->jr_list.wk_mp, jremref->jr_ref.if_ino,
TAILQ_REMOVE(&inodedep->id_inoreflst, &jremref->jr_ref, if_deps);
dirrem = jremref->jr_dirrem;
jremref->jr_dirrem = NULL;
LIST_REMOVE(jremref, jr_deps);
jsegdep->jd_state |= jremref->jr_state & MKDIR_PARENT;
free_jremref(jremref);
static struct jremref *
struct jremref *jremref;
jremref = malloc(sizeof(*jremref), M_JREMREF, M_SOFTDEP_FLAGS);
workitem_alloc(&jremref->jr_list, D_JREMREF, ITOVFS(dp));
jremref->jr_state = ATTACHED;
newinoref(&jremref->jr_ref, ip->i_number, dp->i_number, diroff,
jremref->jr_dirrem = dirrem;
return (jremref);
free_jremref(struct jremref *jremref)
if (jremref->jr_ref.if_jsegdep)
free_jsegdep(jremref->jr_ref.if_jsegdep);
if (jremref->jr_state & INPROGRESS)
WORKITEM_FREE(jremref, D_JREMREF);
SOFTDEP_TYPE(JREMREF, jremref, "Journal inode ref remove");
static void handle_written_jremref(struct jremref *);
static void jremref_write(struct jremref *, struct jseg *, uint8_t *);
struct jremref *jremref;
while ((jremref = LIST_FIRST(&dirrem->dm_jremrefhd)) != NULL) {
jwait(&jremref->jr_list, MNT_WAIT);
static struct jremref *cancel_diradd_dotdot(struct inode *, struct dirrem *,
struct jremref *);
static struct jremref *cancel_mkdir_dotdot(struct inode *, struct dirrem *,
struct jremref *);
static void cancel_diradd(struct diradd *, struct dirrem *, struct jremref *,
struct jremref *, struct jremref *);
static void dirrem_journal(struct dirrem *, struct jremref *, struct jremref *,
struct jremref *);
static void free_jremref(struct jremref *);
static void journal_jremref(struct dirrem *, struct jremref *,
static struct jremref *newjremref(struct dirrem *, struct inode *,
struct jremref *jremref,
struct jremref *dotremref,
struct jremref *dotdotremref)
if (jremref == NULL) {
free_jremref(jremref);
jremref = NULL;
if (jremref)
journal_jremref(dirrem, jremref, inodedep);
static struct jremref *
struct jremref *jremref)
return (jremref);
return (jremref);
cancel_diradd(dap, dirrem, jremref, NULL, NULL);
static struct jremref *
struct jremref *jremref)
return (jremref);
return (jremref);
journal_jremref(dirrem, jremref, inodedep);
jremref = NULL;
return (jremref);
struct jremref *jremref,
if (inodedep_lookup(jremref->jr_list.wk_mp,
jremref->jr_ref.if_ino, 0, &inodedep) == 0)
LIST_INSERT_HEAD(&dirrem->dm_jremrefhd, jremref, jr_deps);
TAILQ_INSERT_TAIL(&inodedep->id_inoreflst, &jremref->jr_ref, if_deps);
add_to_journal(&jremref->jr_list);
struct jremref *jremref,
struct jremref *dotremref,
struct jremref *dotdotremref)
if (inodedep_lookup(jremref->jr_list.wk_mp, jremref->jr_ref.if_ino, 0,
journal_jremref(dirrem, jremref, inodedep);
struct jremref *jremref;
struct jremref *dotremref;
struct jremref *dotdotremref;
jremref = dotremref = dotdotremref = NULL;
jremref = newjremref(dirrem, dp, ip, I_OFFSET(dp),
jremref = newjremref(dirrem, dp, ip, I_OFFSET(dp),
jremref = cancel_mkdir_dotdot(dp, dirrem, jremref);
if (jremref)
dirrem_journal(dirrem, jremref, dotremref,
cancel_diradd(dap, dirrem, jremref, dotremref, dotdotremref);
#define WK_JREMREF(wk) ((struct jremref *)(wk))
LIST_HEAD(jremrefhd, jremref);
LIST_ENTRY(jremref) jr_deps; /* Links for dirrem. */