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

fs: pass exact type of data dirties to ->dirty_inode

Tell the filesystem if we just updated timestamp (I_DIRTY_SYNC) or
anything else, so that the filesystem can track internally if it
needs to push out a transaction for fdatasync or not.

This is just the prototype change with no user for it yet. I plan
to push large XFS changes for the next merge window, and getting
this trivial infrastructure in this window would help a lot to avoid
tree interdependencies.

Also remove incorrect comments that ->dirty_inode can't block. That
has been changed a long time ago, and many implementations rely on it.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

authored by

Christoph Hellwig and committed by
Al Viro
aa385729 d6e9bd25

+21 -23
+2 -2
Documentation/filesystems/Locking
··· 104 104 prototypes: 105 105 struct inode *(*alloc_inode)(struct super_block *sb); 106 106 void (*destroy_inode)(struct inode *); 107 - void (*dirty_inode) (struct inode *); 107 + void (*dirty_inode) (struct inode *, int flags); 108 108 int (*write_inode) (struct inode *, struct writeback_control *wbc); 109 109 int (*drop_inode) (struct inode *); 110 110 void (*evict_inode) (struct inode *); ··· 126 126 s_umount 127 127 alloc_inode: 128 128 destroy_inode: 129 - dirty_inode: (must not sleep) 129 + dirty_inode: 130 130 write_inode: 131 131 drop_inode: !!!inode->i_lock!!! 132 132 evict_inode:
+1 -1
Documentation/filesystems/vfs.txt
··· 211 211 struct inode *(*alloc_inode)(struct super_block *sb); 212 212 void (*destroy_inode)(struct inode *); 213 213 214 - void (*dirty_inode) (struct inode *); 214 + void (*dirty_inode) (struct inode *, int flags); 215 215 int (*write_inode) (struct inode *, int); 216 216 void (*drop_inode) (struct inode *); 217 217 void (*delete_inode) (struct inode *);
+1 -1
fs/btrfs/ctree.h
··· 2522 2522 void btrfs_evict_inode(struct inode *inode); 2523 2523 void btrfs_put_inode(struct inode *inode); 2524 2524 int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); 2525 - void btrfs_dirty_inode(struct inode *inode); 2525 + void btrfs_dirty_inode(struct inode *inode, int flags); 2526 2526 struct inode *btrfs_alloc_inode(struct super_block *sb); 2527 2527 void btrfs_destroy_inode(struct inode *inode); 2528 2528 int btrfs_drop_inode(struct inode *inode);
+1 -1
fs/btrfs/inode.c
··· 4396 4396 * FIXME, needs more benchmarking...there are no reasons other than performance 4397 4397 * to keep or drop this code. 4398 4398 */ 4399 - void btrfs_dirty_inode(struct inode *inode) 4399 + void btrfs_dirty_inode(struct inode *inode, int flags) 4400 4400 { 4401 4401 struct btrfs_root *root = BTRFS_I(inode)->root; 4402 4402 struct btrfs_trans_handle *trans;
+1 -1
fs/ext3/inode.c
··· 3392 3392 * so would cause a commit on atime updates, which we don't bother doing. 3393 3393 * We handle synchronous inodes at the highest possible level. 3394 3394 */ 3395 - void ext3_dirty_inode(struct inode *inode) 3395 + void ext3_dirty_inode(struct inode *inode, int flags) 3396 3396 { 3397 3397 handle_t *current_handle = ext3_journal_current_handle(); 3398 3398 handle_t *handle;
+1 -1
fs/ext4/ext4.h
··· 1813 1813 extern void ext4_evict_inode(struct inode *); 1814 1814 extern void ext4_clear_inode(struct inode *); 1815 1815 extern int ext4_sync_inode(handle_t *, struct inode *); 1816 - extern void ext4_dirty_inode(struct inode *); 1816 + extern void ext4_dirty_inode(struct inode *, int); 1817 1817 extern int ext4_change_inode_journal_flag(struct inode *, int); 1818 1818 extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *); 1819 1819 extern int ext4_can_truncate(struct inode *inode);
+1 -1
fs/ext4/inode.c
··· 5733 5733 * so would cause a commit on atime updates, which we don't bother doing. 5734 5734 * We handle synchronous inodes at the highest possible level. 5735 5735 */ 5736 - void ext4_dirty_inode(struct inode *inode) 5736 + void ext4_dirty_inode(struct inode *inode, int flags) 5737 5737 { 5738 5738 handle_t *handle; 5739 5739
+1 -4
fs/fs-writeback.c
··· 1007 1007 * In short, make sure you hash any inodes _before_ you start marking 1008 1008 * them dirty. 1009 1009 * 1010 - * This function *must* be atomic for the I_DIRTY_PAGES case - 1011 - * set_page_dirty() is called under spinlock in several places. 1012 - * 1013 1010 * Note that for blockdevs, inode->dirtied_when represents the dirtying time of 1014 1011 * the block-special inode (/dev/hda1) itself. And the ->dirtied_when field of 1015 1012 * the kernel-internal blockdev inode represents the dirtying time of the ··· 1025 1028 */ 1026 1029 if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) { 1027 1030 if (sb->s_op->dirty_inode) 1028 - sb->s_op->dirty_inode(inode); 1031 + sb->s_op->dirty_inode(inode, flags); 1029 1032 } 1030 1033 1031 1034 /*
+1 -1
fs/jffs2/fs.c
··· 357 357 return ERR_PTR(ret); 358 358 } 359 359 360 - void jffs2_dirty_inode(struct inode *inode) 360 + void jffs2_dirty_inode(struct inode *inode, int flags) 361 361 { 362 362 struct iattr iattr; 363 363
+1 -1
fs/jffs2/os-linux.h
··· 172 172 int jffs2_do_setattr (struct inode *, struct iattr *); 173 173 struct inode *jffs2_iget(struct super_block *, unsigned long); 174 174 void jffs2_evict_inode (struct inode *); 175 - void jffs2_dirty_inode(struct inode *inode); 175 + void jffs2_dirty_inode(struct inode *inode, int flags); 176 176 struct inode *jffs2_new_inode (struct inode *dir_i, int mode, 177 177 struct jffs2_raw_inode *ri); 178 178 int jffs2_statfs (struct dentry *, struct kstatfs *);
+1 -1
fs/jfs/inode.c
··· 173 173 dquot_drop(inode); 174 174 } 175 175 176 - void jfs_dirty_inode(struct inode *inode) 176 + void jfs_dirty_inode(struct inode *inode, int flags) 177 177 { 178 178 static int noisy = 5; 179 179
+1 -1
fs/jfs/jfs_inode.h
··· 28 28 extern int jfs_commit_inode(struct inode *, int); 29 29 extern int jfs_write_inode(struct inode *, struct writeback_control *); 30 30 extern void jfs_evict_inode(struct inode *); 31 - extern void jfs_dirty_inode(struct inode *); 31 + extern void jfs_dirty_inode(struct inode *, int); 32 32 extern void jfs_truncate(struct inode *); 33 33 extern void jfs_truncate_nolock(struct inode *, loff_t); 34 34 extern void jfs_free_zero_link(struct inode *);
+1 -1
fs/nilfs2/inode.c
··· 917 917 * construction. This function can be called both as a single operation 918 918 * and as a part of indivisible file operations. 919 919 */ 920 - void nilfs_dirty_inode(struct inode *inode) 920 + void nilfs_dirty_inode(struct inode *inode, int flags) 921 921 { 922 922 struct nilfs_transaction_info ti; 923 923 struct nilfs_mdt_info *mdi = NILFS_MDT(inode);
+1 -1
fs/nilfs2/nilfs.h
··· 269 269 extern int nilfs_inode_dirty(struct inode *); 270 270 int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty); 271 271 extern int nilfs_mark_inode_dirty(struct inode *); 272 - extern void nilfs_dirty_inode(struct inode *); 272 + extern void nilfs_dirty_inode(struct inode *, int flags); 273 273 int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, 274 274 __u64 start, __u64 len); 275 275
+1 -1
fs/reiserfs/super.c
··· 568 568 } 569 569 570 570 /* we don't mark inodes dirty, we just log them */ 571 - static void reiserfs_dirty_inode(struct inode *inode) 571 + static void reiserfs_dirty_inode(struct inode *inode, int flags) 572 572 { 573 573 struct reiserfs_transaction_handle th; 574 574
+1 -1
fs/ubifs/super.c
··· 382 382 end_writeback(inode); 383 383 } 384 384 385 - static void ubifs_dirty_inode(struct inode *inode) 385 + static void ubifs_dirty_inode(struct inode *inode, int flags) 386 386 { 387 387 struct ubifs_inode *ui = ubifs_inode(inode); 388 388
+2 -1
fs/xfs/linux-2.6/xfs_super.c
··· 925 925 */ 926 926 STATIC void 927 927 xfs_fs_dirty_inode( 928 - struct inode *inode) 928 + struct inode *inode, 929 + int flags) 929 930 { 930 931 barrier(); 931 932 XFS_I(inode)->i_update_core = 1;
+1 -1
include/linux/ext3_fs.h
··· 909 909 extern void ext3_evict_inode (struct inode *); 910 910 extern int ext3_sync_inode (handle_t *, struct inode *); 911 911 extern void ext3_discard_reservation (struct inode *); 912 - extern void ext3_dirty_inode(struct inode *); 912 + extern void ext3_dirty_inode(struct inode *, int); 913 913 extern int ext3_change_inode_journal_flag(struct inode *, int); 914 914 extern int ext3_get_inode_loc(struct inode *, struct ext3_iloc *); 915 915 extern int ext3_can_truncate(struct inode *inode);
+1 -1
include/linux/fs.h
··· 1618 1618 struct inode *(*alloc_inode)(struct super_block *sb); 1619 1619 void (*destroy_inode)(struct inode *); 1620 1620 1621 - void (*dirty_inode) (struct inode *); 1621 + void (*dirty_inode) (struct inode *, int flags); 1622 1622 int (*write_inode) (struct inode *, struct writeback_control *wbc); 1623 1623 int (*drop_inode) (struct inode *); 1624 1624 void (*evict_inode) (struct inode *);