diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2012-09-29 00:41:21 -0400 |
---|---|---|
committer | Theodore Ts'o <tytso@mit.edu> | 2012-09-29 00:41:21 -0400 |
commit | 17335dcc471199717839b2fa3492ca36f70f1168 (patch) | |
tree | 5f39f51868f60f8be94ca7e811d34bba443ef288 /fs/ext4/ext4.h | |
parent | 28a535f9a0df060569dcc786e5bc2e1de43d7dc7 (diff) |
ext4: serialize dio nonlocked reads with defrag workers
Inode's block defrag and ext4_change_inode_journal_flag() may
affect nonlocked DIO reads result, so proper synchronization
required.
- Add missed inode_dio_wait() calls where appropriate
- Check inode state under extra i_dio_count reference.
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/ext4.h')
-rw-r--r-- | fs/ext4/ext4.h | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h index edb049579420..1be2b4472a83 100644 --- a/fs/ext4/ext4.h +++ b/fs/ext4/ext4.h | |||
@@ -1358,6 +1358,8 @@ enum { | |||
1358 | EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ | 1358 | EXT4_STATE_DIO_UNWRITTEN, /* need convert on dio done*/ |
1359 | EXT4_STATE_NEWENTRY, /* File just added to dir */ | 1359 | EXT4_STATE_NEWENTRY, /* File just added to dir */ |
1360 | EXT4_STATE_DELALLOC_RESERVED, /* blks already reserved for delalloc */ | 1360 | EXT4_STATE_DELALLOC_RESERVED, /* blks already reserved for delalloc */ |
1361 | EXT4_STATE_DIOREAD_LOCK, /* Disable support for dio read | ||
1362 | nolocking */ | ||
1361 | }; | 1363 | }; |
1362 | 1364 | ||
1363 | #define EXT4_INODE_BIT_FNS(name, field, offset) \ | 1365 | #define EXT4_INODE_BIT_FNS(name, field, offset) \ |
@@ -2469,6 +2471,21 @@ static inline void set_bitmap_uptodate(struct buffer_head *bh) | |||
2469 | set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state); | 2471 | set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state); |
2470 | } | 2472 | } |
2471 | 2473 | ||
2474 | /* | ||
2475 | * Disable DIO read nolock optimization, so new dioreaders will be forced | ||
2476 | * to grab i_mutex | ||
2477 | */ | ||
2478 | static inline void ext4_inode_block_unlocked_dio(struct inode *inode) | ||
2479 | { | ||
2480 | ext4_set_inode_state(inode, EXT4_STATE_DIOREAD_LOCK); | ||
2481 | smp_mb(); | ||
2482 | } | ||
2483 | static inline void ext4_inode_resume_unlocked_dio(struct inode *inode) | ||
2484 | { | ||
2485 | smp_mb(); | ||
2486 | ext4_clear_inode_state(inode, EXT4_STATE_DIOREAD_LOCK); | ||
2487 | } | ||
2488 | |||
2472 | #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) | 2489 | #define in_range(b, first, len) ((b) >= (first) && (b) <= (first) + (len) - 1) |
2473 | 2490 | ||
2474 | /* For ioend & aio unwritten conversion wait queues */ | 2491 | /* For ioend & aio unwritten conversion wait queues */ |