--- x/fs/inode.c 2022-08-14 08:13:30.264692600 +0800 +++ y/fs/inode.c 2022-08-14 08:38:01.756958700 +0800 @@ -218,6 +218,7 @@ int inode_init_always(struct super_block &sb->s_type->invalidate_lock_key, "mapping.invalidate_lock"); inode->i_private = NULL; + init_waitqueue_head(&inode->i_dio_waitq); inode->i_mapping = mapping; INIT_HLIST_HEAD(&inode->i_dentry); /* buggered by rcu freeing */ #ifdef CONFIG_FS_POSIX_ACL @@ -2367,22 +2368,6 @@ bool inode_owner_or_capable(struct user_ } EXPORT_SYMBOL(inode_owner_or_capable); -/* - * Direct i/o helper functions - */ -static void __inode_dio_wait(struct inode *inode) -{ - wait_queue_head_t *wq = bit_waitqueue(&inode->i_state, __I_DIO_WAKEUP); - DEFINE_WAIT_BIT(q, &inode->i_state, __I_DIO_WAKEUP); - - do { - prepare_to_wait(wq, &q.wq_entry, TASK_UNINTERRUPTIBLE); - if (atomic_read(&inode->i_dio_count)) - schedule(); - } while (atomic_read(&inode->i_dio_count)); - finish_wait(wq, &q.wq_entry); -} - /** * inode_dio_wait - wait for outstanding DIO requests to finish * @inode: inode to wait for @@ -2395,8 +2380,7 @@ static void __inode_dio_wait(struct inod */ void inode_dio_wait(struct inode *inode) { - if (atomic_read(&inode->i_dio_count)) - __inode_dio_wait(inode); + wait_event(inode->i_dio_waitq, 0 == atomic_read(&inode->i_dio_count)); } EXPORT_SYMBOL(inode_dio_wait); --- x/include/linux/fs.h 2022-08-13 15:09:45.392217800 +0800 +++ y/include/linux/fs.h 2022-08-14 08:28:14.731513600 +0800 @@ -703,6 +703,7 @@ struct inode { struct fsverity_info *i_verity_info; #endif + wait_queue_head_t i_dio_waitq; void *i_private; /* fs or device private pointer */ } __randomize_layout; @@ -3218,7 +3219,7 @@ static inline void inode_dio_begin(struc static inline void inode_dio_end(struct inode *inode) { if (atomic_dec_and_test(&inode->i_dio_count)) - wake_up_bit(&inode->i_state, __I_DIO_WAKEUP); + wake_up(&inode->i_dio_waitq); } /*