Merge branch 'for-linus' of git://git.kernel.dk/linux-block
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 18 Oct 2017 18:43:40 +0000 (14:43 -0400)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 18 Oct 2017 18:43:40 +0000 (14:43 -0400)
Pull block fixes from Jens Axboe:
 "Three small fixes:

   - A fix for skd, it was using kfree() to free a structure allocate
     with kmem_cache_alloc().

   - Stable fix for nbd, fixing a regression using the normal ioctl
     based tools.

   - Fix for a previous fix in this series, that fixed up
     inconsistencies between buffered and direct IO"

* 'for-linus' of git://git.kernel.dk/linux-block:
  fs: Avoid invalidation in interrupt context in dio_complete()
  nbd: don't set the device size until we're connected
  skd: Use kmem_cache_free

1  2 
fs/direct-io.c

diff --combined fs/direct-io.c
  #define DIO_PAGES     64
  
  /*
+  * Flags for dio_complete()
+  */
+ #define DIO_COMPLETE_ASYNC            0x01    /* This is async IO */
+ #define DIO_COMPLETE_INVALIDATE               0x02    /* Can invalidate pages */
+ /*
   * This code generally works in units of "dio_blocks".  A dio_block is
   * somewhere between the hard sector size and the filesystem block size.  it
   * is determined on a per-invocation basis.   When talking to the filesystem
@@@ -225,7 -231,7 +231,7 @@@ static inline struct page *dio_get_page
   * filesystems can use it to hold additional state between get_block calls and
   * dio_complete.
   */
- static ssize_t dio_complete(struct dio *dio, ssize_t ret, bool is_async)
+ static ssize_t dio_complete(struct dio *dio, ssize_t ret, unsigned int flags)
  {
        loff_t offset = dio->iocb->ki_pos;
        ssize_t transferred = 0;
         * one is a pretty crazy thing to do, so we don't support it 100%.  If
         * this invalidation fails, tough, the write still worked...
         */
-       if (ret > 0 && dio->op == REQ_OP_WRITE &&
+       if (flags & DIO_COMPLETE_INVALIDATE &&
+           ret > 0 && dio->op == REQ_OP_WRITE &&
            dio->inode->i_mapping->nrpages) {
                err = invalidate_inode_pages2_range(dio->inode->i_mapping,
                                        offset >> PAGE_SHIFT,
        if (!(dio->flags & DIO_SKIP_DIO_COUNT))
                inode_dio_end(dio->inode);
  
-       if (is_async) {
+       if (flags & DIO_COMPLETE_ASYNC) {
                /*
                 * generic_write_sync expects ki_pos to have been updated
                 * already, but the submission path only does this for
@@@ -306,7 -313,7 +313,7 @@@ static void dio_aio_complete_work(struc
  {
        struct dio *dio = container_of(work, struct dio, complete_work);
  
-       dio_complete(dio, 0, true);
+       dio_complete(dio, 0, DIO_COMPLETE_ASYNC | DIO_COMPLETE_INVALIDATE);
  }
  
  static blk_status_t dio_bio_complete(struct dio *dio, struct bio *bio);
@@@ -348,7 -355,7 +355,7 @@@ static void dio_bio_end_aio(struct bio 
                        queue_work(dio->inode->i_sb->s_dio_done_wq,
                                   &dio->complete_work);
                } else {
-                       dio_complete(dio, 0, true);
+                       dio_complete(dio, 0, DIO_COMPLETE_ASYNC);
                }
        }
  }
@@@ -866,8 -873,7 +873,8 @@@ out
         */
        if (sdio->boundary) {
                ret = dio_send_cur_page(dio, sdio, map_bh);
 -              dio_bio_submit(dio, sdio);
 +              if (sdio->bio)
 +                      dio_bio_submit(dio, sdio);
                put_page(sdio->cur_page);
                sdio->cur_page = NULL;
        }
@@@ -1360,7 -1366,7 +1367,7 @@@ do_blockdev_direct_IO(struct kiocb *ioc
                dio_await_completion(dio);
  
        if (drop_refcount(dio) == 0) {
-               retval = dio_complete(dio, retval, false);
+               retval = dio_complete(dio, retval, DIO_COMPLETE_INVALIDATE);
        } else
                BUG_ON(retval != -EIOCBQUEUED);