|
@@ -292,29 +292,45 @@ out:
|
|
|
* If the writer ends up delaying the write, the writer needs to
|
|
|
* increment the page use counts until he is done with the page.
|
|
|
*/
|
|
|
-static int smb_prepare_write(struct file *file, struct page *page,
|
|
|
- unsigned offset, unsigned to)
|
|
|
+static int smb_write_begin(struct file *file, struct address_space *mapping,
|
|
|
+ loff_t pos, unsigned len, unsigned flags,
|
|
|
+ struct page **pagep, void **fsdata)
|
|
|
{
|
|
|
+ pgoff_t index = pos >> PAGE_CACHE_SHIFT;
|
|
|
+ *pagep = __grab_cache_page(mapping, index);
|
|
|
+ if (!*pagep)
|
|
|
+ return -ENOMEM;
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int smb_commit_write(struct file *file, struct page *page,
|
|
|
- unsigned offset, unsigned to)
|
|
|
+static int smb_write_end(struct file *file, struct address_space *mapping,
|
|
|
+ loff_t pos, unsigned len, unsigned copied,
|
|
|
+ struct page *page, void *fsdata)
|
|
|
{
|
|
|
int status;
|
|
|
+ unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
|
|
|
|
|
|
- status = -EFAULT;
|
|
|
lock_kernel();
|
|
|
- status = smb_updatepage(file, page, offset, to-offset);
|
|
|
+ status = smb_updatepage(file, page, offset, copied);
|
|
|
unlock_kernel();
|
|
|
+
|
|
|
+ if (!status) {
|
|
|
+ if (!PageUptodate(page) && copied == PAGE_CACHE_SIZE)
|
|
|
+ SetPageUptodate(page);
|
|
|
+ status = copied;
|
|
|
+ }
|
|
|
+
|
|
|
+ unlock_page(page);
|
|
|
+ page_cache_release(page);
|
|
|
+
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
const struct address_space_operations smb_file_aops = {
|
|
|
.readpage = smb_readpage,
|
|
|
.writepage = smb_writepage,
|
|
|
- .prepare_write = smb_prepare_write,
|
|
|
- .commit_write = smb_commit_write
|
|
|
+ .write_begin = smb_write_begin,
|
|
|
+ .write_end = smb_write_end,
|
|
|
};
|
|
|
|
|
|
/*
|