Skip to content

Commit 23dc9c7

Browse files
committed
Merge tag 'for-6.2/writeback-2022-12-12' of git://git.kernel.dk/linux
Pull writeback updates from Jens Axboe: - Sanity check adding freed inodes to lists (Jan) - Removal of an old unused define (Miaohe) * tag 'for-6.2/writeback-2022-12-12' of git://git.kernel.dk/linux: writeback: remove obsolete macro EXPIRE_DIRTY_ATIME writeback: Add asserts for adding freed inode to lists
2 parents fe36bb8 + 23e188a commit 23dc9c7

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

fs/fs-writeback.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ static bool inode_io_list_move_locked(struct inode *inode,
121121
{
122122
assert_spin_locked(&wb->list_lock);
123123
assert_spin_locked(&inode->i_lock);
124+
WARN_ON_ONCE(inode->i_state & I_FREEING);
124125

125126
list_move(&inode->i_io_list, head);
126127

@@ -280,6 +281,7 @@ static void inode_cgwb_move_to_attached(struct inode *inode,
280281
{
281282
assert_spin_locked(&wb->list_lock);
282283
assert_spin_locked(&inode->i_lock);
284+
WARN_ON_ONCE(inode->i_state & I_FREEING);
283285

284286
inode->i_state &= ~I_SYNC_QUEUED;
285287
if (wb != &wb->bdi->wb)
@@ -1129,6 +1131,7 @@ static void inode_cgwb_move_to_attached(struct inode *inode,
11291131
{
11301132
assert_spin_locked(&wb->list_lock);
11311133
assert_spin_locked(&inode->i_lock);
1134+
WARN_ON_ONCE(inode->i_state & I_FREEING);
11321135

11331136
inode->i_state &= ~I_SYNC_QUEUED;
11341137
list_del_init(&inode->i_io_list);
@@ -1294,6 +1297,17 @@ static void redirty_tail_locked(struct inode *inode, struct bdi_writeback *wb)
12941297
{
12951298
assert_spin_locked(&inode->i_lock);
12961299

1300+
inode->i_state &= ~I_SYNC_QUEUED;
1301+
/*
1302+
* When the inode is being freed just don't bother with dirty list
1303+
* tracking. Flush worker will ignore this inode anyway and it will
1304+
* trigger assertions in inode_io_list_move_locked().
1305+
*/
1306+
if (inode->i_state & I_FREEING) {
1307+
list_del_init(&inode->i_io_list);
1308+
wb_io_lists_depopulated(wb);
1309+
return;
1310+
}
12971311
if (!list_empty(&wb->b_dirty)) {
12981312
struct inode *tail;
12991313

@@ -1302,7 +1316,6 @@ static void redirty_tail_locked(struct inode *inode, struct bdi_writeback *wb)
13021316
inode->dirtied_when = jiffies;
13031317
}
13041318
inode_io_list_move_locked(inode, wb, &wb->b_dirty);
1305-
inode->i_state &= ~I_SYNC_QUEUED;
13061319
}
13071320

13081321
static void redirty_tail(struct inode *inode, struct bdi_writeback *wb)
@@ -1345,8 +1358,6 @@ static bool inode_dirtied_after(struct inode *inode, unsigned long t)
13451358
return ret;
13461359
}
13471360

1348-
#define EXPIRE_DIRTY_ATIME 0x0001
1349-
13501361
/*
13511362
* Move expired (dirtied before dirtied_before) dirty inodes from
13521363
* @delaying_queue to @dispatch_queue.

0 commit comments

Comments
 (0)