dax: use sb_issue_zerout instead of calling dax_clear_sectors
authorMatthew Wilcox <matthew.r.wilcox@intel.com>
Tue, 15 Mar 2016 17:20:41 +0000 (11:20 -0600)
committerVishal Verma <vishal.l.verma@intel.com>
Wed, 18 May 2016 18:16:56 +0000 (12:16 -0600)
dax_clear_sectors() cannot handle poisoned blocks.  These must be
zeroed using the BIO interface instead.  Convert ext2 and XFS to use
only sb_issue_zerout().

Reviewed-by: Jeff Moyer <jmoyer@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Matthew Wilcox <matthew.r.wilcox@intel.com>
[vishal: Also remove the dax_clear_sectors function entirely]
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
fs/dax.c
fs/ext2/inode.c
fs/xfs/xfs_bmap_util.c
include/linux/dax.h

index d602410..0abbbb6 100644 (file)
--- a/fs/dax.c
+++ b/fs/dax.c
@@ -87,38 +87,6 @@ struct page *read_dax_sector(struct block_device *bdev, sector_t n)
        return page;
 }
 
-/*
- * dax_clear_sectors() is called from within transaction context from XFS,
- * and hence this means the stack from this point must follow GFP_NOFS
- * semantics for all operations.
- */
-int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size)
-{
-       struct blk_dax_ctl dax = {
-               .sector = _sector,
-               .size = _size,
-       };
-
-       might_sleep();
-       do {
-               long count, sz;
-
-               count = dax_map_atomic(bdev, &dax);
-               if (count < 0)
-                       return count;
-               sz = min_t(long, count, SZ_128K);
-               clear_pmem(dax.addr, sz);
-               dax.size -= sz;
-               dax.sector += sz / 512;
-               dax_unmap_atomic(bdev, &dax);
-               cond_resched();
-       } while (dax.size);
-
-       wmb_pmem();
-       return 0;
-}
-EXPORT_SYMBOL_GPL(dax_clear_sectors);
-
 static bool buffer_written(struct buffer_head *bh)
 {
        return buffer_mapped(bh) && !buffer_unwritten(bh);
index 9a14af3..17cbd6b 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/highuid.h>
 #include <linux/pagemap.h>
 #include <linux/dax.h>
+#include <linux/blkdev.h>
 #include <linux/quotaops.h>
 #include <linux/writeback.h>
 #include <linux/buffer_head.h>
@@ -737,10 +738,9 @@ static int ext2_get_blocks(struct inode *inode,
                 * so that it's not found by another thread before it's
                 * initialised
                 */
-               err = dax_clear_sectors(inode->i_sb->s_bdev,
-                               le32_to_cpu(chain[depth-1].key) <<
-                               (inode->i_blkbits - 9),
-                               count << inode->i_blkbits);
+               err = sb_issue_zeroout(inode->i_sb,
+                               le32_to_cpu(chain[depth-1].key), count,
+                               GFP_NOFS);
                if (err) {
                        mutex_unlock(&ei->truncate_mutex);
                        goto cleanup;
index 3b63098..930ac6a 100644 (file)
@@ -72,18 +72,11 @@ xfs_zero_extent(
        struct xfs_mount *mp = ip->i_mount;
        xfs_daddr_t     sector = xfs_fsb_to_db(ip, start_fsb);
        sector_t        block = XFS_BB_TO_FSBT(mp, sector);
-       ssize_t         size = XFS_FSB_TO_B(mp, count_fsb);
-
-       if (IS_DAX(VFS_I(ip)))
-               return dax_clear_sectors(xfs_find_bdev_for_inode(VFS_I(ip)),
-                               sector, size);
-
-       /*
-        * let the block layer decide on the fastest method of
-        * implementing the zeroing.
-        */
-       return sb_issue_zeroout(mp->m_super, block, count_fsb, GFP_NOFS);
 
+       return blkdev_issue_zeroout(xfs_find_bdev_for_inode(VFS_I(ip)),
+               block << (mp->m_super->s_blocksize_bits - 9),
+               count_fsb << (mp->m_super->s_blocksize_bits - 9),
+               GFP_NOFS, true);
 }
 
 /*
index 7c45ac7..7f853ff 100644 (file)
@@ -7,7 +7,6 @@
 
 ssize_t dax_do_io(struct kiocb *, struct inode *, struct iov_iter *, loff_t,
                  get_block_t, dio_iodone_t, int flags);
-int dax_clear_sectors(struct block_device *bdev, sector_t _sector, long _size);
 int dax_zero_page_range(struct inode *, loff_t from, unsigned len, get_block_t);
 int dax_truncate_page(struct inode *, loff_t from, get_block_t);
 int dax_fault(struct vm_area_struct *, struct vm_fault *, get_block_t);