X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=fs%2Fdirect-io.c;h=08a8c037396252df1ef279c984b144a27c75ab3f;hb=f399038b276db24cccb6f97654214ba81c2d09a5;hp=7ab90f5081eebc4ab8b0de88bef8d0b6310ed113;hpb=88b0357dde1c2721a64268e4601d1c2dec1158b0;p=firefly-linux-kernel-4.4.55.git diff --git a/fs/direct-io.c b/fs/direct-io.c index 7ab90f5081ee..08a8c0373962 100644 --- a/fs/direct-io.c +++ b/fs/direct-io.c @@ -262,7 +262,9 @@ static ssize_t dio_complete(struct dio *dio, loff_t offset, ssize_t ret, bool is dio->end_io(dio->iocb, offset, transferred, dio->private, ret, is_async); } else { - inode_dio_done(dio->inode); + if (!(dio->flags & DIO_SKIP_DIO_COUNT)) + inode_dio_end(dio->inode); + if (is_async) aio_complete(dio->iocb, ret, 0); } @@ -370,6 +372,7 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) { struct bio *bio = sdio->bio; unsigned long flags; + int rw; bio->bi_private = dio; @@ -380,6 +383,9 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio) if (dio->is_async && dio->rw == READ) bio_set_pages_dirty(bio); + rw = dio->rw; + dio->rw |= (dio->rw == READ) ? KERNEL_READ : KERNEL_WRITE; + if (sdio->submit_io) sdio->submit_io(dio->rw, bio, dio->inode, sdio->logical_offset_in_bio); @@ -1131,7 +1137,8 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, /* * Will be decremented at I/O completion time. */ - atomic_inc(&inode->i_dio_count); + if (!(dio->flags & DIO_SKIP_DIO_COUNT)) + inode_dio_begin(inode); /* * For file extending writes updating i_size before data