diff options
author | phk <phk@FreeBSD.org> | 2003-03-30 08:51:23 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2003-03-30 08:51:23 +0000 |
commit | a0fbf937559403c829123a70c7d5a56e2ef741bb (patch) | |
tree | 1258453658c2e860001261df6ebe12fa9e449e33 /sys | |
parent | 47e745e49e994d3ccd02cc13b6f3840824314f0c (diff) | |
download | FreeBSD-src-a0fbf937559403c829123a70c7d5a56e2ef741bb.zip FreeBSD-src-a0fbf937559403c829123a70c7d5a56e2ef741bb.tar.gz |
Preparation commit before I start on the bioqueue lockdown:
Collect all the bits of bioqueue handing in subr_disk.c, vfs_bio.c is big
enough as it is and disksort already lives in subr_disk.c.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/kern/subr_disk.c | 43 | ||||
-rw-r--r-- | sys/kern/vfs_bio.c | 25 | ||||
-rw-r--r-- | sys/sys/bio.h | 21 |
3 files changed, 46 insertions, 43 deletions
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c index 375f751..3e09cca 100644 --- a/sys/kern/subr_disk.c +++ b/sys/kern/subr_disk.c @@ -62,6 +62,49 @@ disk_err(struct bio *bp, const char *what, int blkdone, int nl) } /* + * BIO queue implementation + */ + +void +bioq_init(struct bio_queue_head *head) +{ + TAILQ_INIT(&head->queue); + head->last_pblkno = 0; + head->insert_point = NULL; + head->switch_point = NULL; +} + +void +bioq_remove(struct bio_queue_head *head, struct bio *bp) +{ + if (bp == head->switch_point) + head->switch_point = TAILQ_NEXT(bp, bio_queue); + if (bp == head->insert_point) { + head->insert_point = TAILQ_PREV(bp, bio_queue, bio_queue); + if (head->insert_point == NULL) + head->last_pblkno = 0; + } else if (bp == TAILQ_FIRST(&head->queue)) + head->last_pblkno = bp->bio_pblkno; + TAILQ_REMOVE(&head->queue, bp, bio_queue); + if (TAILQ_FIRST(&head->queue) == head->switch_point) + head->switch_point = NULL; +} +void +bioq_insert_tail(struct bio_queue_head *head, struct bio *bp) +{ + + TAILQ_INSERT_TAIL(&head->queue, bp, bio_queue); +} + +struct bio * +bioq_first(struct bio_queue_head *head) +{ + + return (TAILQ_FIRST(&head->queue)); +} + + +/* * Seek sort for disks. * * The buf_queue keep two queues, sorted in ascending block order. The first diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c index 82db7f4..489512c 100644 --- a/sys/kern/vfs_bio.c +++ b/sys/kern/vfs_bio.c @@ -2986,31 +2986,6 @@ biofinish(struct bio *bp, struct devstat *stat, int error) biodone(bp); } -void -bioq_init(struct bio_queue_head *head) -{ - TAILQ_INIT(&head->queue); - head->last_pblkno = 0; - head->insert_point = NULL; - head->switch_point = NULL; -} - -void -bioq_remove(struct bio_queue_head *head, struct bio *bp) -{ - if (bp == head->switch_point) - head->switch_point = TAILQ_NEXT(bp, bio_queue); - if (bp == head->insert_point) { - head->insert_point = TAILQ_PREV(bp, bio_queue, bio_queue); - if (head->insert_point == NULL) - head->last_pblkno = 0; - } else if (bp == TAILQ_FIRST(&head->queue)) - head->last_pblkno = bp->bio_pblkno; - TAILQ_REMOVE(&head->queue, bp, bio_queue); - if (TAILQ_FIRST(&head->queue) == head->switch_point) - head->switch_point = NULL; -} - /* * bufwait: * diff --git a/sys/sys/bio.h b/sys/sys/bio.h index a923a78..1628e61 100644 --- a/sys/sys/bio.h +++ b/sys/sys/bio.h @@ -114,30 +114,15 @@ struct bio_queue_head { int busy; }; -static __inline void bioq_insert_tail(struct bio_queue_head *head, - struct bio *bp); -static __inline struct bio *bioq_first(struct bio_queue_head *head); - -static __inline void -bioq_insert_tail(struct bio_queue_head *head, struct bio *bp) -{ - - TAILQ_INSERT_TAIL(&head->queue, bp, bio_queue); -} - -static __inline struct bio * -bioq_first(struct bio_queue_head *head) -{ - - return (TAILQ_FIRST(&head->queue)); -} - void biodone(struct bio *bp); void biofinish(struct bio *bp, struct devstat *stat, int error); int biowait(struct bio *bp, const char *wchan); + void bioq_disksort(struct bio_queue_head *ap, struct bio *bp); #define bioqdisksort(foo, bar) bioq_disksort(foo, bar) +struct bio *bioq_first(struct bio_queue_head *head); void bioq_init(struct bio_queue_head *head); +void bioq_insert_tail(struct bio_queue_head *head, struct bio *bp); void bioq_remove(struct bio_queue_head *head, struct bio *bp); void bio_taskqueue(struct bio *bp, bio_task_t *fund, void *arg); |