ext4: mark all metadata I/O with REQ_META
authorTheodore Ts'o <tytso@mit.edu>
Sat, 20 Apr 2013 19:46:17 +0000 (15:46 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 20 Apr 2013 19:46:17 +0000 (15:46 -0400)
As Dave Chinner pointed out at the 2013 LSF/MM workshop, it's
important that metadata I/O requests are marked as such to avoid
priority inversions caused by I/O bandwidth throttling.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/balloc.c
fs/ext4/ialloc.c
fs/ext4/mmp.c
fs/ext4/super.c

index 8dcaea69e37fdbf0de0acb9f92c251166851afbb..d0f13eada0ed5799295a5378642cd3786cf32595 100644 (file)
@@ -441,7 +441,7 @@ ext4_read_block_bitmap_nowait(struct super_block *sb, ext4_group_t block_group)
        trace_ext4_read_block_bitmap_load(sb, block_group);
        bh->b_end_io = ext4_end_bitmap_read;
        get_bh(bh);
-       submit_bh(READ, bh);
+       submit_bh(READ | REQ_META | REQ_PRIO, bh);
        return bh;
 verify:
        ext4_validate_block_bitmap(sb, desc, block_group, bh);
index 18d36d85f5c9e1bd22286726ee6628e742c56612..00a818d67b54930c74dad44c6f73dcb3f01e6a19 100644 (file)
@@ -166,7 +166,7 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group)
        trace_ext4_load_inode_bitmap(sb, block_group);
        bh->b_end_io = ext4_end_bitmap_read;
        get_bh(bh);
-       submit_bh(READ, bh);
+       submit_bh(READ | REQ_META | REQ_PRIO, bh);
        wait_on_buffer(bh);
        if (!buffer_uptodate(bh)) {
                put_bh(bh);
index b3b1f7d99448368c762139a3c844dc84596752c7..214461e42a05c8be0374224c81c2a549135b7014 100644 (file)
@@ -54,7 +54,7 @@ static int write_mmp_block(struct super_block *sb, struct buffer_head *bh)
        lock_buffer(bh);
        bh->b_end_io = end_buffer_write_sync;
        get_bh(bh);
-       submit_bh(WRITE_SYNC, bh);
+       submit_bh(WRITE_SYNC | REQ_META | REQ_PRIO, bh);
        wait_on_buffer(bh);
        sb_end_write(sb);
        if (unlikely(!buffer_uptodate(bh)))
@@ -86,7 +86,7 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh,
                get_bh(*bh);
                lock_buffer(*bh);
                (*bh)->b_end_io = end_buffer_read_sync;
-               submit_bh(READ_SYNC, *bh);
+               submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh);
                wait_on_buffer(*bh);
                if (!buffer_uptodate(*bh)) {
                        brelse(*bh);
index bfa29ecfb47a9af714503731a6b26265751c9cf6..dbc7c090c13a782a9976fcbe9a8500e6158f6412 100644 (file)
@@ -4252,7 +4252,7 @@ static journal_t *ext4_get_dev_journal(struct super_block *sb,
                goto out_bdev;
        }
        journal->j_private = sb;
-       ll_rw_block(READ, 1, &journal->j_sb_buffer);
+       ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &journal->j_sb_buffer);
        wait_on_buffer(journal->j_sb_buffer);
        if (!buffer_uptodate(journal->j_sb_buffer)) {
                ext4_msg(sb, KERN_ERR, "I/O error on journal device");