Commit aa38572954ade525817fe88c54faebf85e5a61c0
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
- Documentation/filesystems/vfs.txt
- fs/btrfs/ctree.h
- fs/btrfs/inode.c
- fs/ext3/inode.c
- fs/ext4/ext4.h
- fs/ext4/inode.c
- fs/fs-writeback.c
- fs/jffs2/fs.c
- fs/jffs2/os-linux.h
- fs/jfs/inode.c
- fs/jfs/jfs_inode.h
- fs/nilfs2/inode.c
- fs/nilfs2/nilfs.h
- fs/reiserfs/super.c
- fs/ubifs/super.c
- fs/xfs/linux-2.6/xfs_super.c
- include/linux/ext3_fs.h
- include/linux/fs.h
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 *); |
fs/btrfs/ctree.h
... | ... | @@ -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); |
fs/btrfs/inode.c
... | ... | @@ -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; |
fs/ext3/inode.c
... | ... | @@ -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; |
fs/ext4/ext4.h
... | ... | @@ -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); |
fs/ext4/inode.c
... | ... | @@ -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 |
fs/fs-writeback.c
... | ... | @@ -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 | /* |
fs/jffs2/fs.c
fs/jffs2/os-linux.h
... | ... | @@ -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 *); |
fs/jfs/inode.c
fs/jfs/jfs_inode.h
... | ... | @@ -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 *); |
fs/nilfs2/inode.c
... | ... | @@ -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); |
fs/nilfs2/nilfs.h
... | ... | @@ -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 |
fs/reiserfs/super.c
fs/ubifs/super.c
fs/xfs/linux-2.6/xfs_super.c
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); |
include/linux/fs.h
... | ... | @@ -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 *); |