path: root/fs/udf/file.c
diff options
authorIan Abbott <abbotti@mev.co.uk>2012-09-05 17:44:31 +0100
committerJan Kara <jack@suse.cz>2012-09-06 16:20:39 +0200
commit5eec54fcde7e065eb3d8a6e70e61d90673ca706b (patch)
treeb5946eb5ad36a2121334e38a1ccf417fa8babd14 /fs/udf/file.c
parent3f6bba823767e3c78efcf1bea5b6fdf98ad80e3b (diff)
UDF: Add support for O_DIRECT
Add support for the O_DIRECT flag. There are two cases to deal with: 1. Small files stored in the ICB (inode control block?): just return 0 from the new udf_adinicb_direct_IO() handler to fall back to buffered I/O. 2. Larger files, not stored in the ICB: nothing special here. Just call blockdev_direct_IO() from our new udf_direct_IO() handler and tidy up any blocks instantiated outside i_size on error. This is pretty standard. Factor error handling code out of udf_write_begin() into new function udf_write_failed() so it can also be called by udf_direct_IO(). Also change the whitespace in udf_aops to make it a bit neater. Signed-off-by: Ian Abbott <abbotti@mev.co.uk> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'fs/udf/file.c')
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c
index d1c6093fd3d3..77b5953eaac8 100644
--- a/fs/udf/file.c
+++ b/fs/udf/file.c
@@ -118,11 +118,20 @@ static int udf_adinicb_write_end(struct file *file,
return simple_write_end(file, mapping, pos, len, copied, page, fsdata);
+static ssize_t udf_adinicb_direct_IO(int rw, struct kiocb *iocb,
+ const struct iovec *iov,
+ loff_t offset, unsigned long nr_segs)
+ /* Fallback to buffered I/O. */
+ return 0;
const struct address_space_operations udf_adinicb_aops = {
.readpage = udf_adinicb_readpage,
.writepage = udf_adinicb_writepage,
.write_begin = udf_adinicb_write_begin,
.write_end = udf_adinicb_write_end,
+ .direct_IO = udf_adinicb_direct_IO,
static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,