Browse Source

nfp: fix nfp_cpp_read()/nfp_cpp_write() error paths

When acquiring an area fails we can't call function doing both
release and free.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Jakub Kicinski 8 years ago
parent
commit
7d2da60382
1 changed files with 9 additions and 6 deletions
  1. 9 6
      drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c

+ 9 - 6
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cppcore.c

@@ -951,12 +951,14 @@ int nfp_cpp_read(struct nfp_cpp *cpp, u32 destination,
 			return -ENOMEM;
 			return -ENOMEM;
 
 
 		err = nfp_cpp_area_acquire(area);
 		err = nfp_cpp_area_acquire(area);
-		if (err)
-			goto out;
+		if (err) {
+			nfp_cpp_area_free(area);
+			return err;
+		}
 	}
 	}
 
 
 	err = nfp_cpp_area_read(area, offset, kernel_vaddr, length);
 	err = nfp_cpp_area_read(area, offset, kernel_vaddr, length);
-out:
+
 	if (cache)
 	if (cache)
 		area_cache_put(cpp, cache);
 		area_cache_put(cpp, cache);
 	else
 	else
@@ -993,13 +995,14 @@ int nfp_cpp_write(struct nfp_cpp *cpp, u32 destination,
 			return -ENOMEM;
 			return -ENOMEM;
 
 
 		err = nfp_cpp_area_acquire(area);
 		err = nfp_cpp_area_acquire(area);
-		if (err)
-			goto out;
+		if (err) {
+			nfp_cpp_area_free(area);
+			return err;
+		}
 	}
 	}
 
 
 	err = nfp_cpp_area_write(area, offset, kernel_vaddr, length);
 	err = nfp_cpp_area_write(area, offset, kernel_vaddr, length);
 
 
-out:
 	if (cache)
 	if (cache)
 		area_cache_put(cpp, cache);
 		area_cache_put(cpp, cache);
 	else
 	else