Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

udf: convert to new aops

Convert udf to new aops. Also seem to have fixed pagecache corruption in
udf_adinicb_commit_write -- page was marked uptodate when it is not. Also,
fixed the silly setup where prepare_write was doing a kmap to be used in
commit_write: just do kmap_atomic in write_end. Use libfs helpers to make
this easier.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: <bfennema@falcon.csc.calpoly.edu>
Cc: Jan Kara <jack@ucw.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Nick Piggin and committed by
Linus Torvalds
be021ee4 82b9d1d0

+22 -26
+14 -21
fs/udf/file.c
··· 76 76 return 0; 77 77 } 78 78 79 - static int udf_adinicb_prepare_write(struct file *file, struct page *page, 80 - unsigned offset, unsigned to) 79 + static int udf_adinicb_write_end(struct file *file, 80 + struct address_space *mapping, 81 + loff_t pos, unsigned len, unsigned copied, 82 + struct page *page, void *fsdata) 81 83 { 82 - kmap(page); 83 - return 0; 84 - } 84 + struct inode *inode = mapping->host; 85 + unsigned offset = pos & (PAGE_CACHE_SIZE - 1); 86 + char *kaddr; 85 87 86 - static int udf_adinicb_commit_write(struct file *file, struct page *page, 87 - unsigned offset, unsigned to) 88 - { 89 - struct inode *inode = page->mapping->host; 90 - char *kaddr = page_address(page); 91 - 88 + kaddr = kmap_atomic(page, KM_USER0); 92 89 memcpy(UDF_I_DATA(inode) + UDF_I_LENEATTR(inode) + offset, 93 - kaddr + offset, to - offset); 94 - mark_inode_dirty(inode); 95 - SetPageUptodate(page); 96 - kunmap(page); 97 - /* only one page here */ 98 - if (to > inode->i_size) 99 - inode->i_size = to; 100 - return 0; 90 + kaddr + offset, copied); 91 + kunmap_atomic(kaddr, KM_USER0); 92 + 93 + return simple_write_end(file, mapping, pos, len, copied, page, fsdata); 101 94 } 102 95 103 96 const struct address_space_operations udf_adinicb_aops = { 104 97 .readpage = udf_adinicb_readpage, 105 98 .writepage = udf_adinicb_writepage, 106 99 .sync_page = block_sync_page, 107 - .prepare_write = udf_adinicb_prepare_write, 108 - .commit_write = udf_adinicb_commit_write, 100 + .write_begin = simple_write_begin, 101 + .write_end = udf_adinicb_write_end, 109 102 }; 110 103 111 104 static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
+8 -5
fs/udf/inode.c
··· 133 133 return block_read_full_page(page, udf_get_block); 134 134 } 135 135 136 - static int udf_prepare_write(struct file *file, struct page *page, 137 - unsigned from, unsigned to) 136 + static int udf_write_begin(struct file *file, struct address_space *mapping, 137 + loff_t pos, unsigned len, unsigned flags, 138 + struct page **pagep, void **fsdata) 138 139 { 139 - return block_prepare_write(page, from, to, udf_get_block); 140 + *pagep = NULL; 141 + return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata, 142 + udf_get_block); 140 143 } 141 144 142 145 static sector_t udf_bmap(struct address_space *mapping, sector_t block) ··· 151 148 .readpage = udf_readpage, 152 149 .writepage = udf_writepage, 153 150 .sync_page = block_sync_page, 154 - .prepare_write = udf_prepare_write, 155 - .commit_write = generic_commit_write, 151 + .write_begin = udf_write_begin, 152 + .write_end = generic_write_end, 156 153 .bmap = udf_bmap, 157 154 }; 158 155