diff options
author | Christoph Hellwig <hch@sgi.com> | 2005-09-04 18:34:18 -0400 |
---|---|---|
committer | Nathan Scott <nathans@sgi.com> | 2005-09-04 18:34:18 -0400 |
commit | 4df08c52582be558e12316ae60bf077ca8f17a1e (patch) | |
tree | 11d32ac6553e26198ec1be4b830f57c8668d7cca | |
parent | 2f926587512869ebf6bc820bd5f030e127aae774 (diff) |
[XFS] Switch kernel thread handling to the kthread_ API
SGI-PV: 942063
SGI-Modid: xfs-linux:xfs-kern:198388a
Signed-off-by: Christoph Hellwig <hch@sgi.com>
Signed-off-by: Nathan Scott <nathans@sgi.com>
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 24 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 36 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vfs.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_vfs.h | 2 |
4 files changed, 17 insertions, 46 deletions
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index e6340906342c..655bf4a78afe 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include <linux/percpu.h> | 54 | #include <linux/percpu.h> |
55 | #include <linux/blkdev.h> | 55 | #include <linux/blkdev.h> |
56 | #include <linux/hash.h> | 56 | #include <linux/hash.h> |
57 | #include <linux/kthread.h> | ||
57 | 58 | ||
58 | #include "xfs_linux.h" | 59 | #include "xfs_linux.h" |
59 | 60 | ||
@@ -1742,9 +1743,7 @@ pagebuf_runall_queues( | |||
1742 | } | 1743 | } |
1743 | 1744 | ||
1744 | /* Defines for pagebuf daemon */ | 1745 | /* Defines for pagebuf daemon */ |
1745 | STATIC DECLARE_COMPLETION(xfsbufd_done); | ||
1746 | STATIC struct task_struct *xfsbufd_task; | 1746 | STATIC struct task_struct *xfsbufd_task; |
1747 | STATIC int xfsbufd_active; | ||
1748 | STATIC int xfsbufd_force_flush; | 1747 | STATIC int xfsbufd_force_flush; |
1749 | STATIC int xfsbufd_force_sleep; | 1748 | STATIC int xfsbufd_force_sleep; |
1750 | 1749 | ||
@@ -1770,14 +1769,8 @@ xfsbufd( | |||
1770 | xfs_buftarg_t *target; | 1769 | xfs_buftarg_t *target; |
1771 | xfs_buf_t *pb, *n; | 1770 | xfs_buf_t *pb, *n; |
1772 | 1771 | ||
1773 | /* Set up the thread */ | ||
1774 | daemonize("xfsbufd"); | ||
1775 | current->flags |= PF_MEMALLOC; | 1772 | current->flags |= PF_MEMALLOC; |
1776 | 1773 | ||
1777 | xfsbufd_task = current; | ||
1778 | xfsbufd_active = 1; | ||
1779 | barrier(); | ||
1780 | |||
1781 | INIT_LIST_HEAD(&tmp); | 1774 | INIT_LIST_HEAD(&tmp); |
1782 | do { | 1775 | do { |
1783 | if (unlikely(freezing(current))) { | 1776 | if (unlikely(freezing(current))) { |
@@ -1825,9 +1818,9 @@ xfsbufd( | |||
1825 | purge_addresses(); | 1818 | purge_addresses(); |
1826 | 1819 | ||
1827 | xfsbufd_force_flush = 0; | 1820 | xfsbufd_force_flush = 0; |
1828 | } while (xfsbufd_active); | 1821 | } while (!kthread_should_stop()); |
1829 | 1822 | ||
1830 | complete_and_exit(&xfsbufd_done, 0); | 1823 | return 0; |
1831 | } | 1824 | } |
1832 | 1825 | ||
1833 | /* | 1826 | /* |
@@ -1910,9 +1903,11 @@ xfs_buf_daemons_start(void) | |||
1910 | if (!xfsdatad_workqueue) | 1903 | if (!xfsdatad_workqueue) |
1911 | goto out_destroy_xfslogd_workqueue; | 1904 | goto out_destroy_xfslogd_workqueue; |
1912 | 1905 | ||
1913 | error = kernel_thread(xfsbufd, NULL, CLONE_FS|CLONE_FILES); | 1906 | xfsbufd_task = kthread_run(xfsbufd, NULL, "xfsbufd"); |
1914 | if (error < 0) | 1907 | if (IS_ERR(xfsbufd_task)) { |
1908 | error = PTR_ERR(xfsbufd_task); | ||
1915 | goto out_destroy_xfsdatad_workqueue; | 1909 | goto out_destroy_xfsdatad_workqueue; |
1910 | } | ||
1916 | return 0; | 1911 | return 0; |
1917 | 1912 | ||
1918 | out_destroy_xfsdatad_workqueue: | 1913 | out_destroy_xfsdatad_workqueue: |
@@ -1929,10 +1924,7 @@ xfs_buf_daemons_start(void) | |||
1929 | STATIC void | 1924 | STATIC void |
1930 | xfs_buf_daemons_stop(void) | 1925 | xfs_buf_daemons_stop(void) |
1931 | { | 1926 | { |
1932 | xfsbufd_active = 0; | 1927 | kthread_stop(xfsbufd_task); |
1933 | barrier(); | ||
1934 | wait_for_completion(&xfsbufd_done); | ||
1935 | |||
1936 | destroy_workqueue(xfslogd_workqueue); | 1928 | destroy_workqueue(xfslogd_workqueue); |
1937 | destroy_workqueue(xfsdatad_workqueue); | 1929 | destroy_workqueue(xfsdatad_workqueue); |
1938 | } | 1930 | } |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 910e43bfc95b..0da87bfc9999 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -72,6 +72,7 @@ | |||
72 | #include <linux/mount.h> | 72 | #include <linux/mount.h> |
73 | #include <linux/mempool.h> | 73 | #include <linux/mempool.h> |
74 | #include <linux/writeback.h> | 74 | #include <linux/writeback.h> |
75 | #include <linux/kthread.h> | ||
75 | 76 | ||
76 | STATIC struct quotactl_ops linvfs_qops; | 77 | STATIC struct quotactl_ops linvfs_qops; |
77 | STATIC struct super_operations linvfs_sops; | 78 | STATIC struct super_operations linvfs_sops; |
@@ -516,25 +517,16 @@ xfssyncd( | |||
516 | { | 517 | { |
517 | long timeleft; | 518 | long timeleft; |
518 | vfs_t *vfsp = (vfs_t *) arg; | 519 | vfs_t *vfsp = (vfs_t *) arg; |
519 | struct list_head tmp; | ||
520 | struct vfs_sync_work *work, *n; | 520 | struct vfs_sync_work *work, *n; |
521 | LIST_HEAD (tmp); | ||
521 | 522 | ||
522 | daemonize("xfssyncd"); | ||
523 | |||
524 | vfsp->vfs_sync_work.w_vfs = vfsp; | ||
525 | vfsp->vfs_sync_work.w_syncer = vfs_sync_worker; | ||
526 | vfsp->vfs_sync_task = current; | ||
527 | wmb(); | ||
528 | wake_up(&vfsp->vfs_wait_sync_task); | ||
529 | |||
530 | INIT_LIST_HEAD(&tmp); | ||
531 | timeleft = (xfs_syncd_centisecs * HZ) / 100; | 523 | timeleft = (xfs_syncd_centisecs * HZ) / 100; |
532 | for (;;) { | 524 | for (;;) { |
533 | set_current_state(TASK_INTERRUPTIBLE); | 525 | set_current_state(TASK_INTERRUPTIBLE); |
534 | timeleft = schedule_timeout(timeleft); | 526 | timeleft = schedule_timeout(timeleft); |
535 | /* swsusp */ | 527 | /* swsusp */ |
536 | try_to_freeze(); | 528 | try_to_freeze(); |
537 | if (vfsp->vfs_flag & VFS_UMOUNT) | 529 | if (kthread_should_stop()) |
538 | break; | 530 | break; |
539 | 531 | ||
540 | spin_lock(&vfsp->vfs_sync_lock); | 532 | spin_lock(&vfsp->vfs_sync_lock); |
@@ -563,10 +555,6 @@ xfssyncd( | |||
563 | } | 555 | } |
564 | } | 556 | } |
565 | 557 | ||
566 | vfsp->vfs_sync_task = NULL; | ||
567 | wmb(); | ||
568 | wake_up(&vfsp->vfs_wait_sync_task); | ||
569 | |||
570 | return 0; | 558 | return 0; |
571 | } | 559 | } |
572 | 560 | ||
@@ -574,13 +562,11 @@ STATIC int | |||
574 | linvfs_start_syncd( | 562 | linvfs_start_syncd( |
575 | vfs_t *vfsp) | 563 | vfs_t *vfsp) |
576 | { | 564 | { |
577 | int pid; | 565 | vfsp->vfs_sync_work.w_syncer = vfs_sync_worker; |
578 | 566 | vfsp->vfs_sync_work.w_vfs = vfsp; | |
579 | pid = kernel_thread(xfssyncd, (void *) vfsp, | 567 | vfsp->vfs_sync_task = kthread_run(xfssyncd, vfsp, "xfssyncd"); |
580 | CLONE_VM | CLONE_FS | CLONE_FILES); | 568 | if (IS_ERR(vfsp->vfs_sync_task)) |
581 | if (pid < 0) | 569 | return -PTR_ERR(vfsp->vfs_sync_task); |
582 | return -pid; | ||
583 | wait_event(vfsp->vfs_wait_sync_task, vfsp->vfs_sync_task); | ||
584 | return 0; | 570 | return 0; |
585 | } | 571 | } |
586 | 572 | ||
@@ -588,11 +574,7 @@ STATIC void | |||
588 | linvfs_stop_syncd( | 574 | linvfs_stop_syncd( |
589 | vfs_t *vfsp) | 575 | vfs_t *vfsp) |
590 | { | 576 | { |
591 | vfsp->vfs_flag |= VFS_UMOUNT; | 577 | kthread_stop(vfsp->vfs_sync_task); |
592 | wmb(); | ||
593 | |||
594 | wake_up_process(vfsp->vfs_sync_task); | ||
595 | wait_event(vfsp->vfs_wait_sync_task, !vfsp->vfs_sync_task); | ||
596 | } | 578 | } |
597 | 579 | ||
598 | STATIC void | 580 | STATIC void |
diff --git a/fs/xfs/linux-2.6/xfs_vfs.c b/fs/xfs/linux-2.6/xfs_vfs.c index 669c61644959..34cc902ec119 100644 --- a/fs/xfs/linux-2.6/xfs_vfs.c +++ b/fs/xfs/linux-2.6/xfs_vfs.c | |||
@@ -251,7 +251,6 @@ vfs_allocate( void ) | |||
251 | bhv_head_init(VFS_BHVHEAD(vfsp), "vfs"); | 251 | bhv_head_init(VFS_BHVHEAD(vfsp), "vfs"); |
252 | INIT_LIST_HEAD(&vfsp->vfs_sync_list); | 252 | INIT_LIST_HEAD(&vfsp->vfs_sync_list); |
253 | spin_lock_init(&vfsp->vfs_sync_lock); | 253 | spin_lock_init(&vfsp->vfs_sync_lock); |
254 | init_waitqueue_head(&vfsp->vfs_wait_sync_task); | ||
255 | init_waitqueue_head(&vfsp->vfs_wait_single_sync_task); | 254 | init_waitqueue_head(&vfsp->vfs_wait_single_sync_task); |
256 | return vfsp; | 255 | return vfsp; |
257 | } | 256 | } |
diff --git a/fs/xfs/linux-2.6/xfs_vfs.h b/fs/xfs/linux-2.6/xfs_vfs.h index 7ee1f714e9ba..f0ab574fb47a 100644 --- a/fs/xfs/linux-2.6/xfs_vfs.h +++ b/fs/xfs/linux-2.6/xfs_vfs.h | |||
@@ -65,7 +65,6 @@ typedef struct vfs { | |||
65 | spinlock_t vfs_sync_lock; /* work item list lock */ | 65 | spinlock_t vfs_sync_lock; /* work item list lock */ |
66 | int vfs_sync_seq; /* sync thread generation no. */ | 66 | int vfs_sync_seq; /* sync thread generation no. */ |
67 | wait_queue_head_t vfs_wait_single_sync_task; | 67 | wait_queue_head_t vfs_wait_single_sync_task; |
68 | wait_queue_head_t vfs_wait_sync_task; | ||
69 | } vfs_t; | 68 | } vfs_t; |
70 | 69 | ||
71 | #define vfs_fbhv vfs_bh.bh_first /* 1st on vfs behavior chain */ | 70 | #define vfs_fbhv vfs_bh.bh_first /* 1st on vfs behavior chain */ |
@@ -96,7 +95,6 @@ typedef enum { | |||
96 | #define VFS_RDONLY 0x0001 /* read-only vfs */ | 95 | #define VFS_RDONLY 0x0001 /* read-only vfs */ |
97 | #define VFS_GRPID 0x0002 /* group-ID assigned from directory */ | 96 | #define VFS_GRPID 0x0002 /* group-ID assigned from directory */ |
98 | #define VFS_DMI 0x0004 /* filesystem has the DMI enabled */ | 97 | #define VFS_DMI 0x0004 /* filesystem has the DMI enabled */ |
99 | #define VFS_UMOUNT 0x0008 /* unmount in progress */ | ||
100 | #define VFS_END 0x0008 /* max flag */ | 98 | #define VFS_END 0x0008 /* max flag */ |
101 | 99 | ||
102 | #define SYNC_ATTR 0x0001 /* sync attributes */ | 100 | #define SYNC_ATTR 0x0001 /* sync attributes */ |