|
@@ -51,6 +51,7 @@ static struct shrinker xfs_buf_shake = {
|
|
|
|
|
|
static struct workqueue_struct *xfslogd_workqueue;
|
|
static struct workqueue_struct *xfslogd_workqueue;
|
|
struct workqueue_struct *xfsdatad_workqueue;
|
|
struct workqueue_struct *xfsdatad_workqueue;
|
|
|
|
+struct workqueue_struct *xfsconvertd_workqueue;
|
|
|
|
|
|
#ifdef XFS_BUF_TRACE
|
|
#ifdef XFS_BUF_TRACE
|
|
void
|
|
void
|
|
@@ -1775,6 +1776,7 @@ xfs_flush_buftarg(
|
|
xfs_buf_t *bp, *n;
|
|
xfs_buf_t *bp, *n;
|
|
int pincount = 0;
|
|
int pincount = 0;
|
|
|
|
|
|
|
|
+ xfs_buf_runall_queues(xfsconvertd_workqueue);
|
|
xfs_buf_runall_queues(xfsdatad_workqueue);
|
|
xfs_buf_runall_queues(xfsdatad_workqueue);
|
|
xfs_buf_runall_queues(xfslogd_workqueue);
|
|
xfs_buf_runall_queues(xfslogd_workqueue);
|
|
|
|
|
|
@@ -1831,9 +1833,15 @@ xfs_buf_init(void)
|
|
if (!xfsdatad_workqueue)
|
|
if (!xfsdatad_workqueue)
|
|
goto out_destroy_xfslogd_workqueue;
|
|
goto out_destroy_xfslogd_workqueue;
|
|
|
|
|
|
|
|
+ xfsconvertd_workqueue = create_workqueue("xfsconvertd");
|
|
|
|
+ if (!xfsconvertd_workqueue)
|
|
|
|
+ goto out_destroy_xfsdatad_workqueue;
|
|
|
|
+
|
|
register_shrinker(&xfs_buf_shake);
|
|
register_shrinker(&xfs_buf_shake);
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
+ out_destroy_xfsdatad_workqueue:
|
|
|
|
+ destroy_workqueue(xfsdatad_workqueue);
|
|
out_destroy_xfslogd_workqueue:
|
|
out_destroy_xfslogd_workqueue:
|
|
destroy_workqueue(xfslogd_workqueue);
|
|
destroy_workqueue(xfslogd_workqueue);
|
|
out_free_buf_zone:
|
|
out_free_buf_zone:
|
|
@@ -1849,6 +1857,7 @@ void
|
|
xfs_buf_terminate(void)
|
|
xfs_buf_terminate(void)
|
|
{
|
|
{
|
|
unregister_shrinker(&xfs_buf_shake);
|
|
unregister_shrinker(&xfs_buf_shake);
|
|
|
|
+ destroy_workqueue(xfsconvertd_workqueue);
|
|
destroy_workqueue(xfsdatad_workqueue);
|
|
destroy_workqueue(xfsdatad_workqueue);
|
|
destroy_workqueue(xfslogd_workqueue);
|
|
destroy_workqueue(xfslogd_workqueue);
|
|
kmem_zone_destroy(xfs_buf_zone);
|
|
kmem_zone_destroy(xfs_buf_zone);
|