Merge tag 'media/v3.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab...
[cascardo/linux.git] / fs / xfs / xfs_buf.c
index 24b4ebe..bb502a3 100644 (file)
 #include <linux/backing-dev.h>
 #include <linux/freezer.h>
 
+#include "xfs_format.h"
 #include "xfs_log_format.h"
 #include "xfs_trans_resv.h"
 #include "xfs_sb.h"
-#include "xfs_ag.h"
 #include "xfs_mount.h"
 #include "xfs_trace.h"
 #include "xfs_log.h"
 
 static kmem_zone_t *xfs_buf_zone;
 
-static struct workqueue_struct *xfslogd_workqueue;
-
 #ifdef XFS_BUF_LOCK_TRACKING
 # define XB_SET_OWNER(bp)      ((bp)->b_last_holder = current->pid)
 # define XB_CLEAR_OWNER(bp)    ((bp)->b_last_holder = -1)
@@ -463,7 +461,7 @@ _xfs_buf_find(
         * have to check that the buffer falls within the filesystem bounds.
         */
        eofs = XFS_FSB_TO_BB(btp->bt_mount, btp->bt_mount->m_sb.sb_dblocks);
-       if (blkno >= eofs) {
+       if (blkno < 0 || blkno >= eofs) {
                /*
                 * XXX (dgc): we should really be returning -EFSCORRUPTED here,
                 * but none of the higher level infrastructure supports
@@ -1043,7 +1041,7 @@ xfs_buf_ioend_work(
        struct work_struct      *work)
 {
        struct xfs_buf          *bp =
-               container_of(work, xfs_buf_t, b_iodone_work);
+               container_of(work, xfs_buf_t, b_ioend_work);
 
        xfs_buf_ioend(bp);
 }
@@ -1052,8 +1050,8 @@ void
 xfs_buf_ioend_async(
        struct xfs_buf  *bp)
 {
-       INIT_WORK(&bp->b_iodone_work, xfs_buf_ioend_work);
-       queue_work(xfslogd_workqueue, &bp->b_iodone_work);
+       INIT_WORK(&bp->b_ioend_work, xfs_buf_ioend_work);
+       queue_work(bp->b_ioend_wq, &bp->b_ioend_work);
 }
 
 void
@@ -1222,6 +1220,13 @@ _xfs_buf_ioapply(
         */
        bp->b_error = 0;
 
+       /*
+        * Initialize the I/O completion workqueue if we haven't yet or the
+        * submitter has not opted to specify a custom one.
+        */
+       if (!bp->b_ioend_wq)
+               bp->b_ioend_wq = bp->b_target->bt_mount->m_buf_workqueue;
+
        if (bp->b_flags & XBF_WRITE) {
                if (bp->b_flags & XBF_SYNCIO)
                        rw = WRITE_SYNC;
@@ -1882,15 +1887,8 @@ xfs_buf_init(void)
        if (!xfs_buf_zone)
                goto out;
 
-       xfslogd_workqueue = alloc_workqueue("xfslogd",
-                               WQ_MEM_RECLAIM | WQ_HIGHPRI | WQ_FREEZABLE, 1);
-       if (!xfslogd_workqueue)
-               goto out_free_buf_zone;
-
        return 0;
 
- out_free_buf_zone:
-       kmem_zone_destroy(xfs_buf_zone);
  out:
        return -ENOMEM;
 }
@@ -1898,6 +1896,5 @@ xfs_buf_init(void)
 void
 xfs_buf_terminate(void)
 {
-       destroy_workqueue(xfslogd_workqueue);
        kmem_zone_destroy(xfs_buf_zone);
 }