Commit 17f8c842 authored by Omar Sandoval's avatar Omar Sandoval Committed by Al Viro

Remove rw from {,__,do_}blockdev_direct_IO()

Most filesystems call through to these at some point, so we'll start
here.
Signed-off-by: default avatarOmar Sandoval <osandov@osandov.com>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent bd8e0ff9
...@@ -405,7 +405,7 @@ affs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, ...@@ -405,7 +405,7 @@ affs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
return 0; return 0;
} }
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, affs_get_block); ret = blockdev_direct_IO(iocb, inode, iter, offset, affs_get_block);
if (ret < 0 && (rw & WRITE)) if (ret < 0 && (rw & WRITE))
affs_write_failed(mapping, offset + count); affs_write_failed(mapping, offset + count);
return ret; return ret;
......
...@@ -152,9 +152,8 @@ blkdev_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, ...@@ -152,9 +152,8 @@ blkdev_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
struct file *file = iocb->ki_filp; struct file *file = iocb->ki_filp;
struct inode *inode = file->f_mapping->host; struct inode *inode = file->f_mapping->host;
return __blockdev_direct_IO(rw, iocb, inode, I_BDEV(inode), iter, return __blockdev_direct_IO(iocb, inode, I_BDEV(inode), iter, offset,
offset, blkdev_get_block, blkdev_get_block, NULL, NULL, 0);
NULL, NULL, 0);
} }
int __sync_blockdev(struct block_device *bdev, int wait) int __sync_blockdev(struct block_device *bdev, int wait)
......
...@@ -8174,7 +8174,7 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb, ...@@ -8174,7 +8174,7 @@ static ssize_t btrfs_direct_IO(int rw, struct kiocb *iocb,
wakeup = false; wakeup = false;
} }
ret = __blockdev_direct_IO(rw, iocb, inode, ret = __blockdev_direct_IO(iocb, inode,
BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev, BTRFS_I(inode)->root->fs_info->fs_devices->latest_bdev,
iter, offset, btrfs_get_blocks_direct, NULL, iter, offset, btrfs_get_blocks_direct, NULL,
btrfs_submit_direct, flags); btrfs_submit_direct, flags);
......
...@@ -1093,9 +1093,9 @@ static inline int drop_refcount(struct dio *dio) ...@@ -1093,9 +1093,9 @@ static inline int drop_refcount(struct dio *dio)
* for the whole file. * for the whole file.
*/ */
static inline ssize_t static inline ssize_t
do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, do_blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
struct block_device *bdev, struct iov_iter *iter, loff_t offset, struct block_device *bdev, struct iov_iter *iter,
get_block_t get_block, dio_iodone_t end_io, loff_t offset, get_block_t get_block, dio_iodone_t end_io,
dio_submit_t submit_io, int flags) dio_submit_t submit_io, int flags)
{ {
unsigned i_blkbits = ACCESS_ONCE(inode->i_blkbits); unsigned i_blkbits = ACCESS_ONCE(inode->i_blkbits);
...@@ -1110,9 +1110,6 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ...@@ -1110,9 +1110,6 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
struct blk_plug plug; struct blk_plug plug;
unsigned long align = offset | iov_iter_alignment(iter); unsigned long align = offset | iov_iter_alignment(iter);
if (rw & WRITE)
rw = WRITE_ODIRECT;
/* /*
* Avoid references to bdev if not absolutely needed to give * Avoid references to bdev if not absolutely needed to give
* the early prefetch in the caller enough time. * the early prefetch in the caller enough time.
...@@ -1127,7 +1124,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ...@@ -1127,7 +1124,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
} }
/* watch out for a 0 len io from a tricksy fs */ /* watch out for a 0 len io from a tricksy fs */
if (rw == READ && !iov_iter_count(iter)) if (iov_iter_rw(iter) == READ && !iov_iter_count(iter))
return 0; return 0;
dio = kmem_cache_alloc(dio_cache, GFP_KERNEL); dio = kmem_cache_alloc(dio_cache, GFP_KERNEL);
...@@ -1143,7 +1140,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ...@@ -1143,7 +1140,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
dio->flags = flags; dio->flags = flags;
if (dio->flags & DIO_LOCKING) { if (dio->flags & DIO_LOCKING) {
if (rw == READ) { if (iov_iter_rw(iter) == READ) {
struct address_space *mapping = struct address_space *mapping =
iocb->ki_filp->f_mapping; iocb->ki_filp->f_mapping;
...@@ -1169,19 +1166,19 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ...@@ -1169,19 +1166,19 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
if (is_sync_kiocb(iocb)) if (is_sync_kiocb(iocb))
dio->is_async = false; dio->is_async = false;
else if (!(dio->flags & DIO_ASYNC_EXTEND) && else if (!(dio->flags & DIO_ASYNC_EXTEND) &&
(rw & WRITE) && end > i_size_read(inode)) iov_iter_rw(iter) == WRITE && end > i_size_read(inode))
dio->is_async = false; dio->is_async = false;
else else
dio->is_async = true; dio->is_async = true;
dio->inode = inode; dio->inode = inode;
dio->rw = rw; dio->rw = iov_iter_rw(iter) == WRITE ? WRITE_ODIRECT : READ;
/* /*
* For AIO O_(D)SYNC writes we need to defer completions to a workqueue * For AIO O_(D)SYNC writes we need to defer completions to a workqueue
* so that we can call ->fsync. * so that we can call ->fsync.
*/ */
if (dio->is_async && (rw & WRITE) && if (dio->is_async && iov_iter_rw(iter) == WRITE &&
((iocb->ki_filp->f_flags & O_DSYNC) || ((iocb->ki_filp->f_flags & O_DSYNC) ||
IS_SYNC(iocb->ki_filp->f_mapping->host))) { IS_SYNC(iocb->ki_filp->f_mapping->host))) {
retval = dio_set_defer_completion(dio); retval = dio_set_defer_completion(dio);
...@@ -1274,7 +1271,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ...@@ -1274,7 +1271,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
* we can let i_mutex go now that its achieved its purpose * we can let i_mutex go now that its achieved its purpose
* of protecting us from looking up uninitialized blocks. * of protecting us from looking up uninitialized blocks.
*/ */
if (rw == READ && (dio->flags & DIO_LOCKING)) if (iov_iter_rw(iter) == READ && (dio->flags & DIO_LOCKING))
mutex_unlock(&dio->inode->i_mutex); mutex_unlock(&dio->inode->i_mutex);
/* /*
...@@ -1286,7 +1283,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ...@@ -1286,7 +1283,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
*/ */
BUG_ON(retval == -EIOCBQUEUED); BUG_ON(retval == -EIOCBQUEUED);
if (dio->is_async && retval == 0 && dio->result && if (dio->is_async && retval == 0 && dio->result &&
(rw == READ || dio->result == count)) (iov_iter_rw(iter) == READ || dio->result == count))
retval = -EIOCBQUEUED; retval = -EIOCBQUEUED;
else else
dio_await_completion(dio); dio_await_completion(dio);
...@@ -1300,11 +1297,11 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ...@@ -1300,11 +1297,11 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
return retval; return retval;
} }
ssize_t ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
__blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, struct block_device *bdev, struct iov_iter *iter,
struct block_device *bdev, struct iov_iter *iter, loff_t offset, loff_t offset, get_block_t get_block,
get_block_t get_block, dio_iodone_t end_io, dio_iodone_t end_io, dio_submit_t submit_io,
dio_submit_t submit_io, int flags) int flags)
{ {
/* /*
* The block device state is needed in the end to finally * The block device state is needed in the end to finally
...@@ -1318,8 +1315,8 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ...@@ -1318,8 +1315,8 @@ __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
prefetch(bdev->bd_queue); prefetch(bdev->bd_queue);
prefetch((char *)bdev->bd_queue + SMP_CACHE_BYTES); prefetch((char *)bdev->bd_queue + SMP_CACHE_BYTES);
return do_blockdev_direct_IO(rw, iocb, inode, bdev, iter, offset, return do_blockdev_direct_IO(iocb, inode, bdev, iter, offset, get_block,
get_block, end_io, submit_io, flags); end_io, submit_io, flags);
} }
EXPORT_SYMBOL(__blockdev_direct_IO); EXPORT_SYMBOL(__blockdev_direct_IO);
......
...@@ -864,7 +864,7 @@ ext2_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, ...@@ -864,7 +864,7 @@ ext2_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
ret = dax_do_io(rw, iocb, inode, iter, offset, ext2_get_block, ret = dax_do_io(rw, iocb, inode, iter, offset, ext2_get_block,
NULL, DIO_LOCKING); NULL, DIO_LOCKING);
else else
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, ret = blockdev_direct_IO(iocb, inode, iter, offset,
ext2_get_block); ext2_get_block);
if (ret < 0 && (rw & WRITE)) if (ret < 0 && (rw & WRITE))
ext2_write_failed(mapping, offset + count); ext2_write_failed(mapping, offset + count);
......
...@@ -1856,7 +1856,7 @@ static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb, ...@@ -1856,7 +1856,7 @@ static ssize_t ext3_direct_IO(int rw, struct kiocb *iocb,
} }
retry: retry:
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, ext3_get_block); ret = blockdev_direct_IO(iocb, inode, iter, offset, ext3_get_block);
/* /*
* In case of error extending write may have instantiated a few * In case of error extending write may have instantiated a few
* blocks outside i_size. Trim these off again. * blocks outside i_size. Trim these off again.
......
...@@ -693,9 +693,10 @@ ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, ...@@ -693,9 +693,10 @@ ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb,
ret = dax_do_io(rw, iocb, inode, iter, offset, ret = dax_do_io(rw, iocb, inode, iter, offset,
ext4_get_block, NULL, 0); ext4_get_block, NULL, 0);
else else
ret = __blockdev_direct_IO(rw, iocb, inode, ret = __blockdev_direct_IO(iocb, inode,
inode->i_sb->s_bdev, iter, offset, inode->i_sb->s_bdev, iter,
ext4_get_block, NULL, NULL, 0); offset, ext4_get_block, NULL,
NULL, 0);
inode_dio_done(inode); inode_dio_done(inode);
} else { } else {
locked: locked:
...@@ -703,8 +704,8 @@ ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb, ...@@ -703,8 +704,8 @@ ssize_t ext4_ind_direct_IO(int rw, struct kiocb *iocb,
ret = dax_do_io(rw, iocb, inode, iter, offset, ret = dax_do_io(rw, iocb, inode, iter, offset,
ext4_get_block, NULL, DIO_LOCKING); ext4_get_block, NULL, DIO_LOCKING);
else else
ret = blockdev_direct_IO(rw, iocb, inode, iter, ret = blockdev_direct_IO(iocb, inode, iter, offset,
offset, ext4_get_block); ext4_get_block);
if (unlikely((rw & WRITE) && ret < 0)) { if (unlikely((rw & WRITE) && ret < 0)) {
loff_t isize = i_size_read(inode); loff_t isize = i_size_read(inode);
......
...@@ -3037,7 +3037,7 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb, ...@@ -3037,7 +3037,7 @@ static ssize_t ext4_ext_direct_IO(int rw, struct kiocb *iocb,
ret = dax_do_io(rw, iocb, inode, iter, offset, get_block_func, ret = dax_do_io(rw, iocb, inode, iter, offset, get_block_func,
ext4_end_io_dio, dio_flags); ext4_end_io_dio, dio_flags);
else else
ret = __blockdev_direct_IO(rw, iocb, inode, ret = __blockdev_direct_IO(iocb, inode,
inode->i_sb->s_bdev, iter, offset, inode->i_sb->s_bdev, iter, offset,
get_block_func, get_block_func,
ext4_end_io_dio, NULL, dio_flags); ext4_end_io_dio, NULL, dio_flags);
......
...@@ -1159,7 +1159,7 @@ static ssize_t f2fs_direct_IO(int rw, struct kiocb *iocb, ...@@ -1159,7 +1159,7 @@ static ssize_t f2fs_direct_IO(int rw, struct kiocb *iocb,
if (rw & WRITE) if (rw & WRITE)
__allocate_data_blocks(inode, offset, count); __allocate_data_blocks(inode, offset, count);
err = blockdev_direct_IO(rw, iocb, inode, iter, offset, get_data_block); err = blockdev_direct_IO(iocb, inode, iter, offset, get_data_block);
if (err < 0 && (rw & WRITE)) if (err < 0 && (rw & WRITE))
f2fs_write_failed(mapping, offset + count); f2fs_write_failed(mapping, offset + count);
......
...@@ -274,7 +274,7 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb, ...@@ -274,7 +274,7 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb,
* FAT need to use the DIO_LOCKING for avoiding the race * FAT need to use the DIO_LOCKING for avoiding the race
* condition of fat_get_block() and ->truncate(). * condition of fat_get_block() and ->truncate().
*/ */
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, fat_get_block); ret = blockdev_direct_IO(iocb, inode, iter, offset, fat_get_block);
if (ret < 0 && (rw & WRITE)) if (ret < 0 && (rw & WRITE))
fat_write_failed(mapping, offset + count); fat_write_failed(mapping, offset + count);
......
...@@ -1095,9 +1095,8 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb, ...@@ -1095,9 +1095,8 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
truncate_inode_pages_range(mapping, lstart, end); truncate_inode_pages_range(mapping, lstart, end);
} }
rv = __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, rv = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter,
iter, offset, offset, gfs2_get_block_direct, NULL, NULL, 0);
gfs2_get_block_direct, NULL, NULL, 0);
out: out:
gfs2_glock_dq(&gh); gfs2_glock_dq(&gh);
gfs2_holder_uninit(&gh); gfs2_holder_uninit(&gh);
......
...@@ -133,7 +133,7 @@ static ssize_t hfs_direct_IO(int rw, struct kiocb *iocb, ...@@ -133,7 +133,7 @@ static ssize_t hfs_direct_IO(int rw, struct kiocb *iocb,
size_t count = iov_iter_count(iter); size_t count = iov_iter_count(iter);
ssize_t ret; ssize_t ret;
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, hfs_get_block); ret = blockdev_direct_IO(iocb, inode, iter, offset, hfs_get_block);
/* /*
* In case of error extending write may have instantiated a few * In case of error extending write may have instantiated a few
......
...@@ -131,8 +131,7 @@ static ssize_t hfsplus_direct_IO(int rw, struct kiocb *iocb, ...@@ -131,8 +131,7 @@ static ssize_t hfsplus_direct_IO(int rw, struct kiocb *iocb,
size_t count = iov_iter_count(iter); size_t count = iov_iter_count(iter);
ssize_t ret; ssize_t ret;
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, ret = blockdev_direct_IO(iocb, inode, iter, offset, hfsplus_get_block);
hfsplus_get_block);
/* /*
* In case of error extending write may have instantiated a few * In case of error extending write may have instantiated a few
......
...@@ -339,7 +339,7 @@ static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb, ...@@ -339,7 +339,7 @@ static ssize_t jfs_direct_IO(int rw, struct kiocb *iocb,
size_t count = iov_iter_count(iter); size_t count = iov_iter_count(iter);
ssize_t ret; ssize_t ret;
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, jfs_get_block); ret = blockdev_direct_IO(iocb, inode, iter, offset, jfs_get_block);
/* /*
* In case of error extending write may have instantiated a few * In case of error extending write may have instantiated a few
......
...@@ -318,8 +318,7 @@ nilfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, ...@@ -318,8 +318,7 @@ nilfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter,
return 0; return 0;
/* Needs synchronization with the cleaner */ /* Needs synchronization with the cleaner */
size = blockdev_direct_IO(rw, iocb, inode, iter, offset, size = blockdev_direct_IO(iocb, inode, iter, offset, nilfs_get_block);
nilfs_get_block);
/* /*
* In case of error extending write may have instantiated a few * In case of error extending write may have instantiated a few
......
...@@ -738,9 +738,8 @@ static ssize_t ocfs2_direct_IO_write(struct kiocb *iocb, ...@@ -738,9 +738,8 @@ static ssize_t ocfs2_direct_IO_write(struct kiocb *iocb,
di_bh = NULL; di_bh = NULL;
} }
written = __blockdev_direct_IO(WRITE, iocb, inode, inode->i_sb->s_bdev, written = __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter,
iter, offset, offset, ocfs2_direct_IO_get_blocks,
ocfs2_direct_IO_get_blocks,
ocfs2_dio_end_io, NULL, 0); ocfs2_dio_end_io, NULL, 0);
if (unlikely(written < 0)) { if (unlikely(written < 0)) {
loff_t i_size = i_size_read(inode); loff_t i_size = i_size_read(inode);
...@@ -844,8 +843,7 @@ static ssize_t ocfs2_direct_IO(int rw, ...@@ -844,8 +843,7 @@ static ssize_t ocfs2_direct_IO(int rw,
return 0; return 0;
if (rw == READ) if (rw == READ)
return __blockdev_direct_IO(rw, iocb, inode, return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev,
inode->i_sb->s_bdev,
iter, offset, iter, offset,
ocfs2_direct_IO_get_blocks, ocfs2_direct_IO_get_blocks,
ocfs2_dio_end_io, NULL, 0); ocfs2_dio_end_io, NULL, 0);
......
...@@ -3286,7 +3286,7 @@ static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb, ...@@ -3286,7 +3286,7 @@ static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb,
size_t count = iov_iter_count(iter); size_t count = iov_iter_count(iter);
ssize_t ret; ssize_t ret;
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, ret = blockdev_direct_IO(iocb, inode, iter, offset,
reiserfs_get_blocks_direct_io); reiserfs_get_blocks_direct_io);
/* /*
......
...@@ -225,7 +225,7 @@ static ssize_t udf_direct_IO(int rw, struct kiocb *iocb, ...@@ -225,7 +225,7 @@ static ssize_t udf_direct_IO(int rw, struct kiocb *iocb,
size_t count = iov_iter_count(iter); size_t count = iov_iter_count(iter);
ssize_t ret; ssize_t ret;
ret = blockdev_direct_IO(rw, iocb, inode, iter, offset, udf_get_block); ret = blockdev_direct_IO(iocb, inode, iter, offset, udf_get_block);
if (unlikely(ret < 0 && (rw & WRITE))) if (unlikely(ret < 0 && (rw & WRITE)))
udf_write_failed(mapping, offset + count); udf_write_failed(mapping, offset + count);
return ret; return ret;
......
...@@ -1504,14 +1504,13 @@ xfs_vm_direct_IO( ...@@ -1504,14 +1504,13 @@ xfs_vm_direct_IO(
struct block_device *bdev = xfs_find_bdev_for_inode(inode); struct block_device *bdev = xfs_find_bdev_for_inode(inode);
if (rw & WRITE) { if (rw & WRITE) {
return __blockdev_direct_IO(rw, iocb, inode, bdev, iter, return __blockdev_direct_IO(iocb, inode, bdev, iter, offset,
offset, xfs_get_blocks_direct, xfs_get_blocks_direct,
xfs_end_io_direct_write, NULL, xfs_end_io_direct_write, NULL,
DIO_ASYNC_EXTEND); DIO_ASYNC_EXTEND);
} }
return __blockdev_direct_IO(rw, iocb, inode, bdev, iter, return __blockdev_direct_IO(iocb, inode, bdev, iter, offset,
offset, xfs_get_blocks_direct, xfs_get_blocks_direct, NULL, NULL, 0);
NULL, NULL, 0);
} }
/* /*
......
...@@ -2634,16 +2634,18 @@ enum { ...@@ -2634,16 +2634,18 @@ enum {
void dio_end_io(struct bio *bio, int error); void dio_end_io(struct bio *bio, int error);
ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode, ssize_t __blockdev_direct_IO(struct kiocb *iocb, struct inode *inode,
struct block_device *bdev, struct iov_iter *iter, loff_t offset, struct block_device *bdev, struct iov_iter *iter,
get_block_t get_block, dio_iodone_t end_io, loff_t offset, get_block_t get_block,
dio_submit_t submit_io, int flags); dio_iodone_t end_io, dio_submit_t submit_io,
int flags);
static inline ssize_t blockdev_direct_IO(int rw, struct kiocb *iocb,
struct inode *inode, struct iov_iter *iter, loff_t offset, static inline ssize_t blockdev_direct_IO(struct kiocb *iocb,
struct inode *inode,
struct iov_iter *iter, loff_t offset,
get_block_t get_block) get_block_t get_block)
{ {
return __blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iter, return __blockdev_direct_IO(iocb, inode, inode->i_sb->s_bdev, iter,
offset, get_block, NULL, NULL, offset, get_block, NULL, NULL,
DIO_LOCKING | DIO_SKIP_HOLES); DIO_LOCKING | DIO_SKIP_HOLES);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment