| From 590347e4000356f55eb10b03ced2686bd74dab40 Mon Sep 17 00:00:00 2001 |
| From: Arnd Bergmann <arnd@arndb.de> |
| Date: Thu, 22 Feb 2018 16:56:16 +0100 |
| Subject: dm bufio: avoid false-positive Wmaybe-uninitialized warning |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| commit 590347e4000356f55eb10b03ced2686bd74dab40 upstream. |
| |
| gcc-6.3 and earlier show a new warning after a seemingly unrelated |
| change to the arm64 PAGE_KERNEL definition: |
| |
| In file included from drivers/md/dm-bufio.c:14:0: |
| drivers/md/dm-bufio.c: In function 'alloc_buffer': |
| include/linux/sched/mm.h:182:56: warning: 'noio_flag' may be used uninitialized in this function [-Wmaybe-uninitialized] |
| current->flags = (current->flags & ~PF_MEMALLOC_NOIO) | flags; |
| ^ |
| |
| The same warning happened earlier on linux-3.18 for MIPS and I did a |
| workaround for that, but now it's come back. |
| |
| gcc-7 and newer are apparently smart enough to figure this out, and |
| other architectures don't show it, so the best I could come up with is |
| to rework the caller slightly in a way that makes it obvious enough to |
| all arm64 compilers what is happening here. |
| |
| Fixes: 41acec624087 ("arm64: kpti: Make use of nG dependent on arm64_kernel_unmapped_at_el0()") |
| Link: https://patchwork.kernel.org/patch/9692829/ |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| [snitzer: moved declarations inside conditional, altered vmalloc return] |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/dm-bufio.c | 16 ++++++---------- |
| 1 file changed, 6 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/md/dm-bufio.c |
| +++ b/drivers/md/dm-bufio.c |
| @@ -386,9 +386,6 @@ static void __cache_size_refresh(void) |
| static void *alloc_buffer_data(struct dm_bufio_client *c, gfp_t gfp_mask, |
| enum data_mode *data_mode) |
| { |
| - unsigned noio_flag; |
| - void *ptr; |
| - |
| if (c->block_size <= DM_BUFIO_BLOCK_SIZE_SLAB_LIMIT) { |
| *data_mode = DATA_MODE_SLAB; |
| return kmem_cache_alloc(DM_BUFIO_CACHE(c), gfp_mask); |
| @@ -412,16 +409,15 @@ static void *alloc_buffer_data(struct dm |
| * all allocations done by this process (including pagetables) are done |
| * as if GFP_NOIO was specified. |
| */ |
| + if (gfp_mask & __GFP_NORETRY) { |
| + unsigned noio_flag = memalloc_noio_save(); |
| + void *ptr = __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL); |
| |
| - if (gfp_mask & __GFP_NORETRY) |
| - noio_flag = memalloc_noio_save(); |
| - |
| - ptr = __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL); |
| - |
| - if (gfp_mask & __GFP_NORETRY) |
| memalloc_noio_restore(noio_flag); |
| + return ptr; |
| + } |
| |
| - return ptr; |
| + return __vmalloc(c->block_size, gfp_mask, PAGE_KERNEL); |
| } |
| |
| /* |