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

sysv: convert to new aops

Signed-off-by: Nick Piggin <npiggin@suse.de>
Cc: Christoph Hellwig <hch@lst.de>
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
26a6441a be021ee4

+52 -24
+30 -20
fs/sysv/dir.c
··· 16 16 #include <linux/pagemap.h> 17 17 #include <linux/highmem.h> 18 18 #include <linux/smp_lock.h> 19 + #include <linux/swap.h> 19 20 #include "sysv.h" 20 21 21 22 static int sysv_readdir(struct file *, void *, filldir_t); ··· 38 37 return (inode->i_size+PAGE_CACHE_SIZE-1)>>PAGE_CACHE_SHIFT; 39 38 } 40 39 41 - static int dir_commit_chunk(struct page *page, unsigned from, unsigned to) 40 + static int dir_commit_chunk(struct page *page, loff_t pos, unsigned len) 42 41 { 43 - struct inode *dir = (struct inode *)page->mapping->host; 42 + struct address_space *mapping = page->mapping; 43 + struct inode *dir = mapping->host; 44 44 int err = 0; 45 45 46 - page->mapping->a_ops->commit_write(NULL, page, from, to); 46 + block_write_end(NULL, mapping, pos, len, len, page, NULL); 47 + if (pos+len > dir->i_size) { 48 + i_size_write(dir, pos+len); 49 + mark_inode_dirty(dir); 50 + } 47 51 if (IS_DIRSYNC(dir)) 48 52 err = write_one_page(page, 1); 49 53 else ··· 192 186 unsigned long npages = dir_pages(dir); 193 187 unsigned long n; 194 188 char *kaddr; 195 - unsigned from, to; 189 + loff_t pos; 196 190 int err; 197 191 198 192 /* We take care of directory expansion in the same loop */ ··· 218 212 return -EINVAL; 219 213 220 214 got_it: 221 - from = (char*)de - (char*)page_address(page); 222 - to = from + SYSV_DIRSIZE; 215 + pos = page_offset(page) + 216 + (char*)de - (char*)page_address(page); 223 217 lock_page(page); 224 - err = page->mapping->a_ops->prepare_write(NULL, page, from, to); 218 + err = __sysv_write_begin(NULL, page->mapping, pos, SYSV_DIRSIZE, 219 + AOP_FLAG_UNINTERRUPTIBLE, &page, NULL); 225 220 if (err) 226 221 goto out_unlock; 227 222 memcpy (de->name, name, namelen); 228 223 memset (de->name + namelen, 0, SYSV_DIRSIZE - namelen - 2); 229 224 de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), inode->i_ino); 230 - err = dir_commit_chunk(page, from, to); 225 + err = dir_commit_chunk(page, pos, SYSV_DIRSIZE); 231 226 dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC; 232 227 mark_inode_dirty(dir); 233 228 out_page: ··· 245 238 struct address_space *mapping = page->mapping; 246 239 struct inode *inode = (struct inode*)mapping->host; 247 240 char *kaddr = (char*)page_address(page); 248 - unsigned from = (char*)de - kaddr; 249 - unsigned to = from + SYSV_DIRSIZE; 241 + loff_t pos = page_offset(page) + (char *)de - kaddr; 250 242 int err; 251 243 252 244 lock_page(page); 253 - err = mapping->a_ops->prepare_write(NULL, page, from, to); 245 + err = __sysv_write_begin(NULL, mapping, pos, SYSV_DIRSIZE, 246 + AOP_FLAG_UNINTERRUPTIBLE, &page, NULL); 254 247 BUG_ON(err); 255 248 de->inode = 0; 256 - err = dir_commit_chunk(page, from, to); 249 + err = dir_commit_chunk(page, pos, SYSV_DIRSIZE); 257 250 dir_put_page(page); 258 251 inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC; 259 252 mark_inode_dirty(inode); ··· 270 263 271 264 if (!page) 272 265 return -ENOMEM; 273 - kmap(page); 274 - err = mapping->a_ops->prepare_write(NULL, page, 0, 2 * SYSV_DIRSIZE); 266 + err = __sysv_write_begin(NULL, mapping, 0, 2 * SYSV_DIRSIZE, 267 + AOP_FLAG_UNINTERRUPTIBLE, &page, NULL); 275 268 if (err) { 276 269 unlock_page(page); 277 270 goto fail; 278 271 } 272 + kmap(page); 279 273 280 274 base = (char*)page_address(page); 281 275 memset(base, 0, PAGE_CACHE_SIZE); ··· 288 280 de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), dir->i_ino); 289 281 strcpy(de->name,".."); 290 282 283 + kunmap(page); 291 284 err = dir_commit_chunk(page, 0, 2 * SYSV_DIRSIZE); 292 285 fail: 293 - kunmap(page); 294 286 page_cache_release(page); 295 287 return err; 296 288 } ··· 344 336 void sysv_set_link(struct sysv_dir_entry *de, struct page *page, 345 337 struct inode *inode) 346 338 { 347 - struct inode *dir = (struct inode*)page->mapping->host; 348 - unsigned from = (char *)de-(char*)page_address(page); 349 - unsigned to = from + SYSV_DIRSIZE; 339 + struct address_space *mapping = page->mapping; 340 + struct inode *dir = mapping->host; 341 + loff_t pos = page_offset(page) + 342 + (char *)de-(char*)page_address(page); 350 343 int err; 351 344 352 345 lock_page(page); 353 - err = page->mapping->a_ops->prepare_write(NULL, page, from, to); 346 + err = __sysv_write_begin(NULL, mapping, pos, SYSV_DIRSIZE, 347 + AOP_FLAG_UNINTERRUPTIBLE, &page, NULL); 354 348 BUG_ON(err); 355 349 de->inode = cpu_to_fs16(SYSV_SB(inode->i_sb), inode->i_ino); 356 - err = dir_commit_chunk(page, from, to); 350 + err = dir_commit_chunk(page, pos, SYSV_DIRSIZE); 357 351 dir_put_page(page); 358 352 dir->i_mtime = dir->i_ctime = CURRENT_TIME_SEC; 359 353 mark_inode_dirty(dir);
+19 -4
fs/sysv/itree.c
··· 453 453 { 454 454 return block_write_full_page(page,get_block,wbc); 455 455 } 456 + 456 457 static int sysv_readpage(struct file *file, struct page *page) 457 458 { 458 459 return block_read_full_page(page,get_block); 459 460 } 460 - static int sysv_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to) 461 + 462 + int __sysv_write_begin(struct file *file, struct address_space *mapping, 463 + loff_t pos, unsigned len, unsigned flags, 464 + struct page **pagep, void **fsdata) 461 465 { 462 - return block_prepare_write(page,from,to,get_block); 466 + return block_write_begin(file, mapping, pos, len, flags, pagep, fsdata, 467 + get_block); 463 468 } 469 + 470 + static int sysv_write_begin(struct file *file, struct address_space *mapping, 471 + loff_t pos, unsigned len, unsigned flags, 472 + struct page **pagep, void **fsdata) 473 + { 474 + *pagep = NULL; 475 + return __sysv_write_begin(file, mapping, pos, len, flags, pagep, fsdata); 476 + } 477 + 464 478 static sector_t sysv_bmap(struct address_space *mapping, sector_t block) 465 479 { 466 480 return generic_block_bmap(mapping,block,get_block); 467 481 } 482 + 468 483 const struct address_space_operations sysv_aops = { 469 484 .readpage = sysv_readpage, 470 485 .writepage = sysv_writepage, 471 486 .sync_page = block_sync_page, 472 - .prepare_write = sysv_prepare_write, 473 - .commit_write = generic_commit_write, 487 + .write_begin = sysv_write_begin, 488 + .write_end = generic_write_end, 474 489 .bmap = sysv_bmap 475 490 };
+3
fs/sysv/sysv.h
··· 136 136 137 137 /* itree.c */ 138 138 extern void sysv_truncate(struct inode *); 139 + extern int __sysv_write_begin(struct file *file, struct address_space *mapping, 140 + loff_t pos, unsigned len, unsigned flags, 141 + struct page **pagep, void **fsdata); 139 142 140 143 /* inode.c */ 141 144 extern int sysv_write_inode(struct inode *, int);