tools headers UAPI: Sync drm/i915_drm.h with the kernel sources
[linux-2.6-microblaze.git] / fs / block_dev.c
index 235b504..ec26179 100644 (file)
@@ -126,7 +126,6 @@ int truncate_bdev_range(struct block_device *bdev, fmode_t mode,
                bd_abort_claiming(bdev, truncate_bdev_range);
        return 0;
 }
-EXPORT_SYMBOL(truncate_bdev_range);
 
 static void set_init_blocksize(struct block_device *bdev)
 {
@@ -424,7 +423,7 @@ __blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter, int nr_pages)
                dio->size += bio->bi_iter.bi_size;
                pos += bio->bi_iter.bi_size;
 
-               nr_pages = iov_iter_npages(iter, BIO_MAX_PAGES);
+               nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_PAGES);
                if (!nr_pages) {
                        bool polled = false;
 
@@ -489,9 +488,10 @@ blkdev_direct_IO(struct kiocb *iocb, struct iov_iter *iter)
 {
        int nr_pages;
 
-       nr_pages = iov_iter_npages(iter, BIO_MAX_PAGES + 1);
-       if (!nr_pages)
+       if (!iov_iter_count(iter))
                return 0;
+
+       nr_pages = bio_iov_vecs_to_alloc(iter, BIO_MAX_PAGES + 1);
        if (is_sync_kiocb(iocb) && nr_pages <= BIO_MAX_PAGES)
                return __blkdev_direct_IO_simple(iocb, iter, nr_pages);
 
@@ -688,7 +688,7 @@ int blkdev_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
         * i_mutex and doing so causes performance issues with concurrent
         * O_SYNC writers to a block device.
         */
-       error = blkdev_issue_flush(bdev, GFP_KERNEL);
+       error = blkdev_issue_flush(bdev);
        if (error == -EOPNOTSUPP)
                error = 0;
 
@@ -1808,13 +1808,11 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
                return error;
 
        /*
-        * Invalidate again; if someone wandered in and dirtied a page,
-        * the caller will be given -EBUSY.  The third argument is
-        * inclusive, so the rounding here is safe.
+        * Invalidate the page cache again; if someone wandered in and dirtied
+        * a page, we just discard it - userspace has no way of knowing whether
+        * the write happened before or after discard completing...
         */
-       return invalidate_inode_pages2_range(bdev->bd_inode->i_mapping,
-                                            start >> PAGE_SHIFT,
-                                            end >> PAGE_SHIFT);
+       return truncate_bdev_range(bdev, file->f_mode, start, end);
 }
 
 const struct file_operations def_blk_fops = {