|
|
@@ -1527,6 +1527,16 @@ xfs_wait_buftarg(
|
|
|
LIST_HEAD(dispose);
|
|
|
int loop = 0;
|
|
|
|
|
|
+ /*
|
|
|
+ * We need to flush the buffer workqueue to ensure that all IO
|
|
|
+ * completion processing is 100% done. Just waiting on buffer locks is
|
|
|
+ * not sufficient for async IO as the reference count held over IO is
|
|
|
+ * not released until after the buffer lock is dropped. Hence we need to
|
|
|
+ * ensure here that all reference counts have been dropped before we
|
|
|
+ * start walking the LRU list.
|
|
|
+ */
|
|
|
+ drain_workqueue(btp->bt_mount->m_buf_workqueue);
|
|
|
+
|
|
|
/* loop until there is nothing left on the lru list. */
|
|
|
while (list_lru_count(&btp->bt_lru)) {
|
|
|
list_lru_walk(&btp->bt_lru, xfs_buftarg_wait_rele,
|