Btrfs: Add O_DIRECT read and write (writes == buffered + cache flush)
This adds basic O_DIRECT read and write support. In the write case, we just do a normal buffered write followed by a cache flush. O_DIRECT + O_SYNC are required to trigger metadata syncs. In the read case, there is a basic btrfs_get_block call for use by the generic O_DIRECT code. This does honor multi-volume mapping rules but it skips all checksumming. Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
@@ -796,8 +796,6 @@ static ssize_t btrfs_file_write(struct file *file, const char __user *buf,
|
||||
PAGE_CACHE_SIZE / (sizeof(struct page *)));
|
||||
pinned[0] = NULL;
|
||||
pinned[1] = NULL;
|
||||
if (file->f_flags & O_DIRECT)
|
||||
return -EINVAL;
|
||||
|
||||
pos = *ppos;
|
||||
start_pos = pos;
|
||||
@@ -909,6 +907,15 @@ out_nolock:
|
||||
start_pos, num_written);
|
||||
if (err < 0)
|
||||
num_written = err;
|
||||
} else if (num_written > 0 && (file->f_flags & O_DIRECT)) {
|
||||
do_sync_mapping_range(inode->i_mapping, start_pos,
|
||||
start_pos + num_written - 1,
|
||||
SYNC_FILE_RANGE_WRITE |
|
||||
SYNC_FILE_RANGE_WAIT_AFTER);
|
||||
|
||||
invalidate_mapping_pages(inode->i_mapping,
|
||||
start_pos >> PAGE_CACHE_SHIFT,
|
||||
(start_pos + num_written - 1) >> PAGE_CACHE_SHIFT);
|
||||
}
|
||||
current->backing_dev_info = NULL;
|
||||
return num_written ? num_written : err;
|
||||
|
Reference in New Issue
Block a user