Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2847525a authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: allow wrong configured dio to buffered write



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: default avatarChao Yu <yuchao0@huawei.com>
Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent 882c7da2
Loading
Loading
Loading
Loading
+15 −9
Original line number Diff line number Diff line
@@ -2369,14 +2369,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)
	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;
}

@@ -2394,7 +2400,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;