diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2016-10-08 11:06:08 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2016-10-08 11:06:08 -0400 |
commit | e55f1d1d13e7f1c364672d667d78fd1f640ab9f9 (patch) | |
tree | 406a3c127abb008f2f736c8d2ee03fc3c2926d6b /fs/udf/file.c | |
parent | f334bcd94b7d3c0fbc34d518a86548f451ab5faf (diff) | |
parent | 030b533c4fd4d2ec3402363323de4bb2983c9cee (diff) |
Merge remote-tracking branch 'jk/vfs' into work.misc
Diffstat (limited to 'fs/udf/file.c')
-rw-r--r-- | fs/udf/file.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/fs/udf/file.c b/fs/udf/file.c index 632570617327..dbcb3a4a0cb9 100644 --- a/fs/udf/file.c +++ b/fs/udf/file.c @@ -94,7 +94,7 @@ static int udf_adinicb_write_begin(struct file *file, return -ENOMEM; *pagep = page; - if (!PageUptodate(page) && len != PAGE_SIZE) + if (!PageUptodate(page)) __udf_adinicb_readpage(page); return 0; } @@ -105,11 +105,25 @@ static ssize_t udf_adinicb_direct_IO(struct kiocb *iocb, struct iov_iter *iter) return 0; } +static int udf_adinicb_write_end(struct file *file, struct address_space *mapping, + loff_t pos, unsigned len, unsigned copied, + struct page *page, void *fsdata) +{ + struct inode *inode = page->mapping->host; + loff_t last_pos = pos + copied; + if (last_pos > inode->i_size) + i_size_write(inode, last_pos); + set_page_dirty(page); + unlock_page(page); + put_page(page); + return copied; +} + const struct address_space_operations udf_adinicb_aops = { .readpage = udf_adinicb_readpage, .writepage = udf_adinicb_writepage, .write_begin = udf_adinicb_write_begin, - .write_end = simple_write_end, + .write_end = udf_adinicb_write_end, .direct_IO = udf_adinicb_direct_IO, }; @@ -247,7 +261,7 @@ static int udf_setattr(struct dentry *dentry, struct iattr *attr) struct inode *inode = d_inode(dentry); int error; - error = inode_change_ok(inode, attr); + error = setattr_prepare(dentry, attr); if (error) return error; |