On Thu 05-04-18 11:17:20, Kyle Spiers wrote: > As part of the effort to remove VLAs from the kernel[1], this changes > the allocation of the bhs and pages arrays from being on the stack to being > kcalloc()ed. This also allows for the removal of the explicit zeroing > of bhs. > > https://lkml.org/lkml/2018/3/7/621 > > Signed-off-by: Kyle Spiers <ksspi...@google.com>
This is a good cleanup but the error recovery is hosed. See below... > --- > fs/isofs/compress.c | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c > index 9bb2fe35799d..4eba16bf173c 100644 > --- a/fs/isofs/compress.c > +++ b/fs/isofs/compress.c > @@ -20,6 +20,7 @@ > #include <linux/init.h> > #include <linux/bio.h> > > +#include <linux/slab.h> > #include <linux/vmalloc.h> > #include <linux/zlib.h> > > @@ -59,7 +60,7 @@ static loff_t zisofs_uncompress_block(struct inode *inode, > loff_t block_start, > >> bufshift; > int haveblocks; > blkcnt_t blocknum; > - struct buffer_head *bhs[needblocks + 1]; > + struct buffer_head **bhs; > int curbh, curpage; > > if (block_size > deflateBound(1UL << zisofs_block_shift)) { > @@ -80,7 +81,9 @@ static loff_t zisofs_uncompress_block(struct inode *inode, > loff_t block_start, > > /* Because zlib is not thread-safe, do all the I/O at the top. */ > blocknum = block_start >> bufshift; > - memset(bhs, 0, (needblocks + 1) * sizeof(struct buffer_head *)); > + bhs = kcalloc(needblocks + 1, sizeof(*bhs), GFP_KERNEL); > + if (!bhs) > + return -ENOMEM; As Joe pointed out this needs to be: if (!bhs) { *errp = -ENOMEM; return 0; } > @@ -330,6 +334,10 @@ static int zisofs_readpage(struct file *file, struct > page *page) > full_page = 0; > pcount = 1; > } > + pages = kcalloc(max_t(unsigned int, zisofs_pages_per_cblock, 1), > + sizeof(*pages), GFP_KERNEL); > + if (!pages) > + return -ENOMEM; And this is wrong as well. You need to do: if (!pages) { unlock_page(page); return -ENOMEM; } Honza -- Jan Kara <j...@suse.com> SUSE Labs, CR