Message ID | 20220518233709.1937634-3-shr@fb.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | io-uring/xfs: support async buffered writes | expand |
* This function returns a newly allocated iomap for the folio with the settings > + * specified in the gfp parameter. > + * > + **/ > static struct iomap_page * > -iomap_page_create(struct inode *inode, struct folio *folio) > +iomap_page_create_gfp(struct inode *inode, struct folio *folio, > + unsigned int nr_blocks, gfp_t gfp) > { > - struct iomap_page *iop = to_iomap_page(folio); > - unsigned int nr_blocks = i_blocks_per_folio(inode, folio); > + struct iomap_page *iop; > > - if (iop || nr_blocks <= 1) > + iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), gfp); > + if (!iop) > return iop; > > - iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), > - GFP_NOFS | __GFP_NOFAIL); > spin_lock_init(&iop->uptodate_lock); > if (folio_test_uptodate(folio)) > bitmap_fill(iop->uptodate, nr_blocks); > @@ -61,6 +71,18 @@ iomap_page_create(struct inode *inode, struct folio *folio) > return iop; > } > > +static struct iomap_page * > +iomap_page_create(struct inode *inode, struct folio *folio) > +{ > + struct iomap_page *iop = to_iomap_page(folio); > + unsigned int nr_blocks = i_blocks_per_folio(inode, folio); > + > + if (iop || nr_blocks <= 1) > + return iop; > + > + return iomap_page_create_gfp(inode, folio, nr_blocks, GFP_NOFS | __GFP_NOFAIL); Overly long line here. Mor importantly why do you need a helper that does not do the number of blocks check? Why can't we just pass a gfp_t to iomap_page_create?
On 5/19/22 1:18 AM, Christoph Hellwig wrote: > * This function returns a newly allocated iomap for the folio with the settings >> + * specified in the gfp parameter. >> + * >> + **/ >> static struct iomap_page * >> -iomap_page_create(struct inode *inode, struct folio *folio) >> +iomap_page_create_gfp(struct inode *inode, struct folio *folio, >> + unsigned int nr_blocks, gfp_t gfp) >> { >> - struct iomap_page *iop = to_iomap_page(folio); >> - unsigned int nr_blocks = i_blocks_per_folio(inode, folio); >> + struct iomap_page *iop; >> >> - if (iop || nr_blocks <= 1) >> + iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), gfp); >> + if (!iop) >> return iop; >> >> - iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), >> - GFP_NOFS | __GFP_NOFAIL); >> spin_lock_init(&iop->uptodate_lock); >> if (folio_test_uptodate(folio)) >> bitmap_fill(iop->uptodate, nr_blocks); >> @@ -61,6 +71,18 @@ iomap_page_create(struct inode *inode, struct folio *folio) >> return iop; >> } >> >> +static struct iomap_page * >> +iomap_page_create(struct inode *inode, struct folio *folio) >> +{ >> + struct iomap_page *iop = to_iomap_page(folio); >> + unsigned int nr_blocks = i_blocks_per_folio(inode, folio); >> + >> + if (iop || nr_blocks <= 1) >> + return iop; >> + >> + return iomap_page_create_gfp(inode, folio, nr_blocks, GFP_NOFS | __GFP_NOFAIL); > > Overly long line here. > > Mor importantly why do you need a helper that does not do the number > of blocks check? Why can't we just pass a gfp_t to iomap_page_create? The next version removes iomap_page_create_gfp() and adds the gfp flag to iomap_page_create.
diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c index 8ce8720093b9..85aa32f50db0 100644 --- a/fs/iomap/buffered-io.c +++ b/fs/iomap/buffered-io.c @@ -43,17 +43,27 @@ static inline struct iomap_page *to_iomap_page(struct folio *folio) static struct bio_set iomap_ioend_bioset; +/** + * iomap_page_create_gfp : Create and initialize iomap_page for folio. + * @inode : Pointer to inode + * @folio : Pointer to folio + * @nr_blocks : Number of blocks in the folio + * @gfp : gfp allocation flags + * + * This function returns a newly allocated iomap for the folio with the settings + * specified in the gfp parameter. + * + **/ static struct iomap_page * -iomap_page_create(struct inode *inode, struct folio *folio) +iomap_page_create_gfp(struct inode *inode, struct folio *folio, + unsigned int nr_blocks, gfp_t gfp) { - struct iomap_page *iop = to_iomap_page(folio); - unsigned int nr_blocks = i_blocks_per_folio(inode, folio); + struct iomap_page *iop; - if (iop || nr_blocks <= 1) + iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), gfp); + if (!iop) return iop; - iop = kzalloc(struct_size(iop, uptodate, BITS_TO_LONGS(nr_blocks)), - GFP_NOFS | __GFP_NOFAIL); spin_lock_init(&iop->uptodate_lock); if (folio_test_uptodate(folio)) bitmap_fill(iop->uptodate, nr_blocks); @@ -61,6 +71,18 @@ iomap_page_create(struct inode *inode, struct folio *folio) return iop; } +static struct iomap_page * +iomap_page_create(struct inode *inode, struct folio *folio) +{ + struct iomap_page *iop = to_iomap_page(folio); + unsigned int nr_blocks = i_blocks_per_folio(inode, folio); + + if (iop || nr_blocks <= 1) + return iop; + + return iomap_page_create_gfp(inode, folio, nr_blocks, GFP_NOFS | __GFP_NOFAIL); +} + static void iomap_page_release(struct folio *folio) { struct iomap_page *iop = folio_detach_private(folio);
Add the function iomap_page_create_gfp() to be able to specify gfp flags and to pass in the number of blocks per folio in the function iomap_page_create_gfp(). No intended functional changes in this patch. Signed-off-by: Stefan Roesch <shr@fb.com> --- fs/iomap/buffered-io.c | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-)