Instead of checking I_WILL_FREE or I_FREEING simply grab a reference to the inode, as it will only succeed if the inode is live. Signed-off-by: Josef Bacik --- block/bdev.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/block/bdev.c b/block/bdev.c index b77ddd12dc06..94ffc0b5a68c 100644 --- a/block/bdev.c +++ b/block/bdev.c @@ -1265,13 +1265,15 @@ void sync_bdevs(bool wait) struct block_device *bdev; spin_lock(&inode->i_lock); - if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW) || - mapping->nrpages == 0) { + if (inode->i_state & I_NEW || mapping->nrpages == 0) { spin_unlock(&inode->i_lock); continue; } - __iget(inode); spin_unlock(&inode->i_lock); + + if (!igrab(inode)) + continue; + spin_unlock(&blockdev_superblock->s_inode_list_lock); /* * We hold a reference to 'inode' so it couldn't have been -- 2.49.0