diff options
author | Christian Brauner <brauner@kernel.org> | 2024-08-16 16:35:52 +0200 |
---|---|---|
committer | Christian Brauner <brauner@kernel.org> | 2024-08-30 08:22:37 +0200 |
commit | 1c48d441468c425e878d81c5c3e7ff8a9a594cc0 (patch) | |
tree | a6432d1d46a5453cd14228133606f19f77ffbd72 /fs/inode.c | |
parent | 3717bbcb5905e55153667d6a277b2c3545e83b38 (diff) | |
download | linux-1c48d441468c425e878d81c5c3e7ff8a9a594cc0.tar.gz linux-1c48d441468c425e878d81c5c3e7ff8a9a594cc0.tar.bz2 linux-1c48d441468c425e878d81c5c3e7ff8a9a594cc0.zip |
inode: remove __I_DIO_WAKEUP
Afaict, we can just rely on inode->i_dio_count for waiting instead of
this awkward indirection through __I_DIO_WAKEUP. This survives LTP dio
and xfstests dio tests.
Link: https://lore.kernel.org/r/20240816-vfs-misc-dio-v1-1-80fe21a2c710@kernel.org
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Diffstat (limited to 'fs/inode.c')
-rw-r--r-- | fs/inode.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/fs/inode.c b/fs/inode.c index de0969d6009c..248a131a02c3 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -2500,18 +2500,11 @@ EXPORT_SYMBOL(inode_owner_or_capable); /* * Direct i/o helper functions */ -static void __inode_dio_wait(struct inode *inode) +bool inode_dio_finished(const 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); + return atomic_read(&inode->i_dio_count) == 0; } +EXPORT_SYMBOL(inode_dio_finished); /** * inode_dio_wait - wait for outstanding DIO requests to finish @@ -2525,11 +2518,17 @@ static void __inode_dio_wait(struct inode *inode) */ void inode_dio_wait(struct inode *inode) { - if (atomic_read(&inode->i_dio_count)) - __inode_dio_wait(inode); + wait_var_event(&inode->i_dio_count, inode_dio_finished(inode)); } EXPORT_SYMBOL(inode_dio_wait); +void inode_dio_wait_interruptible(struct inode *inode) +{ + wait_var_event_interruptible(&inode->i_dio_count, + inode_dio_finished(inode)); +} +EXPORT_SYMBOL(inode_dio_wait_interruptible); + /* * inode_set_flags - atomically set some inode flags * |