Skip to content

Commit

Permalink
f2fs: allow wrong configured dio to buffered write
Browse files Browse the repository at this point in the history
This fixes to support dio having unaligned buffers as buffered writes.

xfs_io -f -d -c "pwrite 0 512" $testfile
 -> okay

xfs_io -f -d -c "pwrite 1 512" $testfile
 -> EINVAL

Reviewed-by: Chao Yu <yuchao0@huawei.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
  • Loading branch information
Jaegeuk Kim committed Jul 15, 2018
1 parent 7f2ecdd commit 8a56dd9
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions fs/f2fs/data.c
Original file line number Diff line number Diff line change
Expand Up @@ -2371,14 +2371,20 @@ static int f2fs_write_end(struct file *file,
static int check_direct_IO(struct inode *inode, struct iov_iter *iter,
loff_t offset)
{
unsigned blocksize_mask = inode->i_sb->s_blocksize - 1;

if (offset & blocksize_mask)
return -EINVAL;

if (iov_iter_alignment(iter) & blocksize_mask)
return -EINVAL;

unsigned i_blkbits = READ_ONCE(inode->i_blkbits);
unsigned blkbits = i_blkbits;
unsigned blocksize_mask = (1 << blkbits) - 1;
unsigned long align = offset | iov_iter_alignment(iter);
struct block_device *bdev = inode->i_sb->s_bdev;

if (align & blocksize_mask) {
if (bdev)
blkbits = blksize_bits(bdev_logical_block_size(bdev));
blocksize_mask = (1 << blkbits) - 1;
if (align & blocksize_mask)
return -EINVAL;
return 1;
}
return 0;
}

Expand All @@ -2396,7 +2402,7 @@ static ssize_t f2fs_direct_IO(struct kiocb *iocb, struct iov_iter *iter)

err = check_direct_IO(inode, iter, offset);
if (err)
return err;
return err < 0 ? err : 0;

if (f2fs_force_buffered_io(inode, rw))
return 0;
Expand Down

0 comments on commit 8a56dd9

Please sign in to comment.