Virtualizes & untangles the bioops operations vector.
Ref: Message-ID: <18317.961014572@critter.freebsd.dk> To: current@
This commit is contained in:
parent
57b102722a
commit
a2e7a027a7
@ -222,8 +222,6 @@ struct bio_ops bioops = {
|
|||||||
softdep_disk_io_initiation, /* io_start */
|
softdep_disk_io_initiation, /* io_start */
|
||||||
softdep_disk_write_complete, /* io_complete */
|
softdep_disk_write_complete, /* io_complete */
|
||||||
softdep_deallocate_dependencies, /* io_deallocate */
|
softdep_deallocate_dependencies, /* io_deallocate */
|
||||||
softdep_fsync, /* io_fsync */
|
|
||||||
softdep_process_worklist, /* io_sync */
|
|
||||||
softdep_move_dependencies, /* io_movedeps */
|
softdep_move_dependencies, /* io_movedeps */
|
||||||
softdep_count_dependencies, /* io_countdeps */
|
softdep_count_dependencies, /* io_countdeps */
|
||||||
};
|
};
|
||||||
|
@ -417,9 +417,8 @@ spec_strategy(ap)
|
|||||||
struct mount *mp;
|
struct mount *mp;
|
||||||
|
|
||||||
bp = ap->a_bp;
|
bp = ap->a_bp;
|
||||||
if ((bp->b_iocmd == BIO_WRITE) &&
|
if ((bp->b_iocmd == BIO_WRITE) && (LIST_FIRST(&bp->b_dep)) != NULL)
|
||||||
(LIST_FIRST(&bp->b_dep)) != NULL && bioops.io_start)
|
buf_start(bp);
|
||||||
(*bioops.io_start)(bp);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Collect statistics on synchronous and asynchronous read
|
* Collect statistics on synchronous and asynchronous read
|
||||||
|
@ -616,8 +616,8 @@ bwrite(struct buf * bp)
|
|||||||
newbp->b_flags &= ~B_INVAL;
|
newbp->b_flags &= ~B_INVAL;
|
||||||
|
|
||||||
/* move over the dependencies */
|
/* move over the dependencies */
|
||||||
if (LIST_FIRST(&bp->b_dep) != NULL && bioops.io_movedeps)
|
if (LIST_FIRST(&bp->b_dep) != NULL)
|
||||||
(*bioops.io_movedeps)(bp, newbp);
|
buf_movedeps(bp, newbp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initiate write on the copy, release the original to
|
* Initiate write on the copy, release the original to
|
||||||
@ -673,10 +673,10 @@ vfs_backgroundwritedone(bp)
|
|||||||
/*
|
/*
|
||||||
* Process dependencies then return any unfinished ones.
|
* Process dependencies then return any unfinished ones.
|
||||||
*/
|
*/
|
||||||
if (LIST_FIRST(&bp->b_dep) != NULL && bioops.io_complete)
|
if (LIST_FIRST(&bp->b_dep) != NULL)
|
||||||
(*bioops.io_complete)(bp);
|
buf_complete(bp);
|
||||||
if (LIST_FIRST(&bp->b_dep) != NULL && bioops.io_movedeps)
|
if (LIST_FIRST(&bp->b_dep) != NULL)
|
||||||
(*bioops.io_movedeps)(bp, origbp);
|
buf_movedeps(bp, origbp);
|
||||||
/*
|
/*
|
||||||
* Clear the BX_BKGRDINPROG flag in the original buffer
|
* Clear the BX_BKGRDINPROG flag in the original buffer
|
||||||
* and awaken it if it is waiting for the write to complete.
|
* and awaken it if it is waiting for the write to complete.
|
||||||
@ -939,8 +939,8 @@ brelse(struct buf * bp)
|
|||||||
* cache the buffer.
|
* cache the buffer.
|
||||||
*/
|
*/
|
||||||
bp->b_flags |= B_INVAL;
|
bp->b_flags |= B_INVAL;
|
||||||
if (LIST_FIRST(&bp->b_dep) != NULL && bioops.io_deallocate)
|
if (LIST_FIRST(&bp->b_dep) != NULL)
|
||||||
(*bioops.io_deallocate)(bp);
|
buf_deallocate(bp);
|
||||||
if (bp->b_flags & B_DELWRI) {
|
if (bp->b_flags & B_DELWRI) {
|
||||||
--numdirtybuffers;
|
--numdirtybuffers;
|
||||||
numdirtywakeup();
|
numdirtywakeup();
|
||||||
@ -1570,8 +1570,8 @@ restart:
|
|||||||
crfree(bp->b_wcred);
|
crfree(bp->b_wcred);
|
||||||
bp->b_wcred = NOCRED;
|
bp->b_wcred = NOCRED;
|
||||||
}
|
}
|
||||||
if (LIST_FIRST(&bp->b_dep) != NULL && bioops.io_deallocate)
|
if (LIST_FIRST(&bp->b_dep) != NULL)
|
||||||
(*bioops.io_deallocate)(bp);
|
buf_deallocate(bp);
|
||||||
if (bp->b_xflags & BX_BKGRDINPROG)
|
if (bp->b_xflags & BX_BKGRDINPROG)
|
||||||
panic("losing buffer 3");
|
panic("losing buffer 3");
|
||||||
LIST_REMOVE(bp, b_hash);
|
LIST_REMOVE(bp, b_hash);
|
||||||
@ -1848,9 +1848,8 @@ flushbufqueues(void)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (LIST_FIRST(&bp->b_dep) != NULL &&
|
if (LIST_FIRST(&bp->b_dep) != NULL &&
|
||||||
bioops.io_countdeps &&
|
|
||||||
(bp->b_flags & B_DEFERRED) == 0 &&
|
(bp->b_flags & B_DEFERRED) == 0 &&
|
||||||
(*bioops.io_countdeps)(bp, 0)) {
|
buf_countdeps(bp, 0)) {
|
||||||
TAILQ_REMOVE(&bufqueues[QUEUE_DIRTY],
|
TAILQ_REMOVE(&bufqueues[QUEUE_DIRTY],
|
||||||
bp, b_freelist);
|
bp, b_freelist);
|
||||||
TAILQ_INSERT_TAIL(&bufqueues[QUEUE_DIRTY],
|
TAILQ_INSERT_TAIL(&bufqueues[QUEUE_DIRTY],
|
||||||
@ -2664,8 +2663,8 @@ bufdone(struct buf *bp)
|
|||||||
splx(s);
|
splx(s);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (LIST_FIRST(&bp->b_dep) != NULL && bioops.io_complete)
|
if (LIST_FIRST(&bp->b_dep) != NULL)
|
||||||
(*bioops.io_complete)(bp);
|
buf_complete(bp);
|
||||||
|
|
||||||
if (bp->b_flags & B_VMIO) {
|
if (bp->b_flags & B_VMIO) {
|
||||||
int i, resid;
|
int i, resid;
|
||||||
|
@ -805,9 +805,8 @@ cluster_wbuild(vp, size, start_lbn, len)
|
|||||||
splx(s);
|
splx(s);
|
||||||
} /* end of code for non-first buffers only */
|
} /* end of code for non-first buffers only */
|
||||||
/* check for latent dependencies to be handled */
|
/* check for latent dependencies to be handled */
|
||||||
if ((LIST_FIRST(&tbp->b_dep)) != NULL &&
|
if ((LIST_FIRST(&tbp->b_dep)) != NULL)
|
||||||
bioops.io_start)
|
buf_start(tbp);
|
||||||
(*bioops.io_start)(tbp);
|
|
||||||
/*
|
/*
|
||||||
* If the IO is via the VM then we do some
|
* If the IO is via the VM then we do some
|
||||||
* special VM hackery. (yuck)
|
* special VM hackery. (yuck)
|
||||||
|
@ -1029,8 +1029,7 @@ sched_sync(void)
|
|||||||
/*
|
/*
|
||||||
* Do soft update processing.
|
* Do soft update processing.
|
||||||
*/
|
*/
|
||||||
if (bioops.io_sync)
|
softdep_process_worklist(NULL);
|
||||||
(*bioops.io_sync)(NULL);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The variable rushjob allows the kernel to speed up the
|
* The variable rushjob allows the kernel to speed up the
|
||||||
|
@ -2545,10 +2545,7 @@ fsync(p, uap)
|
|||||||
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
|
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
|
||||||
if (vp->v_object)
|
if (vp->v_object)
|
||||||
vm_object_page_clean(vp->v_object, 0, 0, 0);
|
vm_object_page_clean(vp->v_object, 0, 0, 0);
|
||||||
if ((error = VOP_FSYNC(vp, fp->f_cred, MNT_WAIT, p)) == 0 &&
|
error = VOP_FSYNC(vp, fp->f_cred, MNT_WAIT, p);
|
||||||
vp->v_mount && (vp->v_mount->mnt_flag & MNT_SOFTDEP) &&
|
|
||||||
bioops.io_fsync)
|
|
||||||
error = (*bioops.io_fsync)(vp);
|
|
||||||
VOP_UNLOCK(vp, 0, p);
|
VOP_UNLOCK(vp, 0, p);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
@ -1029,8 +1029,7 @@ sched_sync(void)
|
|||||||
/*
|
/*
|
||||||
* Do soft update processing.
|
* Do soft update processing.
|
||||||
*/
|
*/
|
||||||
if (bioops.io_sync)
|
softdep_process_worklist(NULL);
|
||||||
(*bioops.io_sync)(NULL);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The variable rushjob allows the kernel to speed up the
|
* The variable rushjob allows the kernel to speed up the
|
||||||
|
@ -2545,10 +2545,7 @@ fsync(p, uap)
|
|||||||
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
|
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
|
||||||
if (vp->v_object)
|
if (vp->v_object)
|
||||||
vm_object_page_clean(vp->v_object, 0, 0, 0);
|
vm_object_page_clean(vp->v_object, 0, 0, 0);
|
||||||
if ((error = VOP_FSYNC(vp, fp->f_cred, MNT_WAIT, p)) == 0 &&
|
error = VOP_FSYNC(vp, fp->f_cred, MNT_WAIT, p);
|
||||||
vp->v_mount && (vp->v_mount->mnt_flag & MNT_SOFTDEP) &&
|
|
||||||
bioops.io_fsync)
|
|
||||||
error = (*bioops.io_fsync)(vp);
|
|
||||||
VOP_UNLOCK(vp, 0, p);
|
VOP_UNLOCK(vp, 0, p);
|
||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
@ -1570,9 +1570,8 @@ devfs_strategy(struct vop_strategy_args *ap)
|
|||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
|
||||||
if ((bp->b_iocmd == BIO_WRITE) &&
|
if ((bp->b_iocmd == BIO_WRITE) && (LIST_FIRST(&bp->b_dep)) != NULL)
|
||||||
(LIST_FIRST(&bp->b_dep)) != NULL && bioops.io_start)
|
buf_start(bp);
|
||||||
(*bioops.io_start)(bp);
|
|
||||||
switch (vp->v_type) {
|
switch (vp->v_type) {
|
||||||
case VCHR:
|
case VCHR:
|
||||||
(*vp->v_rdev->si_devsw->d_strategy)(&bp->b_io);
|
(*vp->v_rdev->si_devsw->d_strategy)(&bp->b_io);
|
||||||
|
@ -417,9 +417,8 @@ spec_strategy(ap)
|
|||||||
struct mount *mp;
|
struct mount *mp;
|
||||||
|
|
||||||
bp = ap->a_bp;
|
bp = ap->a_bp;
|
||||||
if ((bp->b_iocmd == BIO_WRITE) &&
|
if ((bp->b_iocmd == BIO_WRITE) && (LIST_FIRST(&bp->b_dep)) != NULL)
|
||||||
(LIST_FIRST(&bp->b_dep)) != NULL && bioops.io_start)
|
buf_start(bp);
|
||||||
(*bioops.io_start)(bp);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Collect statistics on synchronous and asynchronous read
|
* Collect statistics on synchronous and asynchronous read
|
||||||
|
@ -64,8 +64,6 @@ extern struct bio_ops {
|
|||||||
void (*io_start) __P((struct buf *));
|
void (*io_start) __P((struct buf *));
|
||||||
void (*io_complete) __P((struct buf *));
|
void (*io_complete) __P((struct buf *));
|
||||||
void (*io_deallocate) __P((struct buf *));
|
void (*io_deallocate) __P((struct buf *));
|
||||||
int (*io_fsync) __P((struct vnode *));
|
|
||||||
int (*io_sync) __P((struct mount *));
|
|
||||||
void (*io_movedeps) __P((struct buf *, struct buf *));
|
void (*io_movedeps) __P((struct buf *, struct buf *));
|
||||||
int (*io_countdeps) __P((struct buf *, int));
|
int (*io_countdeps) __P((struct buf *, int));
|
||||||
} bioops;
|
} bioops;
|
||||||
@ -406,6 +404,43 @@ bufq_first(struct buf_queue_head *head)
|
|||||||
#define BUF_WRITE(bp) VOP_BWRITE((bp)->b_vp, (bp))
|
#define BUF_WRITE(bp) VOP_BWRITE((bp)->b_vp, (bp))
|
||||||
#define BUF_STRATEGY(bp) VOP_STRATEGY((bp)->b_vp, (bp))
|
#define BUF_STRATEGY(bp) VOP_STRATEGY((bp)->b_vp, (bp))
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
buf_start(struct buf *bp)
|
||||||
|
{
|
||||||
|
if (bioops.io_start)
|
||||||
|
(*bioops.io_start)(bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
buf_complete(struct buf *bp)
|
||||||
|
{
|
||||||
|
if (bioops.io_complete)
|
||||||
|
(*bioops.io_complete)(bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
buf_deallocate(struct buf *bp)
|
||||||
|
{
|
||||||
|
if (bioops.io_deallocate)
|
||||||
|
(*bioops.io_deallocate)(bp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline void
|
||||||
|
buf_movedeps(struct buf *bp, struct buf *bp2)
|
||||||
|
{
|
||||||
|
if (bioops.io_movedeps)
|
||||||
|
(*bioops.io_movedeps)(bp, bp2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline int
|
||||||
|
buf_countdeps(struct buf *bp, int i)
|
||||||
|
{
|
||||||
|
if (bioops.io_countdeps)
|
||||||
|
return ((*bioops.io_countdeps)(bp, i));
|
||||||
|
else
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _KERNEL */
|
#endif /* _KERNEL */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -447,6 +447,7 @@ int vfs_stduninit __P((struct vfsconf *));
|
|||||||
int vfs_stdextattrctl __P((struct mount *mp, int cmd, const char *attrname,
|
int vfs_stdextattrctl __P((struct mount *mp, int cmd, const char *attrname,
|
||||||
caddr_t arg, struct proc *p));
|
caddr_t arg, struct proc *p));
|
||||||
|
|
||||||
|
void softdep_process_worklist __P((struct mount *));
|
||||||
#else /* !_KERNEL */
|
#else /* !_KERNEL */
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
|
@ -222,8 +222,6 @@ struct bio_ops bioops = {
|
|||||||
softdep_disk_io_initiation, /* io_start */
|
softdep_disk_io_initiation, /* io_start */
|
||||||
softdep_disk_write_complete, /* io_complete */
|
softdep_disk_write_complete, /* io_complete */
|
||||||
softdep_deallocate_dependencies, /* io_deallocate */
|
softdep_deallocate_dependencies, /* io_deallocate */
|
||||||
softdep_fsync, /* io_fsync */
|
|
||||||
softdep_process_worklist, /* io_sync */
|
|
||||||
softdep_move_dependencies, /* io_movedeps */
|
softdep_move_dependencies, /* io_movedeps */
|
||||||
softdep_count_dependencies, /* io_countdeps */
|
softdep_count_dependencies, /* io_countdeps */
|
||||||
};
|
};
|
||||||
|
@ -253,4 +253,20 @@ softdep_sync_metadata(ap)
|
|||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
softdep_fsync(vp)
|
||||||
|
struct vnode *vp; /* the "in_core" copy of the inode */
|
||||||
|
{
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
softdep_process_worklist(matchmnt)
|
||||||
|
struct mount *matchmnt;
|
||||||
|
{
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* SOFTUPDATES not configured in */
|
#endif /* SOFTUPDATES not configured in */
|
||||||
|
@ -175,7 +175,7 @@ loop:
|
|||||||
continue;
|
continue;
|
||||||
if (!wait && LIST_FIRST(&bp->b_dep) != NULL &&
|
if (!wait && LIST_FIRST(&bp->b_dep) != NULL &&
|
||||||
(bp->b_flags & B_DEFERRED) == 0 &&
|
(bp->b_flags & B_DEFERRED) == 0 &&
|
||||||
bioops.io_countdeps && (*bioops.io_countdeps)(bp, 0)) {
|
buf_countdeps(bp, 0)) {
|
||||||
bp->b_flags |= B_DEFERRED;
|
bp->b_flags |= B_DEFERRED;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -278,5 +278,8 @@ loop:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
splx(s);
|
splx(s);
|
||||||
return (UFS_UPDATE(vp, wait));
|
error = UFS_UPDATE(vp, wait);
|
||||||
|
if (error == 0 && vp->v_mount && (vp->v_mount->mnt_flag & MNT_SOFTDEP))
|
||||||
|
error = softdep_fsync(vp);
|
||||||
|
return (error);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user