return 0; /* FIXME should be an error flag */
}
-static DECLARE_WAIT_QUEUE_HEAD(block_wait); /* need more of these later FIXME */
-
-void lafs_io_wake(struct block *b)
+static int sched(void *flags)
{
- wake_up(&block_wait);
+ io_schedule();
+ return 0;
}
void _lafs_iolock_block(struct block *b)
{
- if (test_and_set_bit(B_IOLock, &b->flags)) {
- DEFINE_WAIT(wq);
+ while (test_and_set_bit(B_IOLock, &b->flags)) {
#ifdef DEBUG_IOLOCK
printk("iolock wait for %s:%d: %s\n",
b->iolock_file, b->iolock_line,
strblk(b));
#endif
- for (;;) {
- prepare_to_wait(&block_wait, &wq, TASK_UNINTERRUPTIBLE);
-
- if (!test_and_set_bit(B_IOLock, &b->flags))
- break;
- schedule();
- }
- finish_wait(&block_wait, &wq);
+ wait_on_bit(&b->flags, B_IOLock,
+ sched, TASK_UNINTERRUPTIBLE);
}
}
else
lafs_iocheck_block(dblk(b), 1);
- lafs_io_wake(b);
+ wake_up_bit(&b->flags, B_IOLock);
if (test_bit(B_Async, &b->flags))
lafs_wake_thread(fs_from_inode(b->inode));
}
if (test_bit(B_Index, &b->flags)) {
clear_bit(B_Writeback, &b->flags);
- lafs_io_wake(b);
+ wake_up_bit(&b->flags, B_Writeback);
if (test_bit(B_Async, &b->flags))
lafs_wake_thread(fs_from_inode(b->inode));
} else
if (havewrite)
end_page_writeback(page);
if (unlock) {
- lafs_io_wake(&db->b);
+ wake_up_bit(&db->b.flags, B_Writeback);
if (test_bit(B_Async, &db->b.flags))
lafs_wake_thread(fs_from_inode(db->b.inode));
}
}
+static int sched_valid(void *flags)
+{
+ if (test_bit(B_Valid, flags))
+ return -EINTR;
+
+ schedule();
+ return 0;
+}
+
int __must_check
lafs_wait_block(struct block *b)
{
if (test_bit(B_IOLock, &b->flags) &&
- !test_bit(B_Valid, &b->flags)) {
- DEFINE_WAIT(wq);
- for (;;) {
- prepare_to_wait(&block_wait, &wq, TASK_UNINTERRUPTIBLE);
- if (test_bit(B_IOLock, &b->flags) &&
- !test_bit(B_Valid, &b->flags))
- schedule();
- else
- break;
- }
- finish_wait(&block_wait, &wq);
- }
+ !test_bit(B_Valid, &b->flags))
+ wait_on_bit(&b->flags, B_IOLock,
+ sched_valid, TASK_UNINTERRUPTIBLE);
+
return test_bit(B_Valid, &b->flags) ? 0 : -EIO;
}
static void wait_writeback(struct block *b)
{
if (test_bit(B_Writeback, &b->flags)) {
- DEFINE_WAIT(wq);
#ifdef DEBUG_IOLOCK
printk("writeback wait for %s:%d: %s\n",
b->iolock_file, b->iolock_line,
strblk(b));
#endif
lafs_trigger_flush(b);
- for (;;) {
- prepare_to_wait(&block_wait, &wq, TASK_UNINTERRUPTIBLE);
- if (test_bit(B_Writeback, &b->flags))
- schedule();
- else
- break;
- }
- finish_wait(&block_wait, &wq);
+ wait_on_bit(&b->flags, B_Writeback,
+ sched, TASK_UNINTERRUPTIBLE);
}
}