Merge branch 'write_inode2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6

* 'write_inode2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6:
pass writeback_control to ->write_inode
make sure data is on disk before calling ->write_inode

+123 -107
+1 -1
fs/adfs/adfs.h
··· 121 121 122 122 /* Inode stuff */ 123 123 struct inode *adfs_iget(struct super_block *sb, struct object_info *obj); 124 - int adfs_write_inode(struct inode *inode,int unused); 124 + int adfs_write_inode(struct inode *inode, struct writeback_control *wbc); 125 125 int adfs_notify_change(struct dentry *dentry, struct iattr *attr); 126 126 127 127 /* map.c */
+3 -2
fs/adfs/inode.c
··· 9 9 */ 10 10 #include <linux/smp_lock.h> 11 11 #include <linux/buffer_head.h> 12 + #include <linux/writeback.h> 12 13 #include "adfs.h" 13 14 14 15 /* ··· 361 360 * The adfs-specific inode data has already been updated by 362 361 * adfs_notify_change() 363 362 */ 364 - int adfs_write_inode(struct inode *inode, int wait) 363 + int adfs_write_inode(struct inode *inode, struct writeback_control *wbc) 365 364 { 366 365 struct super_block *sb = inode->i_sb; 367 366 struct object_info obj; ··· 376 375 obj.attr = ADFS_I(inode)->attr; 377 376 obj.size = inode->i_size; 378 377 379 - ret = adfs_dir_update(sb, &obj, wait); 378 + ret = adfs_dir_update(sb, &obj, wbc->sync_mode == WB_SYNC_ALL); 380 379 unlock_kernel(); 381 380 return ret; 382 381 }
+2 -1
fs/affs/affs.h
··· 175 175 extern void affs_clear_inode(struct inode *inode); 176 176 extern struct inode *affs_iget(struct super_block *sb, 177 177 unsigned long ino); 178 - extern int affs_write_inode(struct inode *inode, int); 178 + extern int affs_write_inode(struct inode *inode, 179 + struct writeback_control *wbc); 179 180 extern int affs_add_entry(struct inode *dir, struct inode *inode, struct dentry *dentry, s32 type); 180 181 181 182 /* file.c */
+1 -1
fs/affs/inode.c
··· 166 166 } 167 167 168 168 int 169 - affs_write_inode(struct inode *inode, int unused) 169 + affs_write_inode(struct inode *inode, struct writeback_control *wbc) 170 170 { 171 171 struct super_block *sb = inode->i_sb; 172 172 struct buffer_head *bh;
-1
fs/afs/internal.h
··· 733 733 struct page *page, void *fsdata); 734 734 extern int afs_writepage(struct page *, struct writeback_control *); 735 735 extern int afs_writepages(struct address_space *, struct writeback_control *); 736 - extern int afs_write_inode(struct inode *, int); 737 736 extern void afs_pages_written_back(struct afs_vnode *, struct afs_call *); 738 737 extern ssize_t afs_file_write(struct kiocb *, const struct iovec *, 739 738 unsigned long, loff_t);
-1
fs/afs/super.c
··· 48 48 static const struct super_operations afs_super_ops = { 49 49 .statfs = afs_statfs, 50 50 .alloc_inode = afs_alloc_inode, 51 - .write_inode = afs_write_inode, 52 51 .destroy_inode = afs_destroy_inode, 53 52 .clear_inode = afs_clear_inode, 54 53 .put_super = afs_put_super,
-21
fs/afs/write.c
··· 585 585 } 586 586 587 587 /* 588 - * write an inode back 589 - */ 590 - int afs_write_inode(struct inode *inode, int sync) 591 - { 592 - struct afs_vnode *vnode = AFS_FS_I(inode); 593 - int ret; 594 - 595 - _enter("{%x:%u},", vnode->fid.vid, vnode->fid.vnode); 596 - 597 - ret = 0; 598 - if (sync) { 599 - ret = filemap_fdatawait(inode->i_mapping); 600 - if (ret < 0) 601 - __mark_inode_dirty(inode, I_DIRTY_DATASYNC); 602 - } 603 - 604 - _leave(" = %d", ret); 605 - return ret; 606 - } 607 - 608 - /* 609 588 * completion of write to server 610 589 */ 611 590 void afs_pages_written_back(struct afs_vnode *vnode, struct afs_call *call)
+3 -2
fs/bfs/inode.c
··· 15 15 #include <linux/smp_lock.h> 16 16 #include <linux/buffer_head.h> 17 17 #include <linux/vfs.h> 18 + #include <linux/writeback.h> 18 19 #include <asm/uaccess.h> 19 20 #include "bfs.h" 20 21 ··· 99 98 return ERR_PTR(-EIO); 100 99 } 101 100 102 - static int bfs_write_inode(struct inode *inode, int wait) 101 + static int bfs_write_inode(struct inode *inode, struct writeback_control *wbc) 103 102 { 104 103 struct bfs_sb_info *info = BFS_SB(inode->i_sb); 105 104 unsigned int ino = (u16)inode->i_ino; ··· 148 147 di->i_eoffset = cpu_to_le32(i_sblock * BFS_BSIZE + inode->i_size - 1); 149 148 150 149 mark_buffer_dirty(bh); 151 - if (wait) { 150 + if (wbc->sync_mode == WB_SYNC_ALL) { 152 151 sync_dirty_buffer(bh); 153 152 if (buffer_req(bh) && !buffer_uptodate(bh)) 154 153 err = -EIO;
+1 -1
fs/btrfs/ctree.h
··· 2326 2326 int btrfs_readpage(struct file *file, struct page *page); 2327 2327 void btrfs_delete_inode(struct inode *inode); 2328 2328 void btrfs_put_inode(struct inode *inode); 2329 - int btrfs_write_inode(struct inode *inode, int wait); 2329 + int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); 2330 2330 void btrfs_dirty_inode(struct inode *inode); 2331 2331 struct inode *btrfs_alloc_inode(struct super_block *sb); 2332 2332 void btrfs_destroy_inode(struct inode *inode);
+2 -2
fs/btrfs/inode.c
··· 3968 3968 return ret; 3969 3969 } 3970 3970 3971 - int btrfs_write_inode(struct inode *inode, int wait) 3971 + int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc) 3972 3972 { 3973 3973 struct btrfs_root *root = BTRFS_I(inode)->root; 3974 3974 struct btrfs_trans_handle *trans; ··· 3977 3977 if (root->fs_info->btree_inode == inode) 3978 3978 return 0; 3979 3979 3980 - if (wait) { 3980 + if (wbc->sync_mode == WB_SYNC_ALL) { 3981 3981 trans = btrfs_join_transaction(root, 1); 3982 3982 btrfs_set_trans_block_group(trans, inode); 3983 3983 ret = btrfs_commit_transaction(trans, root);
+1 -1
fs/exofs/exofs.h
··· 261 261 struct page **pagep, void **fsdata); 262 262 extern struct inode *exofs_iget(struct super_block *, unsigned long); 263 263 struct inode *exofs_new_inode(struct inode *, int); 264 - extern int exofs_write_inode(struct inode *, int); 264 + extern int exofs_write_inode(struct inode *, struct writeback_control *wbc); 265 265 extern void exofs_delete_inode(struct inode *); 266 266 267 267 /* dir.c: */
+2 -2
fs/exofs/inode.c
··· 1280 1280 return ret; 1281 1281 } 1282 1282 1283 - int exofs_write_inode(struct inode *inode, int wait) 1283 + int exofs_write_inode(struct inode *inode, struct writeback_control *wbc) 1284 1284 { 1285 - return exofs_update_inode(inode, wait); 1285 + return exofs_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 1286 1286 } 1287 1287 1288 1288 /*
+1 -1
fs/ext2/ext2.h
··· 118 118 119 119 /* inode.c */ 120 120 extern struct inode *ext2_iget (struct super_block *, unsigned long); 121 - extern int ext2_write_inode (struct inode *, int); 121 + extern int ext2_write_inode (struct inode *, struct writeback_control *); 122 122 extern void ext2_delete_inode (struct inode *); 123 123 extern int ext2_sync_inode (struct inode *); 124 124 extern int ext2_get_block(struct inode *, sector_t, struct buffer_head *, int);
+9 -2
fs/ext2/inode.c
··· 41 41 MODULE_DESCRIPTION("Second Extended Filesystem"); 42 42 MODULE_LICENSE("GPL"); 43 43 44 + static int __ext2_write_inode(struct inode *inode, int do_sync); 45 + 44 46 /* 45 47 * Test whether an inode is a fast symlink. 46 48 */ ··· 66 64 goto no_delete; 67 65 EXT2_I(inode)->i_dtime = get_seconds(); 68 66 mark_inode_dirty(inode); 69 - ext2_write_inode(inode, inode_needs_sync(inode)); 67 + __ext2_write_inode(inode, inode_needs_sync(inode)); 70 68 71 69 inode->i_size = 0; 72 70 if (inode->i_blocks) ··· 1337 1335 return ERR_PTR(ret); 1338 1336 } 1339 1337 1340 - int ext2_write_inode(struct inode *inode, int do_sync) 1338 + static int __ext2_write_inode(struct inode *inode, int do_sync) 1341 1339 { 1342 1340 struct ext2_inode_info *ei = EXT2_I(inode); 1343 1341 struct super_block *sb = inode->i_sb; ··· 1440 1438 ei->i_state &= ~EXT2_STATE_NEW; 1441 1439 brelse (bh); 1442 1440 return err; 1441 + } 1442 + 1443 + int ext2_write_inode(struct inode *inode, struct writeback_control *wbc) 1444 + { 1445 + return __ext2_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 1443 1446 } 1444 1447 1445 1448 int ext2_sync_inode(struct inode *inode)
+2 -2
fs/ext3/inode.c
··· 3096 3096 * `stuff()' is running, and the new i_size will be lost. Plus the inode 3097 3097 * will no longer be on the superblock's dirty inode list. 3098 3098 */ 3099 - int ext3_write_inode(struct inode *inode, int wait) 3099 + int ext3_write_inode(struct inode *inode, struct writeback_control *wbc) 3100 3100 { 3101 3101 if (current->flags & PF_MEMALLOC) 3102 3102 return 0; ··· 3107 3107 return -EIO; 3108 3108 } 3109 3109 3110 - if (!wait) 3110 + if (wbc->sync_mode != WB_SYNC_ALL) 3111 3111 return 0; 3112 3112 3113 3113 return ext3_force_commit(inode->i_sb);
+1 -1
fs/ext4/ext4.h
··· 1446 1446 struct buffer_head *bh_result, int create); 1447 1447 1448 1448 extern struct inode *ext4_iget(struct super_block *, unsigned long); 1449 - extern int ext4_write_inode(struct inode *, int); 1449 + extern int ext4_write_inode(struct inode *, struct writeback_control *); 1450 1450 extern int ext4_setattr(struct dentry *, struct iattr *); 1451 1451 extern int ext4_getattr(struct vfsmount *mnt, struct dentry *dentry, 1452 1452 struct kstat *stat);
+3 -3
fs/ext4/inode.c
··· 5348 5348 * `stuff()' is running, and the new i_size will be lost. Plus the inode 5349 5349 * will no longer be on the superblock's dirty inode list. 5350 5350 */ 5351 - int ext4_write_inode(struct inode *inode, int wait) 5351 + int ext4_write_inode(struct inode *inode, struct writeback_control *wbc) 5352 5352 { 5353 5353 int err; 5354 5354 ··· 5362 5362 return -EIO; 5363 5363 } 5364 5364 5365 - if (!wait) 5365 + if (wbc->sync_mode != WB_SYNC_ALL) 5366 5366 return 0; 5367 5367 5368 5368 err = ext4_force_commit(inode->i_sb); ··· 5372 5372 err = ext4_get_inode_loc(inode, &iloc); 5373 5373 if (err) 5374 5374 return err; 5375 - if (wait) 5375 + if (wbc->sync_mode == WB_SYNC_ALL) 5376 5376 sync_dirty_buffer(iloc.bh); 5377 5377 if (buffer_req(iloc.bh) && !buffer_uptodate(iloc.bh)) { 5378 5378 ext4_error(inode->i_sb, "IO error syncing inode, "
+7 -2
fs/fat/inode.c
··· 577 577 return i_pos; 578 578 } 579 579 580 - static int fat_write_inode(struct inode *inode, int wait) 580 + static int __fat_write_inode(struct inode *inode, int wait) 581 581 { 582 582 struct super_block *sb = inode->i_sb; 583 583 struct msdos_sb_info *sbi = MSDOS_SB(sb); ··· 634 634 return err; 635 635 } 636 636 637 + static int fat_write_inode(struct inode *inode, struct writeback_control *wbc) 638 + { 639 + return __fat_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 640 + } 641 + 637 642 int fat_sync_inode(struct inode *inode) 638 643 { 639 - return fat_write_inode(inode, 1); 644 + return __fat_write_inode(inode, 1); 640 645 } 641 646 642 647 EXPORT_SYMBOL_GPL(fat_sync_inode);
+13 -9
fs/fs-writeback.c
··· 381 381 move_expired_inodes(&wb->b_dirty, &wb->b_io, older_than_this); 382 382 } 383 383 384 - static int write_inode(struct inode *inode, int sync) 384 + static int write_inode(struct inode *inode, struct writeback_control *wbc) 385 385 { 386 386 if (inode->i_sb->s_op->write_inode && !is_bad_inode(inode)) 387 - return inode->i_sb->s_op->write_inode(inode, sync); 387 + return inode->i_sb->s_op->write_inode(inode, wbc); 388 388 return 0; 389 389 } 390 390 ··· 421 421 writeback_single_inode(struct inode *inode, struct writeback_control *wbc) 422 422 { 423 423 struct address_space *mapping = inode->i_mapping; 424 - int wait = wbc->sync_mode == WB_SYNC_ALL; 425 424 unsigned dirty; 426 425 int ret; 427 426 ··· 438 439 * We'll have another go at writing back this inode when we 439 440 * completed a full scan of b_io. 440 441 */ 441 - if (!wait) { 442 + if (wbc->sync_mode != WB_SYNC_ALL) { 442 443 requeue_io(inode); 443 444 return 0; 444 445 } ··· 460 461 461 462 ret = do_writepages(mapping, wbc); 462 463 463 - /* Don't write the inode if only I_DIRTY_PAGES was set */ 464 - if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { 465 - int err = write_inode(inode, wait); 464 + /* 465 + * Make sure to wait on the data before writing out the metadata. 466 + * This is important for filesystems that modify metadata on data 467 + * I/O completion. 468 + */ 469 + if (wbc->sync_mode == WB_SYNC_ALL) { 470 + int err = filemap_fdatawait(mapping); 466 471 if (ret == 0) 467 472 ret = err; 468 473 } 469 474 470 - if (wait) { 471 - int err = filemap_fdatawait(mapping); 475 + /* Don't write the inode if only I_DIRTY_PAGES was set */ 476 + if (dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { 477 + int err = write_inode(inode, wbc); 472 478 if (ret == 0) 473 479 ret = err; 474 480 }
+3 -2
fs/gfs2/super.c
··· 22 22 #include <linux/crc32.h> 23 23 #include <linux/time.h> 24 24 #include <linux/wait.h> 25 + #include <linux/writeback.h> 25 26 26 27 #include "gfs2.h" 27 28 #include "incore.h" ··· 712 711 * Returns: errno 713 712 */ 714 713 715 - static int gfs2_write_inode(struct inode *inode, int sync) 714 + static int gfs2_write_inode(struct inode *inode, struct writeback_control *wbc) 716 715 { 717 716 struct gfs2_inode *ip = GFS2_I(inode); 718 717 struct gfs2_sbd *sdp = GFS2_SB(inode); ··· 746 745 do_unlock: 747 746 gfs2_glock_dq_uninit(&gh); 748 747 do_flush: 749 - if (sync != 0) 748 + if (wbc->sync_mode == WB_SYNC_ALL) 750 749 gfs2_log_flush(GFS2_SB(inode), ip->i_gl); 751 750 return ret; 752 751 }
+1 -1
fs/hfs/hfs_fs.h
··· 188 188 189 189 extern struct inode *hfs_new_inode(struct inode *, struct qstr *, int); 190 190 extern void hfs_inode_write_fork(struct inode *, struct hfs_extent *, __be32 *, __be32 *); 191 - extern int hfs_write_inode(struct inode *, int); 191 + extern int hfs_write_inode(struct inode *, struct writeback_control *); 192 192 extern int hfs_inode_setattr(struct dentry *, struct iattr *); 193 193 extern void hfs_inode_read_fork(struct inode *inode, struct hfs_extent *ext, 194 194 __be32 log_size, __be32 phys_size, u32 clump_size);
+1 -1
fs/hfs/inode.c
··· 381 381 HFS_SB(inode->i_sb)->alloc_blksz); 382 382 } 383 383 384 - int hfs_write_inode(struct inode *inode, int unused) 384 + int hfs_write_inode(struct inode *inode, struct writeback_control *wbc) 385 385 { 386 386 struct inode *main_inode = inode; 387 387 struct hfs_find_data fd;
+2 -1
fs/hfsplus/super.c
··· 87 87 return ERR_PTR(err); 88 88 } 89 89 90 - static int hfsplus_write_inode(struct inode *inode, int unused) 90 + static int hfsplus_write_inode(struct inode *inode, 91 + struct writeback_control *wbc) 91 92 { 92 93 struct hfsplus_vh *vhdr; 93 94 int ret = 0;
+4 -1
fs/jfs/inode.c
··· 22 22 #include <linux/buffer_head.h> 23 23 #include <linux/pagemap.h> 24 24 #include <linux/quotaops.h> 25 + #include <linux/writeback.h> 25 26 #include "jfs_incore.h" 26 27 #include "jfs_inode.h" 27 28 #include "jfs_filsys.h" ··· 121 120 return rc; 122 121 } 123 122 124 - int jfs_write_inode(struct inode *inode, int wait) 123 + int jfs_write_inode(struct inode *inode, struct writeback_control *wbc) 125 124 { 125 + int wait = wbc->sync_mode == WB_SYNC_ALL; 126 + 126 127 if (test_cflag(COMMIT_Nolink, inode)) 127 128 return 0; 128 129 /*
+1 -1
fs/jfs/jfs_inode.h
··· 26 26 extern long jfs_compat_ioctl(struct file *, unsigned int, unsigned long); 27 27 extern struct inode *jfs_iget(struct super_block *, unsigned long); 28 28 extern int jfs_commit_inode(struct inode *, int); 29 - extern int jfs_write_inode(struct inode*, int); 29 + extern int jfs_write_inode(struct inode *, struct writeback_control *); 30 30 extern void jfs_delete_inode(struct inode *); 31 31 extern void jfs_dirty_inode(struct inode *); 32 32 extern void jfs_truncate(struct inode *);
+5 -3
fs/minix/inode.c
··· 17 17 #include <linux/init.h> 18 18 #include <linux/highuid.h> 19 19 #include <linux/vfs.h> 20 + #include <linux/writeback.h> 20 21 21 - static int minix_write_inode(struct inode * inode, int wait); 22 + static int minix_write_inode(struct inode *inode, 23 + struct writeback_control *wbc); 22 24 static int minix_statfs(struct dentry *dentry, struct kstatfs *buf); 23 25 static int minix_remount (struct super_block * sb, int * flags, char * data); 24 26 ··· 554 552 return bh; 555 553 } 556 554 557 - static int minix_write_inode(struct inode *inode, int wait) 555 + static int minix_write_inode(struct inode *inode, struct writeback_control *wbc) 558 556 { 559 557 int err = 0; 560 558 struct buffer_head *bh; ··· 565 563 bh = V2_minix_update_inode(inode); 566 564 if (!bh) 567 565 return -EIO; 568 - if (wait && buffer_dirty(bh)) { 566 + if (wbc->sync_mode == WB_SYNC_ALL && buffer_dirty(bh)) { 569 567 sync_dirty_buffer(bh); 570 568 if (buffer_req(bh) && !buffer_uptodate(bh)) { 571 569 printk("IO error syncing minix inode [%s:%08lx]\n",
+3 -7
fs/nfs/inode.c
··· 97 97 return ino; 98 98 } 99 99 100 - int nfs_write_inode(struct inode *inode, int sync) 100 + int nfs_write_inode(struct inode *inode, struct writeback_control *wbc) 101 101 { 102 102 int ret; 103 103 104 - if (sync) { 105 - ret = filemap_fdatawait(inode->i_mapping); 106 - if (ret == 0) 107 - ret = nfs_commit_inode(inode, FLUSH_SYNC); 108 - } else 109 - ret = nfs_commit_inode(inode, 0); 104 + ret = nfs_commit_inode(inode, 105 + wbc->sync_mode == WB_SYNC_ALL ? FLUSH_SYNC : 0); 110 106 if (ret >= 0) 111 107 return 0; 112 108 __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
+1 -1
fs/nfs/internal.h
··· 211 211 extern struct workqueue_struct *nfsiod_workqueue; 212 212 extern struct inode *nfs_alloc_inode(struct super_block *sb); 213 213 extern void nfs_destroy_inode(struct inode *); 214 - extern int nfs_write_inode(struct inode *,int); 214 + extern int nfs_write_inode(struct inode *, struct writeback_control *); 215 215 extern void nfs_clear_inode(struct inode *); 216 216 #ifdef CONFIG_NFS_V4 217 217 extern void nfs4_clear_inode(struct inode *);
+1 -1
fs/ntfs/dir.c
··· 1545 1545 write_inode_now(bmp_vi, !datasync); 1546 1546 iput(bmp_vi); 1547 1547 } 1548 - ret = ntfs_write_inode(vi, 1); 1548 + ret = __ntfs_write_inode(vi, 1); 1549 1549 write_inode_now(vi, !datasync); 1550 1550 err = sync_blockdev(vi->i_sb->s_bdev); 1551 1551 if (unlikely(err && !ret))
+1 -1
fs/ntfs/file.c
··· 2182 2182 ntfs_debug("Entering for inode 0x%lx.", vi->i_ino); 2183 2183 BUG_ON(S_ISDIR(vi->i_mode)); 2184 2184 if (!datasync || !NInoNonResident(NTFS_I(vi))) 2185 - ret = ntfs_write_inode(vi, 1); 2185 + ret = __ntfs_write_inode(vi, 1); 2186 2186 write_inode_now(vi, !datasync); 2187 2187 /* 2188 2188 * NOTE: If we were to use mapping->private_list (see ext2 and
+1 -1
fs/ntfs/inode.c
··· 2957 2957 * 2958 2958 * Return 0 on success and -errno on error. 2959 2959 */ 2960 - int ntfs_write_inode(struct inode *vi, int sync) 2960 + int __ntfs_write_inode(struct inode *vi, int sync) 2961 2961 { 2962 2962 sle64 nt; 2963 2963 ntfs_inode *ni = NTFS_I(vi);
+2 -2
fs/ntfs/inode.h
··· 307 307 308 308 extern int ntfs_setattr(struct dentry *dentry, struct iattr *attr); 309 309 310 - extern int ntfs_write_inode(struct inode *vi, int sync); 310 + extern int __ntfs_write_inode(struct inode *vi, int sync); 311 311 312 312 static inline void ntfs_commit_inode(struct inode *vi) 313 313 { 314 314 if (!is_bad_inode(vi)) 315 - ntfs_write_inode(vi, 1); 315 + __ntfs_write_inode(vi, 1); 316 316 return; 317 317 } 318 318
+8
fs/ntfs/super.c
··· 39 39 #include "dir.h" 40 40 #include "debug.h" 41 41 #include "index.h" 42 + #include "inode.h" 42 43 #include "aops.h" 43 44 #include "layout.h" 44 45 #include "malloc.h" ··· 2662 2661 sfs->f_namelen = NTFS_MAX_NAME_LEN; 2663 2662 return 0; 2664 2663 } 2664 + 2665 + #ifdef NTFS_RW 2666 + static int ntfs_write_inode(struct inode *vi, struct writeback_control *wbc) 2667 + { 2668 + return __ntfs_write_inode(vi, wbc->sync_mode == WB_SYNC_ALL); 2669 + } 2670 + #endif 2665 2671 2666 2672 /** 2667 2673 * The complete super operations.
+8 -2
fs/omfs/inode.c
··· 11 11 #include <linux/parser.h> 12 12 #include <linux/buffer_head.h> 13 13 #include <linux/vmalloc.h> 14 + #include <linux/writeback.h> 14 15 #include <linux/crc-itu-t.h> 15 16 #include "omfs.h" 16 17 ··· 90 89 oi->i_head.h_check_xor = xor; 91 90 } 92 91 93 - static int omfs_write_inode(struct inode *inode, int wait) 92 + static int __omfs_write_inode(struct inode *inode, int wait) 94 93 { 95 94 struct omfs_inode *oi; 96 95 struct omfs_sb_info *sbi = OMFS_SB(inode->i_sb); ··· 163 162 return ret; 164 163 } 165 164 165 + static int omfs_write_inode(struct inode *inode, struct writeback_control *wbc) 166 + { 167 + return __omfs_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 168 + } 169 + 166 170 int omfs_sync_inode(struct inode *inode) 167 171 { 168 - return omfs_write_inode(inode, 1); 172 + return __omfs_write_inode(inode, 1); 169 173 } 170 174 171 175 /*
+2 -2
fs/reiserfs/inode.c
··· 1615 1615 ** to properly mark inodes for datasync and such, but only actually 1616 1616 ** does something when called for a synchronous update. 1617 1617 */ 1618 - int reiserfs_write_inode(struct inode *inode, int do_sync) 1618 + int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc) 1619 1619 { 1620 1620 struct reiserfs_transaction_handle th; 1621 1621 int jbegin_count = 1; ··· 1627 1627 ** inode needs to reach disk for safety, and they can safely be 1628 1628 ** ignored because the altered inode has already been logged. 1629 1629 */ 1630 - if (do_sync && !(current->flags & PF_MEMALLOC)) { 1630 + if (wbc->sync_mode == WB_SYNC_ALL && !(current->flags & PF_MEMALLOC)) { 1631 1631 reiserfs_write_lock(inode->i_sb); 1632 1632 if (!journal_begin(&th, inode->i_sb, jbegin_count)) { 1633 1633 reiserfs_update_sd(&th, inode);
+8 -2
fs/sysv/inode.c
··· 26 26 #include <linux/init.h> 27 27 #include <linux/buffer_head.h> 28 28 #include <linux/vfs.h> 29 + #include <linux/writeback.h> 29 30 #include <linux/namei.h> 30 31 #include <asm/byteorder.h> 31 32 #include "sysv.h" ··· 247 246 return ERR_PTR(-EIO); 248 247 } 249 248 250 - int sysv_write_inode(struct inode *inode, int wait) 249 + static int __sysv_write_inode(struct inode *inode, int wait) 251 250 { 252 251 struct super_block * sb = inode->i_sb; 253 252 struct sysv_sb_info * sbi = SYSV_SB(sb); ··· 297 296 return 0; 298 297 } 299 298 299 + int sysv_write_inode(struct inode *inode, struct writeback_control *wbc) 300 + { 301 + return __sysv_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 302 + } 303 + 300 304 int sysv_sync_inode(struct inode *inode) 301 305 { 302 - return sysv_write_inode(inode, 1); 306 + return __sysv_write_inode(inode, 1); 303 307 } 304 308 305 309 static void sysv_delete_inode(struct inode *inode)
+1 -1
fs/sysv/sysv.h
··· 142 142 143 143 /* inode.c */ 144 144 extern struct inode *sysv_iget(struct super_block *, unsigned int); 145 - extern int sysv_write_inode(struct inode *, int); 145 + extern int sysv_write_inode(struct inode *, struct writeback_control *wbc); 146 146 extern int sysv_sync_inode(struct inode *); 147 147 extern void sysv_set_inode(struct inode *, dev_t); 148 148 extern int sysv_getattr(struct vfsmount *, struct dentry *, struct kstat *);
+1 -1
fs/ubifs/dir.c
··· 1120 1120 if (release) 1121 1121 ubifs_release_budget(c, &ino_req); 1122 1122 if (IS_SYNC(old_inode)) 1123 - err = old_inode->i_sb->s_op->write_inode(old_inode, 1); 1123 + err = old_inode->i_sb->s_op->write_inode(old_inode, NULL); 1124 1124 return err; 1125 1125 1126 1126 out_cancel:
+4 -4
fs/ubifs/file.c
··· 1011 1011 /* Is the page fully inside @i_size? */ 1012 1012 if (page->index < end_index) { 1013 1013 if (page->index >= synced_i_size >> PAGE_CACHE_SHIFT) { 1014 - err = inode->i_sb->s_op->write_inode(inode, 1); 1014 + err = inode->i_sb->s_op->write_inode(inode, NULL); 1015 1015 if (err) 1016 1016 goto out_unlock; 1017 1017 /* ··· 1039 1039 kunmap_atomic(kaddr, KM_USER0); 1040 1040 1041 1041 if (i_size > synced_i_size) { 1042 - err = inode->i_sb->s_op->write_inode(inode, 1); 1042 + err = inode->i_sb->s_op->write_inode(inode, NULL); 1043 1043 if (err) 1044 1044 goto out_unlock; 1045 1045 } ··· 1242 1242 if (release) 1243 1243 ubifs_release_budget(c, &req); 1244 1244 if (IS_SYNC(inode)) 1245 - err = inode->i_sb->s_op->write_inode(inode, 1); 1245 + err = inode->i_sb->s_op->write_inode(inode, NULL); 1246 1246 return err; 1247 1247 1248 1248 out: ··· 1316 1316 * the inode unless this is a 'datasync()' call. 1317 1317 */ 1318 1318 if (!datasync || (inode->i_state & I_DIRTY_DATASYNC)) { 1319 - err = inode->i_sb->s_op->write_inode(inode, 1); 1319 + err = inode->i_sb->s_op->write_inode(inode, NULL); 1320 1320 if (err) 1321 1321 return err; 1322 1322 }
+1 -1
fs/ubifs/super.c
··· 283 283 /* 284 284 * Note, Linux write-back code calls this without 'i_mutex'. 285 285 */ 286 - static int ubifs_write_inode(struct inode *inode, int wait) 286 + static int ubifs_write_inode(struct inode *inode, struct writeback_control *wbc) 287 287 { 288 288 int err = 0; 289 289 struct ubifs_info *c = inode->i_sb->s_fs_info;
+2 -2
fs/udf/inode.c
··· 1373 1373 return mode; 1374 1374 } 1375 1375 1376 - int udf_write_inode(struct inode *inode, int sync) 1376 + int udf_write_inode(struct inode *inode, struct writeback_control *wbc) 1377 1377 { 1378 1378 int ret; 1379 1379 1380 1380 lock_kernel(); 1381 - ret = udf_update_inode(inode, sync); 1381 + ret = udf_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 1382 1382 unlock_kernel(); 1383 1383 1384 1384 return ret;
+1 -1
fs/udf/udfdecl.h
··· 142 142 extern void udf_read_inode(struct inode *); 143 143 extern void udf_delete_inode(struct inode *); 144 144 extern void udf_clear_inode(struct inode *); 145 - extern int udf_write_inode(struct inode *, int); 145 + extern int udf_write_inode(struct inode *, struct writeback_control *wbc); 146 146 extern long udf_block_map(struct inode *, sector_t); 147 147 extern int udf_extend_file(struct inode *, struct extent_position *, 148 148 struct kernel_long_ad *, sector_t);
+3 -2
fs/ufs/inode.c
··· 36 36 #include <linux/mm.h> 37 37 #include <linux/smp_lock.h> 38 38 #include <linux/buffer_head.h> 39 + #include <linux/writeback.h> 39 40 40 41 #include "ufs_fs.h" 41 42 #include "ufs.h" ··· 891 890 return 0; 892 891 } 893 892 894 - int ufs_write_inode (struct inode * inode, int wait) 893 + int ufs_write_inode(struct inode *inode, struct writeback_control *wbc) 895 894 { 896 895 int ret; 897 896 lock_kernel(); 898 - ret = ufs_update_inode (inode, wait); 897 + ret = ufs_update_inode(inode, wbc->sync_mode == WB_SYNC_ALL); 899 898 unlock_kernel(); 900 899 return ret; 901 900 }
+1 -1
fs/ufs/ufs.h
··· 106 106 107 107 /* inode.c */ 108 108 extern struct inode *ufs_iget(struct super_block *, unsigned long); 109 - extern int ufs_write_inode (struct inode *, int); 109 + extern int ufs_write_inode (struct inode *, struct writeback_control *); 110 110 extern int ufs_sync_inode (struct inode *); 111 111 extern void ufs_delete_inode (struct inode *); 112 112 extern struct buffer_head * ufs_bread (struct inode *, unsigned, int, int *);
+2 -6
fs/xfs/linux-2.6/xfs_super.c
··· 1063 1063 STATIC int 1064 1064 xfs_fs_write_inode( 1065 1065 struct inode *inode, 1066 - int sync) 1066 + struct writeback_control *wbc) 1067 1067 { 1068 1068 struct xfs_inode *ip = XFS_I(inode); 1069 1069 struct xfs_mount *mp = ip->i_mount; ··· 1074 1074 if (XFS_FORCED_SHUTDOWN(mp)) 1075 1075 return XFS_ERROR(EIO); 1076 1076 1077 - if (sync) { 1078 - error = xfs_wait_on_pages(ip, 0, -1); 1079 - if (error) 1080 - goto out; 1081 - 1077 + if (wbc->sync_mode == WB_SYNC_ALL) { 1082 1078 /* 1083 1079 * Make sure the inode has hit stable storage. By using the 1084 1080 * log and the fsync transactions we reduce the IOs we have
+1 -1
include/linux/ext3_fs.h
··· 877 877 int create); 878 878 879 879 extern struct inode *ext3_iget(struct super_block *, unsigned long); 880 - extern int ext3_write_inode (struct inode *, int); 880 + extern int ext3_write_inode (struct inode *, struct writeback_control *); 881 881 extern int ext3_setattr (struct dentry *, struct iattr *); 882 882 extern void ext3_delete_inode (struct inode *); 883 883 extern int ext3_sync_inode (handle_t *, struct inode *);
+1 -1
include/linux/fs.h
··· 1557 1557 void (*destroy_inode)(struct inode *); 1558 1558 1559 1559 void (*dirty_inode) (struct inode *); 1560 - int (*write_inode) (struct inode *, int); 1560 + int (*write_inode) (struct inode *, struct writeback_control *wbc); 1561 1561 void (*drop_inode) (struct inode *); 1562 1562 void (*delete_inode) (struct inode *); 1563 1563 void (*put_super) (struct super_block *);
+1 -1
include/linux/reiserfs_fs.h
··· 2034 2034 int reiserfs_find_actor(struct inode *inode, void *p); 2035 2035 int reiserfs_init_locked_inode(struct inode *inode, void *p); 2036 2036 void reiserfs_delete_inode(struct inode *inode); 2037 - int reiserfs_write_inode(struct inode *inode, int); 2037 + int reiserfs_write_inode(struct inode *inode, struct writeback_control *wbc); 2038 2038 int reiserfs_get_block(struct inode *inode, sector_t block, 2039 2039 struct buffer_head *bh_result, int create); 2040 2040 struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid,