Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4df08c52 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Nathan Scott
Browse files

[XFS] Switch kernel thread handling to the kthread_ API



SGI-PV: 942063
SGI-Modid: xfs-linux:xfs-kern:198388a

Signed-off-by: default avatarChristoph Hellwig <hch@sgi.com>
Signed-off-by: default avatarNathan Scott <nathans@sgi.com>
parent 2f926587
Loading
Loading
Loading
Loading
+8 −16
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@
#include <linux/percpu.h>
#include <linux/blkdev.h>
#include <linux/hash.h>
#include <linux/kthread.h>

#include "xfs_linux.h"

@@ -1742,9 +1743,7 @@ pagebuf_runall_queues(
}

/* Defines for pagebuf daemon */
STATIC DECLARE_COMPLETION(xfsbufd_done);
STATIC struct task_struct *xfsbufd_task;
STATIC int xfsbufd_active;
STATIC int xfsbufd_force_flush;
STATIC int xfsbufd_force_sleep;

@@ -1770,14 +1769,8 @@ xfsbufd(
	xfs_buftarg_t		*target;
	xfs_buf_t		*pb, *n;

	/*  Set up the thread  */
	daemonize("xfsbufd");
	current->flags |= PF_MEMALLOC;

	xfsbufd_task = current;
	xfsbufd_active = 1;
	barrier();

	INIT_LIST_HEAD(&tmp);
	do {
		if (unlikely(freezing(current))) {
@@ -1825,9 +1818,9 @@ xfsbufd(
			purge_addresses();

		xfsbufd_force_flush = 0;
	} while (xfsbufd_active);
	} while (!kthread_should_stop());

	complete_and_exit(&xfsbufd_done, 0);
	return 0;
}

/*
@@ -1910,9 +1903,11 @@ xfs_buf_daemons_start(void)
	if (!xfsdatad_workqueue)
		goto out_destroy_xfslogd_workqueue;

	error = kernel_thread(xfsbufd, NULL, CLONE_FS|CLONE_FILES);
	if (error < 0)
	xfsbufd_task = kthread_run(xfsbufd, NULL, "xfsbufd");
	if (IS_ERR(xfsbufd_task)) {
		error = PTR_ERR(xfsbufd_task);
		goto out_destroy_xfsdatad_workqueue;
	}
	return 0;

 out_destroy_xfsdatad_workqueue:
@@ -1929,10 +1924,7 @@ xfs_buf_daemons_start(void)
STATIC void
xfs_buf_daemons_stop(void)
{
	xfsbufd_active = 0;
	barrier();
	wait_for_completion(&xfsbufd_done);

	kthread_stop(xfsbufd_task);
	destroy_workqueue(xfslogd_workqueue);
	destroy_workqueue(xfsdatad_workqueue);
}
+9 −27
Original line number Diff line number Diff line
@@ -72,6 +72,7 @@
#include <linux/mount.h>
#include <linux/mempool.h>
#include <linux/writeback.h>
#include <linux/kthread.h>

STATIC struct quotactl_ops linvfs_qops;
STATIC struct super_operations linvfs_sops;
@@ -516,25 +517,16 @@ xfssyncd(
{
	long			timeleft;
	vfs_t			*vfsp = (vfs_t *) arg;
	struct list_head	tmp;
	struct vfs_sync_work	*work, *n;
	LIST_HEAD		(tmp);

	daemonize("xfssyncd");

	vfsp->vfs_sync_work.w_vfs = vfsp;
	vfsp->vfs_sync_work.w_syncer = vfs_sync_worker;
	vfsp->vfs_sync_task = current;
	wmb();
	wake_up(&vfsp->vfs_wait_sync_task);

	INIT_LIST_HEAD(&tmp);
	timeleft = (xfs_syncd_centisecs * HZ) / 100;
	for (;;) {
		set_current_state(TASK_INTERRUPTIBLE);
		timeleft = schedule_timeout(timeleft);
		/* swsusp */
		try_to_freeze();
		if (vfsp->vfs_flag & VFS_UMOUNT)
		if (kthread_should_stop())
			break;

		spin_lock(&vfsp->vfs_sync_lock);
@@ -563,10 +555,6 @@ xfssyncd(
		}
	}

	vfsp->vfs_sync_task = NULL;
	wmb();
	wake_up(&vfsp->vfs_wait_sync_task);

	return 0;
}

@@ -574,13 +562,11 @@ STATIC int
linvfs_start_syncd(
	vfs_t			*vfsp)
{
	int			pid;

	pid = kernel_thread(xfssyncd, (void *) vfsp,
			CLONE_VM | CLONE_FS | CLONE_FILES);
	if (pid < 0)
		return -pid;
	wait_event(vfsp->vfs_wait_sync_task, vfsp->vfs_sync_task);
	vfsp->vfs_sync_work.w_syncer = vfs_sync_worker;
	vfsp->vfs_sync_work.w_vfs = vfsp;
	vfsp->vfs_sync_task = kthread_run(xfssyncd, vfsp, "xfssyncd");
	if (IS_ERR(vfsp->vfs_sync_task))
		return -PTR_ERR(vfsp->vfs_sync_task);
	return 0;
}

@@ -588,11 +574,7 @@ STATIC void
linvfs_stop_syncd(
	vfs_t			*vfsp)
{
	vfsp->vfs_flag |= VFS_UMOUNT;
	wmb();

	wake_up_process(vfsp->vfs_sync_task);
	wait_event(vfsp->vfs_wait_sync_task, !vfsp->vfs_sync_task);
	kthread_stop(vfsp->vfs_sync_task);
}

STATIC void
+0 −1
Original line number Diff line number Diff line
@@ -251,7 +251,6 @@ vfs_allocate( void )
	bhv_head_init(VFS_BHVHEAD(vfsp), "vfs");
	INIT_LIST_HEAD(&vfsp->vfs_sync_list);
	spin_lock_init(&vfsp->vfs_sync_lock);
	init_waitqueue_head(&vfsp->vfs_wait_sync_task);
	init_waitqueue_head(&vfsp->vfs_wait_single_sync_task);
	return vfsp;
}
+0 −2
Original line number Diff line number Diff line
@@ -65,7 +65,6 @@ typedef struct vfs {
	spinlock_t		vfs_sync_lock;	/* work item list lock */
	int 			vfs_sync_seq;	/* sync thread generation no. */
	wait_queue_head_t	vfs_wait_single_sync_task;
	wait_queue_head_t	vfs_wait_sync_task;
} vfs_t;

#define vfs_fbhv		vfs_bh.bh_first	/* 1st on vfs behavior chain */
@@ -96,7 +95,6 @@ typedef enum {
#define VFS_RDONLY		0x0001	/* read-only vfs */
#define VFS_GRPID		0x0002	/* group-ID assigned from directory */
#define VFS_DMI			0x0004	/* filesystem has the DMI enabled */
#define VFS_UMOUNT		0x0008	/* unmount in progress */
#define VFS_END			0x0008	/* max flag */

#define SYNC_ATTR		0x0001	/* sync attributes */