NFS client bugfixes for Linux 4.14
Hightlights include: - Fix a list corruption in xprt_release() - Fix a workqueue lockdep warning due to unsafe use of cancel_work_sync() -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJZ78OhAAoJEGcL54qWCgDyozoP/1I6Tv5MtzvUo0si+7JVeyCS /ANXTXpGhuFqUCxbyZxyel+z8MG9QXILteFrVqxOhPMDrYwDwGF6xxpX+AsPSrQM Vs2JHoDZOPc48PSbPzIOAZSqCETZGgbjE7hd3UHHEyQ/ByqzIqZr3hekT04mis0D jVQ6Sy1a7mXJPbFrNTrpaGC5IJ1ahMkQoqfBEp6wqUbqFgJusM4vV+8+/QPS1W2M 7lUDCBj9z7y++NzMff3uEpGzM3K55SimWpNyoDuoEkmnv7fzFqHMHeunsjCz1tfp LJbAv7PnDGuQsnSm+0Q5SYg7F1k42qAVTBuKGUTrj0BQDcf75bdDdF9mTE46DZPa lFPgHpNpru0AXNdzobaYl5WQ3yulsQI67hilo3jkYLXAqJKI0/Wm2ivFaqIJbfYm d7y0GivNva32lW642+xFQGNgMCzZJtv4z8Jjfgg/aMP/geldcQI+h9oiQUDWXsKG 19EJUnIhdn7BrFCDLRnac/8MnP3Cr995JPsTj3cipgzvPb6gtJsWBH72tvCAapcu M79szhJAA6lgdro0m8hzRgAOtk8r/YR0cX5x+IH4q5imMx3KaJkFG9xmzMzGG4Ry PxlRkcQTPOK+8pSrwZ3dm49/uCfQGhNfBZo6ES0NBQF63kSq6OBmPqw+TVpzMeD/ Jg1A0PqcqnDfIMz1s2j8 =M0ih -----END PGP SIGNATURE----- Merge tag 'nfs-for-4.14-4' of git://git.linux-nfs.org/projects/trondmy/linux-nfs Pull NFS client bugfixes from Trond Myklebust: - Fix a list corruption in xprt_release() - Fix a workqueue lockdep warning due to unsafe use of cancel_work_sync() * tag 'nfs-for-4.14-4' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: SUNRPC: Destroy transport from the system workqueue SUNRPC: fix a list corruption issue in xprt_release()
This commit is contained in:
commit
f34157878d
|
@ -1333,7 +1333,7 @@ void xprt_release(struct rpc_task *task)
|
|||
rpc_count_iostats(task, task->tk_client->cl_metrics);
|
||||
spin_lock(&xprt->recv_lock);
|
||||
if (!list_empty(&req->rq_list)) {
|
||||
list_del(&req->rq_list);
|
||||
list_del_init(&req->rq_list);
|
||||
xprt_wait_on_pinned_rqst(req);
|
||||
}
|
||||
spin_unlock(&xprt->recv_lock);
|
||||
|
@ -1445,6 +1445,23 @@ out:
|
|||
return xprt;
|
||||
}
|
||||
|
||||
static void xprt_destroy_cb(struct work_struct *work)
|
||||
{
|
||||
struct rpc_xprt *xprt =
|
||||
container_of(work, struct rpc_xprt, task_cleanup);
|
||||
|
||||
rpc_xprt_debugfs_unregister(xprt);
|
||||
rpc_destroy_wait_queue(&xprt->binding);
|
||||
rpc_destroy_wait_queue(&xprt->pending);
|
||||
rpc_destroy_wait_queue(&xprt->sending);
|
||||
rpc_destroy_wait_queue(&xprt->backlog);
|
||||
kfree(xprt->servername);
|
||||
/*
|
||||
* Tear down transport state and free the rpc_xprt
|
||||
*/
|
||||
xprt->ops->destroy(xprt);
|
||||
}
|
||||
|
||||
/**
|
||||
* xprt_destroy - destroy an RPC transport, killing off all requests.
|
||||
* @xprt: transport to destroy
|
||||
|
@ -1454,22 +1471,19 @@ static void xprt_destroy(struct rpc_xprt *xprt)
|
|||
{
|
||||
dprintk("RPC: destroying transport %p\n", xprt);
|
||||
|
||||
/* Exclude transport connect/disconnect handlers */
|
||||
/*
|
||||
* Exclude transport connect/disconnect handlers and autoclose
|
||||
*/
|
||||
wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_UNINTERRUPTIBLE);
|
||||
|
||||
del_timer_sync(&xprt->timer);
|
||||
|
||||
rpc_xprt_debugfs_unregister(xprt);
|
||||
rpc_destroy_wait_queue(&xprt->binding);
|
||||
rpc_destroy_wait_queue(&xprt->pending);
|
||||
rpc_destroy_wait_queue(&xprt->sending);
|
||||
rpc_destroy_wait_queue(&xprt->backlog);
|
||||
cancel_work_sync(&xprt->task_cleanup);
|
||||
kfree(xprt->servername);
|
||||
/*
|
||||
* Tear down transport state and free the rpc_xprt
|
||||
* Destroy sockets etc from the system workqueue so they can
|
||||
* safely flush receive work running on rpciod.
|
||||
*/
|
||||
xprt->ops->destroy(xprt);
|
||||
INIT_WORK(&xprt->task_cleanup, xprt_destroy_cb);
|
||||
schedule_work(&xprt->task_cleanup);
|
||||
}
|
||||
|
||||
static void xprt_destroy_kref(struct kref *kref)
|
||||
|
|
Loading…
Reference in New Issue