diff options
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_sync.c')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_sync.c | 88 |
1 files changed, 43 insertions, 45 deletions
diff --git a/fs/xfs/linux-2.6/xfs_sync.c b/fs/xfs/linux-2.6/xfs_sync.c index 594cd822d84..4a582d8100e 100644 --- a/fs/xfs/linux-2.6/xfs_sync.c +++ b/fs/xfs/linux-2.6/xfs_sync.c | |||
@@ -39,6 +39,8 @@ | |||
39 | #include <linux/kthread.h> | 39 | #include <linux/kthread.h> |
40 | #include <linux/freezer.h> | 40 | #include <linux/freezer.h> |
41 | 41 | ||
42 | struct workqueue_struct *xfs_syncd_wq; /* sync workqueue */ | ||
43 | |||
42 | /* | 44 | /* |
43 | * The inode lookup is done in batches to keep the amount of lock traffic and | 45 | * The inode lookup is done in batches to keep the amount of lock traffic and |
44 | * radix tree lookups to a minimum. The batch size is a trade off between | 46 | * radix tree lookups to a minimum. The batch size is a trade off between |
@@ -489,32 +491,6 @@ xfs_flush_inodes( | |||
489 | xfs_log_force(ip->i_mount, XFS_LOG_SYNC); | 491 | xfs_log_force(ip->i_mount, XFS_LOG_SYNC); |
490 | } | 492 | } |
491 | 493 | ||
492 | /* | ||
493 | * Every sync period we need to unpin all items, reclaim inodes and sync | ||
494 | * disk quotas. We might need to cover the log to indicate that the | ||
495 | * filesystem is idle and not frozen. | ||
496 | */ | ||
497 | STATIC void | ||
498 | xfs_sync_worker( | ||
499 | struct xfs_mount *mp, | ||
500 | void *unused) | ||
501 | { | ||
502 | int error; | ||
503 | |||
504 | if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { | ||
505 | /* dgc: errors ignored here */ | ||
506 | if (mp->m_super->s_frozen == SB_UNFROZEN && | ||
507 | xfs_log_need_covered(mp)) | ||
508 | error = xfs_fs_log_dummy(mp); | ||
509 | else | ||
510 | xfs_log_force(mp, 0); | ||
511 | xfs_reclaim_inodes(mp, 0); | ||
512 | error = xfs_qm_sync(mp, SYNC_TRYLOCK); | ||
513 | } | ||
514 | mp->m_sync_seq++; | ||
515 | wake_up(&mp->m_wait_single_sync_task); | ||
516 | } | ||
517 | |||
518 | STATIC int | 494 | STATIC int |
519 | xfssyncd( | 495 | xfssyncd( |
520 | void *arg) | 496 | void *arg) |
@@ -528,34 +504,19 @@ xfssyncd( | |||
528 | timeleft = xfs_syncd_centisecs * msecs_to_jiffies(10); | 504 | timeleft = xfs_syncd_centisecs * msecs_to_jiffies(10); |
529 | for (;;) { | 505 | for (;;) { |
530 | if (list_empty(&mp->m_sync_list)) | 506 | if (list_empty(&mp->m_sync_list)) |
531 | timeleft = schedule_timeout_interruptible(timeleft); | 507 | schedule_timeout_interruptible(timeleft); |
532 | /* swsusp */ | 508 | /* swsusp */ |
533 | try_to_freeze(); | 509 | try_to_freeze(); |
534 | if (kthread_should_stop() && list_empty(&mp->m_sync_list)) | 510 | if (kthread_should_stop() && list_empty(&mp->m_sync_list)) |
535 | break; | 511 | break; |
536 | 512 | ||
537 | spin_lock(&mp->m_sync_lock); | 513 | spin_lock(&mp->m_sync_lock); |
538 | /* | ||
539 | * We can get woken by laptop mode, to do a sync - | ||
540 | * that's the (only!) case where the list would be | ||
541 | * empty with time remaining. | ||
542 | */ | ||
543 | if (!timeleft || list_empty(&mp->m_sync_list)) { | ||
544 | if (!timeleft) | ||
545 | timeleft = xfs_syncd_centisecs * | ||
546 | msecs_to_jiffies(10); | ||
547 | INIT_LIST_HEAD(&mp->m_sync_work.w_list); | ||
548 | list_add_tail(&mp->m_sync_work.w_list, | ||
549 | &mp->m_sync_list); | ||
550 | } | ||
551 | list_splice_init(&mp->m_sync_list, &tmp); | 514 | list_splice_init(&mp->m_sync_list, &tmp); |
552 | spin_unlock(&mp->m_sync_lock); | 515 | spin_unlock(&mp->m_sync_lock); |
553 | 516 | ||
554 | list_for_each_entry_safe(work, n, &tmp, w_list) { | 517 | list_for_each_entry_safe(work, n, &tmp, w_list) { |
555 | (*work->w_syncer)(mp, work->w_data); | 518 | (*work->w_syncer)(mp, work->w_data); |
556 | list_del(&work->w_list); | 519 | list_del(&work->w_list); |
557 | if (work == &mp->m_sync_work) | ||
558 | continue; | ||
559 | if (work->w_completion) | 520 | if (work->w_completion) |
560 | complete(work->w_completion); | 521 | complete(work->w_completion); |
561 | kmem_free(work); | 522 | kmem_free(work); |
@@ -565,13 +526,49 @@ xfssyncd( | |||
565 | return 0; | 526 | return 0; |
566 | } | 527 | } |
567 | 528 | ||
529 | static void | ||
530 | xfs_syncd_queue_sync( | ||
531 | struct xfs_mount *mp) | ||
532 | { | ||
533 | queue_delayed_work(xfs_syncd_wq, &mp->m_sync_work, | ||
534 | msecs_to_jiffies(xfs_syncd_centisecs * 10)); | ||
535 | } | ||
536 | |||
537 | /* | ||
538 | * Every sync period we need to unpin all items, reclaim inodes and sync | ||
539 | * disk quotas. We might need to cover the log to indicate that the | ||
540 | * filesystem is idle and not frozen. | ||
541 | */ | ||
542 | STATIC void | ||
543 | xfs_sync_worker( | ||
544 | struct work_struct *work) | ||
545 | { | ||
546 | struct xfs_mount *mp = container_of(to_delayed_work(work), | ||
547 | struct xfs_mount, m_sync_work); | ||
548 | int error; | ||
549 | |||
550 | if (!(mp->m_flags & XFS_MOUNT_RDONLY)) { | ||
551 | /* dgc: errors ignored here */ | ||
552 | if (mp->m_super->s_frozen == SB_UNFROZEN && | ||
553 | xfs_log_need_covered(mp)) | ||
554 | error = xfs_fs_log_dummy(mp); | ||
555 | else | ||
556 | xfs_log_force(mp, 0); | ||
557 | xfs_reclaim_inodes(mp, 0); | ||
558 | error = xfs_qm_sync(mp, SYNC_TRYLOCK); | ||
559 | } | ||
560 | |||
561 | /* queue us up again */ | ||
562 | xfs_syncd_queue_sync(mp); | ||
563 | } | ||
564 | |||
568 | int | 565 | int |
569 | xfs_syncd_init( | 566 | xfs_syncd_init( |
570 | struct xfs_mount *mp) | 567 | struct xfs_mount *mp) |
571 | { | 568 | { |
572 | mp->m_sync_work.w_syncer = xfs_sync_worker; | 569 | INIT_DELAYED_WORK(&mp->m_sync_work, xfs_sync_worker); |
573 | mp->m_sync_work.w_mount = mp; | 570 | xfs_syncd_queue_sync(mp); |
574 | mp->m_sync_work.w_completion = NULL; | 571 | |
575 | mp->m_sync_task = kthread_run(xfssyncd, mp, "xfssyncd/%s", mp->m_fsname); | 572 | mp->m_sync_task = kthread_run(xfssyncd, mp, "xfssyncd/%s", mp->m_fsname); |
576 | if (IS_ERR(mp->m_sync_task)) | 573 | if (IS_ERR(mp->m_sync_task)) |
577 | return -PTR_ERR(mp->m_sync_task); | 574 | return -PTR_ERR(mp->m_sync_task); |
@@ -582,6 +579,7 @@ void | |||
582 | xfs_syncd_stop( | 579 | xfs_syncd_stop( |
583 | struct xfs_mount *mp) | 580 | struct xfs_mount *mp) |
584 | { | 581 | { |
582 | cancel_delayed_work_sync(&mp->m_sync_work); | ||
585 | kthread_stop(mp->m_sync_task); | 583 | kthread_stop(mp->m_sync_task); |
586 | } | 584 | } |
587 | 585 | ||