|
@@ -206,24 +206,20 @@ repeat:
|
|
|
if (kthread_should_stop())
|
|
|
return 0;
|
|
|
|
|
|
- spin_lock(&fcc->issue_lock);
|
|
|
- if (fcc->issue_list) {
|
|
|
- fcc->dispatch_list = fcc->issue_list;
|
|
|
- fcc->issue_list = fcc->issue_tail = NULL;
|
|
|
- }
|
|
|
- spin_unlock(&fcc->issue_lock);
|
|
|
-
|
|
|
- if (fcc->dispatch_list) {
|
|
|
+ if (!llist_empty(&fcc->issue_list)) {
|
|
|
struct bio *bio = bio_alloc(GFP_NOIO, 0);
|
|
|
struct flush_cmd *cmd, *next;
|
|
|
int ret;
|
|
|
|
|
|
+ fcc->dispatch_list = llist_del_all(&fcc->issue_list);
|
|
|
+ fcc->dispatch_list = llist_reverse_order(fcc->dispatch_list);
|
|
|
+
|
|
|
bio->bi_bdev = sbi->sb->s_bdev;
|
|
|
ret = submit_bio_wait(WRITE_FLUSH, bio);
|
|
|
|
|
|
- for (cmd = fcc->dispatch_list; cmd; cmd = next) {
|
|
|
+ llist_for_each_entry_safe(cmd, next,
|
|
|
+ fcc->dispatch_list, llnode) {
|
|
|
cmd->ret = ret;
|
|
|
- next = cmd->next;
|
|
|
complete(&cmd->wait);
|
|
|
}
|
|
|
bio_put(bio);
|
|
@@ -231,7 +227,7 @@ repeat:
|
|
|
}
|
|
|
|
|
|
wait_event_interruptible(*q,
|
|
|
- kthread_should_stop() || fcc->issue_list);
|
|
|
+ kthread_should_stop() || !llist_empty(&fcc->issue_list));
|
|
|
goto repeat;
|
|
|
}
|
|
|
|
|
@@ -250,15 +246,8 @@ int f2fs_issue_flush(struct f2fs_sb_info *sbi)
|
|
|
return blkdev_issue_flush(sbi->sb->s_bdev, GFP_KERNEL, NULL);
|
|
|
|
|
|
init_completion(&cmd.wait);
|
|
|
- cmd.next = NULL;
|
|
|
|
|
|
- spin_lock(&fcc->issue_lock);
|
|
|
- if (fcc->issue_list)
|
|
|
- fcc->issue_tail->next = &cmd;
|
|
|
- else
|
|
|
- fcc->issue_list = &cmd;
|
|
|
- fcc->issue_tail = &cmd;
|
|
|
- spin_unlock(&fcc->issue_lock);
|
|
|
+ llist_add(&cmd.llnode, &fcc->issue_list);
|
|
|
|
|
|
if (!fcc->dispatch_list)
|
|
|
wake_up(&fcc->flush_wait_queue);
|
|
@@ -277,8 +266,8 @@ int create_flush_cmd_control(struct f2fs_sb_info *sbi)
|
|
|
fcc = kzalloc(sizeof(struct flush_cmd_control), GFP_KERNEL);
|
|
|
if (!fcc)
|
|
|
return -ENOMEM;
|
|
|
- spin_lock_init(&fcc->issue_lock);
|
|
|
init_waitqueue_head(&fcc->flush_wait_queue);
|
|
|
+ init_llist_head(&fcc->issue_list);
|
|
|
SM_I(sbi)->cmd_control_info = fcc;
|
|
|
fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi,
|
|
|
"f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev));
|