Commit aa38572954ade525817fe88c54faebf85e5a61c0

Authored by Christoph Hellwig
Committed by Al Viro
1 parent d6e9bd256c

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>

Showing 19 changed files with 21 additions and 23 deletions Side-by-side Diff

Documentation/filesystems/Locking
... ... @@ -104,7 +104,7 @@
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,7 +126,7 @@
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:
Documentation/filesystems/vfs.txt
... ... @@ -211,7 +211,7 @@
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 *);
... ... @@ -2522,7 +2522,7 @@
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);
... ... @@ -4396,7 +4396,7 @@
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;
... ... @@ -3392,7 +3392,7 @@
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;
... ... @@ -1813,7 +1813,7 @@
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);
... ... @@ -5733,7 +5733,7 @@
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  
... ... @@ -1007,9 +1007,6 @@
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
... ... @@ -1028,7 +1025,7 @@
1028 1025 */
1029 1026 if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) {
1030 1027 if (sb->s_op->dirty_inode)
1031   - sb->s_op->dirty_inode(inode);
  1028 + sb->s_op->dirty_inode(inode, flags);
1032 1029 }
1033 1030  
1034 1031 /*
... ... @@ -357,7 +357,7 @@
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  
... ... @@ -172,7 +172,7 @@
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 *);
... ... @@ -173,7 +173,7 @@
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  
... ... @@ -28,7 +28,7 @@
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 *);
... ... @@ -917,7 +917,7 @@
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);
... ... @@ -269,7 +269,7 @@
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  
... ... @@ -568,7 +568,7 @@
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  
... ... @@ -382,7 +382,7 @@
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  
fs/xfs/linux-2.6/xfs_super.c
... ... @@ -925,7 +925,8 @@
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;
include/linux/ext3_fs.h
... ... @@ -909,7 +909,7 @@
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);
... ... @@ -1618,7 +1618,7 @@
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 *);