diff options
Diffstat (limited to 'fs/fs-writeback.c')
-rw-r--r-- | fs/fs-writeback.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c index 08f5496fcf1b..25458fa4753d 100644 --- a/fs/fs-writeback.c +++ b/fs/fs-writeback.c @@ -618,10 +618,18 @@ void wbc_account_io(struct writeback_control *wbc, struct page *page, */ int inode_congested(struct inode *inode, int cong_bits) { - if (inode) { - struct bdi_writeback *wb = inode_to_wb(inode); - if (wb) - return wb_congested(wb, cong_bits); + /* + * Once set, ->i_wb never becomes NULL while the inode is alive. + * Start transaction iff ->i_wb is visible. + */ + if (inode && inode_to_wb(inode)) { + struct bdi_writeback *wb; + bool locked, congested; + + wb = unlocked_inode_to_wb_begin(inode, &locked); + congested = wb_congested(wb, cong_bits); + unlocked_inode_to_wb_end(inode, locked); + return congested; } return wb_congested(&inode_to_bdi(inode)->wb, cong_bits); |