fs: pass exact type of data dirties to ->dirty_inode
authorChristoph Hellwig <hch@infradead.org>
Fri, 27 May 2011 10:53:02 +0000 (06:53 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 27 May 2011 11:04:40 +0000 (07:04 -0400)
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>
19 files changed:
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

index 61b31acb9176b35bc77c914b2b3913abbcc9e78a..57d827d6071d6b77e18c2c984ae444ac43adbabb 100644 (file)
@@ -104,7 +104,7 @@ of the locking scheme for directory operations.
 prototypes:
        struct inode *(*alloc_inode)(struct super_block *sb);
        void (*destroy_inode)(struct inode *);
-       void (*dirty_inode) (struct inode *);
+       void (*dirty_inode) (struct inode *, int flags);
        int (*write_inode) (struct inode *, struct writeback_control *wbc);
        int (*drop_inode) (struct inode *);
        void (*evict_inode) (struct inode *);
@@ -126,7 +126,7 @@ locking rules:
                        s_umount
 alloc_inode:
 destroy_inode:
-dirty_inode:                           (must not sleep)
+dirty_inode:
 write_inode:
 drop_inode:                            !!!inode->i_lock!!!
 evict_inode:
index 21a7dc467bba197758caceb4d18285f784da6bb2..88b9f5519af976e2cb2f472588cf43bd572b920e 100644 (file)
@@ -211,7 +211,7 @@ struct super_operations {
         struct inode *(*alloc_inode)(struct super_block *sb);
         void (*destroy_inode)(struct inode *);
 
-        void (*dirty_inode) (struct inode *);
+        void (*dirty_inode) (struct inode *, int flags);
         int (*write_inode) (struct inode *, int);
         void (*drop_inode) (struct inode *);
         void (*delete_inode) (struct inode *);
index 8f4b81de3ae2a0ffb21b57080de5649d9a3785ff..d2177e7ad64717a78ca474843872a6c1838aa610 100644 (file)
@@ -2522,7 +2522,7 @@ int btrfs_readpage(struct file *file, struct page *page);
 void btrfs_evict_inode(struct inode *inode);
 void btrfs_put_inode(struct inode *inode);
 int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc);
-void btrfs_dirty_inode(struct inode *inode);
+void btrfs_dirty_inode(struct inode *inode, int flags);
 struct inode *btrfs_alloc_inode(struct super_block *sb);
 void btrfs_destroy_inode(struct inode *inode);
 int btrfs_drop_inode(struct inode *inode);
index 7cd8ab0ef04d5b3e95ccd572f96ca858457e8c18..ecff7d7a505fa3b3d8cfde72b67f2208bc33764c 100644 (file)
@@ -4396,7 +4396,7 @@ int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc)
  * FIXME, needs more benchmarking...there are no reasons other than performance
  * to keep or drop this code.
  */
-void btrfs_dirty_inode(struct inode *inode)
+void btrfs_dirty_inode(struct inode *inode, int flags)
 {
        struct btrfs_root *root = BTRFS_I(inode)->root;
        struct btrfs_trans_handle *trans;
index 68b2e43d7c35fec1576cf7bd5d3136332720ad8e..3451d23c3bae3eedd75d8504694a22735e7dc291 100644 (file)
@@ -3392,7 +3392,7 @@ int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode)
  * so would cause a commit on atime updates, which we don't bother doing.
  * We handle synchronous inodes at the highest possible level.
  */
-void ext3_dirty_inode(struct inode *inode)
+void ext3_dirty_inode(struct inode *inode, int flags)
 {
        handle_t *current_handle = ext3_journal_current_handle();
        handle_t *handle;
index a74b89c09f90f1dcc587b9e5b81b0dfc222257db..1921392cd7085d4b2679ea398979ec78d17d2099 100644 (file)
@@ -1813,7 +1813,7 @@ extern int  ext4_getattr(struct vfsmount *mnt, struct dentry *dentry,
 extern void ext4_evict_inode(struct inode *);
 extern void ext4_clear_inode(struct inode *);
 extern int  ext4_sync_inode(handle_t *, struct inode *);
-extern void ext4_dirty_inode(struct inode *);
+extern void ext4_dirty_inode(struct inode *, int);
 extern int ext4_change_inode_journal_flag(struct inode *, int);
 extern int ext4_get_inode_loc(struct inode *, struct ext4_iloc *);
 extern int ext4_can_truncate(struct inode *inode);
index 50d0e9c645845a4001e4da390318fa0c9e6b45b9..a5763e3505ba59cc330e2cecbcf54c5eb23d8410 100644 (file)
@@ -5733,7 +5733,7 @@ int ext4_mark_inode_dirty(handle_t *handle, struct inode *inode)
  * so would cause a commit on atime updates, which we don't bother doing.
  * We handle synchronous inodes at the highest possible level.
  */
-void ext4_dirty_inode(struct inode *inode)
+void ext4_dirty_inode(struct inode *inode, int flags)
 {
        handle_t *handle;
 
index 34591ee804b58ad8e81ee04b3754dba1bcf77f8c..0f015a0468de53e7c4b27a9a5efdfeb9fa4cd67b 100644 (file)
@@ -1007,9 +1007,6 @@ static noinline void block_dump___mark_inode_dirty(struct inode *inode)
  * In short, make sure you hash any inodes _before_ you start marking
  * them dirty.
  *
- * This function *must* be atomic for the I_DIRTY_PAGES case -
- * set_page_dirty() is called under spinlock in several places.
- *
  * Note that for blockdevs, inode->dirtied_when represents the dirtying time of
  * the block-special inode (/dev/hda1) itself.  And the ->dirtied_when field of
  * the kernel-internal blockdev inode represents the dirtying time of the
@@ -1028,7 +1025,7 @@ void __mark_inode_dirty(struct inode *inode, int flags)
         */
        if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) {
                if (sb->s_op->dirty_inode)
-                       sb->s_op->dirty_inode(inode);
+                       sb->s_op->dirty_inode(inode, flags);
        }
 
        /*
index e896e67767eb9e10515f37a7608fd7bdcc2d330d..46ad619b6124fdd92ab0ac83e439311a58c4ca9b 100644 (file)
@@ -357,7 +357,7 @@ error:
        return ERR_PTR(ret);
 }
 
-void jffs2_dirty_inode(struct inode *inode)
+void jffs2_dirty_inode(struct inode *inode, int flags)
 {
        struct iattr iattr;
 
index 00bae7cc2e48eba4029f0b58d92e2113e057c5a6..65c6c43ca482b4359e675be6c21a0f6d5d97ac69 100644 (file)
@@ -172,7 +172,7 @@ int jffs2_setattr (struct dentry *, struct iattr *);
 int jffs2_do_setattr (struct inode *, struct iattr *);
 struct inode *jffs2_iget(struct super_block *, unsigned long);
 void jffs2_evict_inode (struct inode *);
-void jffs2_dirty_inode(struct inode *inode);
+void jffs2_dirty_inode(struct inode *inode, int flags);
 struct inode *jffs2_new_inode (struct inode *dir_i, int mode,
                               struct jffs2_raw_inode *ri);
 int jffs2_statfs (struct dentry *, struct kstatfs *);
index eddbb373209e9c2dc013657bc041d44badb0aa29..109655904bbcde5ecb62513c5a8712da7486bce6 100644 (file)
@@ -173,7 +173,7 @@ void jfs_evict_inode(struct inode *inode)
        dquot_drop(inode);
 }
 
-void jfs_dirty_inode(struct inode *inode)
+void jfs_dirty_inode(struct inode *inode, int flags)
 {
        static int noisy = 5;
 
index 155e91eff07d6efa31adcea1ea69278f71e18478..ec2fb8b945fc9d0ac102028bbfc6a5c184521683 100644 (file)
@@ -28,7 +28,7 @@ extern struct inode *jfs_iget(struct super_block *, unsigned long);
 extern int jfs_commit_inode(struct inode *, int);
 extern int jfs_write_inode(struct inode *, struct writeback_control *);
 extern void jfs_evict_inode(struct inode *);
-extern void jfs_dirty_inode(struct inode *);
+extern void jfs_dirty_inode(struct inode *, int);
 extern void jfs_truncate(struct inode *);
 extern void jfs_truncate_nolock(struct inode *, loff_t);
 extern void jfs_free_zero_link(struct inode *);
index 587f18432832e542571ba49ad5f3fac6e8669721..b954878ad6cef17094d7337f41823bd73fe48e14 100644 (file)
@@ -917,7 +917,7 @@ int nilfs_mark_inode_dirty(struct inode *inode)
  * construction. This function can be called both as a single operation
  * and as a part of indivisible file operations.
  */
-void nilfs_dirty_inode(struct inode *inode)
+void nilfs_dirty_inode(struct inode *inode, int flags)
 {
        struct nilfs_transaction_info ti;
        struct nilfs_mdt_info *mdi = NILFS_MDT(inode);
index a9c6a531f80c5786ce628e3cbf0bd331ba86141f..f02b9ad43a21f9537d23e3678a115e570488174a 100644 (file)
@@ -269,7 +269,7 @@ int nilfs_load_inode_block(struct inode *inode, struct buffer_head **pbh);
 extern int nilfs_inode_dirty(struct inode *);
 int nilfs_set_file_dirty(struct inode *inode, unsigned nr_dirty);
 extern int nilfs_mark_inode_dirty(struct inode *);
-extern void nilfs_dirty_inode(struct inode *);
+extern void nilfs_dirty_inode(struct inode *, int flags);
 int nilfs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
                 __u64 start, __u64 len);
 
index b216ff6be1c9db1e22e768828beaf6def35d8c75..aa91089162cb568ce4e5426c4b9db2e942240ce7 100644 (file)
@@ -568,7 +568,7 @@ static void destroy_inodecache(void)
 }
 
 /* we don't mark inodes dirty, we just log them */
-static void reiserfs_dirty_inode(struct inode *inode)
+static void reiserfs_dirty_inode(struct inode *inode, int flags)
 {
        struct reiserfs_transaction_handle th;
 
index 6db0bdaa9f7429f6cf1661274db5659065157527..1ab0d22e4c941cd74db7c5486ea05e94b8b7a427 100644 (file)
@@ -382,7 +382,7 @@ done:
        end_writeback(inode);
 }
 
-static void ubifs_dirty_inode(struct inode *inode)
+static void ubifs_dirty_inode(struct inode *inode, int flags)
 {
        struct ubifs_inode *ui = ubifs_inode(inode);
 
index 98b9c91fcdf1d9d101339aadaea2740e74cb6506..1e3a7ce804dce2feb1956036eec54ac7ed27da36 100644 (file)
@@ -925,7 +925,8 @@ xfs_fs_inode_init_once(
  */
 STATIC void
 xfs_fs_dirty_inode(
-       struct inode    *inode)
+       struct inode    *inode,
+       int             flags)
 {
        barrier();
        XFS_I(inode)->i_update_core = 1;
index 85c1d302c12ec6833c013fc076b801da85a07abc..5e06acf95d0f84271b637f41711749c6968a32b4 100644 (file)
@@ -909,7 +909,7 @@ extern int  ext3_setattr (struct dentry *, struct iattr *);
 extern void ext3_evict_inode (struct inode *);
 extern int  ext3_sync_inode (handle_t *, struct inode *);
 extern void ext3_discard_reservation (struct inode *);
-extern void ext3_dirty_inode(struct inode *);
+extern void ext3_dirty_inode(struct inode *, int);
 extern int ext3_change_inode_journal_flag(struct inode *, int);
 extern int ext3_get_inode_loc(struct inode *, struct ext3_iloc *);
 extern int ext3_can_truncate(struct inode *inode);
index 241609346dfb7f0853252b3549a2637f3cd3eb2c..573028df050d4bd3c7428d1ec6fda450cf7bc99c 100644 (file)
@@ -1618,7 +1618,7 @@ struct super_operations {
        struct inode *(*alloc_inode)(struct super_block *sb);
        void (*destroy_inode)(struct inode *);
 
-       void (*dirty_inode) (struct inode *);
+       void (*dirty_inode) (struct inode *, int flags);
        int (*write_inode) (struct inode *, struct writeback_control *wbc);
        int (*drop_inode) (struct inode *);
        void (*evict_inode) (struct inode *);