On Wed 25-01-23 07:58:38, Christoph Hellwig wrote: > sb_init_dio_done_wq is also used by the iomap code, so move it to > super.c in preparation for building direct-io.c conditionally. > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/direct-io.c | 24 ------------------------ > fs/internal.h | 4 +--- > fs/super.c | 24 ++++++++++++++++++++++++ > 3 files changed, 25 insertions(+), 27 deletions(-) > > diff --git a/fs/direct-io.c b/fs/direct-io.c > index 03d381377ae10a..ab0d7ea89813a6 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -558,30 +558,6 @@ static inline int dio_bio_reap(struct dio *dio, struct dio_submit *sdio) > return ret; > } > > -/* > - * Create workqueue for deferred direct IO completions. We allocate the > - * workqueue when it's first needed. This avoids creating workqueue for > - * filesystems that don't need it and also allows us to create the workqueue > - * late enough so the we can include s_id in the name of the workqueue. > - */ > -int sb_init_dio_done_wq(struct super_block *sb) > -{ > - struct workqueue_struct *old; > - struct workqueue_struct *wq = alloc_workqueue("dio/%s", > - WQ_MEM_RECLAIM, 0, > - sb->s_id); > - if (!wq) > - return -ENOMEM; > - /* > - * This has to be atomic as more DIOs can race to create the workqueue > - */ > - old = cmpxchg(&sb->s_dio_done_wq, NULL, wq); > - /* Someone created workqueue before us? Free ours... */ > - if (old) > - destroy_workqueue(wq); > - return 0; > -} > - > static int dio_set_defer_completion(struct dio *dio) > { > struct super_block *sb = dio->inode->i_sb; > diff --git a/fs/internal.h b/fs/internal.h > index a803cc3cf716ab..cb0c0749661aae 100644 > --- a/fs/internal.h > +++ b/fs/internal.h > @@ -120,6 +120,7 @@ extern bool trylock_super(struct super_block *sb); > struct super_block *user_get_super(dev_t, bool excl); > void put_super(struct super_block *sb); > extern bool mount_capable(struct fs_context *); > +int sb_init_dio_done_wq(struct super_block *sb); > > /* > * open.c > @@ -187,9 +188,6 @@ extern void mnt_pin_kill(struct mount *m); > */ > extern const struct dentry_operations ns_dentry_operations; > > -/* direct-io.c: */ > -int sb_init_dio_done_wq(struct super_block *sb); > - > /* > * fs/stat.c: > */ > diff --git a/fs/super.c b/fs/super.c > index 12c08cb20405d5..904adfbacdcf3c 100644 > --- a/fs/super.c > +++ b/fs/super.c > @@ -1764,3 +1764,27 @@ int thaw_super(struct super_block *sb) > return thaw_super_locked(sb); > } > EXPORT_SYMBOL(thaw_super); > + > +/* > + * Create workqueue for deferred direct IO completions. We allocate the > + * workqueue when it's first needed. This avoids creating workqueue for > + * filesystems that don't need it and also allows us to create the workqueue > + * late enough so the we can include s_id in the name of the workqueue. > + */ > +int sb_init_dio_done_wq(struct super_block *sb) > +{ > + struct workqueue_struct *old; > + struct workqueue_struct *wq = alloc_workqueue("dio/%s", > + WQ_MEM_RECLAIM, 0, > + sb->s_id); > + if (!wq) > + return -ENOMEM; > + /* > + * This has to be atomic as more DIOs can race to create the workqueue > + */ > + old = cmpxchg(&sb->s_dio_done_wq, NULL, wq); > + /* Someone created workqueue before us? Free ours... */ > + if (old) > + destroy_workqueue(wq); > + return 0; > +} > -- > 2.39.0 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR