aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nvmem
diff options
context:
space:
mode:
authorArnd Bergmann <arnd@arndb.de>2016-05-27 17:23:25 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-27 18:26:11 -0400
commit287980e49ffc0f6d911601e7e352a812ed27768e (patch)
treea906f835eb5be85dca4fd0c9c6f21b8f60920424 /drivers/nvmem
parent7ded384a12688c2a86b618da16bc87713404dfcc (diff)
remove lots of IS_ERR_VALUE abuses
Most users of IS_ERR_VALUE() in the kernel are wrong, as they pass an 'int' into a function that takes an 'unsigned long' argument. This happens to work because the type is sign-extended on 64-bit architectures before it gets converted into an unsigned type. However, anything that passes an 'unsigned short' or 'unsigned int' argument into IS_ERR_VALUE() is guaranteed to be broken, as are 8-bit integers and types that are wider than 'unsigned long'. Andrzej Hajda has already fixed a lot of the worst abusers that were causing actual bugs, but it would be nice to prevent any users that are not passing 'unsigned long' arguments. This patch changes all users of IS_ERR_VALUE() that I could find on 32-bit ARM randconfig builds and x86 allmodconfig. For the moment, this doesn't change the definition of IS_ERR_VALUE() because there are probably still architecture specific users elsewhere. Almost all the warnings I got are for files that are better off using 'if (err)' or 'if (err < 0)'. The only legitimate user I could find that we get a warning for is the (32-bit only) freescale fman driver, so I did not remove the IS_ERR_VALUE() there but changed the type to 'unsigned long'. For 9pfs, I just worked around one user whose calling conventions are so obscure that I did not dare change the behavior. I was using this definition for testing: #define IS_ERR_VALUE(x) ((unsigned long*)NULL == (typeof (x)*)NULL && \ unlikely((unsigned long long)(x) >= (unsigned long long)(typeof(x))-MAX_ERRNO)) which ends up making all 16-bit or wider types work correctly with the most plausible interpretation of what IS_ERR_VALUE() was supposed to return according to its users, but also causes a compile-time warning for any users that do not pass an 'unsigned long' argument. I suggested this approach earlier this year, but back then we ended up deciding to just fix the users that are obviously broken. After the initial warning that caused me to get involved in the discussion (fs/gfs2/dir.c) showed up again in the mainline kernel, Linus asked me to send the whole thing again. [ Updated the 9p parts as per Al Viro - Linus ] Signed-off-by: Arnd Bergmann <arnd@arndb.de> Cc: Andrzej Hajda <a.hajda@samsung.com> Cc: Andrew Morton <akpm@linux-foundation.org> Link: https://lkml.org/lkml/2016/1/7/363 Link: https://lkml.org/lkml/2016/5/27/486 Acked-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> # For nvmem part Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/nvmem')
-rw-r--r--drivers/nvmem/core.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index bb4ea123547f..965911d9b36a 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -113,7 +113,7 @@ static ssize_t bin_attr_nvmem_read(struct file *filp, struct kobject *kobj,
113 113
114 rc = nvmem_reg_read(nvmem, pos, buf, count); 114 rc = nvmem_reg_read(nvmem, pos, buf, count);
115 115
116 if (IS_ERR_VALUE(rc)) 116 if (rc)
117 return rc; 117 return rc;
118 118
119 return count; 119 return count;
@@ -147,7 +147,7 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,
147 147
148 rc = nvmem_reg_write(nvmem, pos, buf, count); 148 rc = nvmem_reg_write(nvmem, pos, buf, count);
149 149
150 if (IS_ERR_VALUE(rc)) 150 if (rc)
151 return rc; 151 return rc;
152 152
153 return count; 153 return count;
@@ -366,7 +366,7 @@ static int nvmem_add_cells(struct nvmem_device *nvmem,
366 } 366 }
367 367
368 rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]); 368 rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]);
369 if (IS_ERR_VALUE(rval)) { 369 if (rval) {
370 kfree(cells[i]); 370 kfree(cells[i]);
371 goto err; 371 goto err;
372 } 372 }
@@ -963,7 +963,7 @@ static int __nvmem_cell_read(struct nvmem_device *nvmem,
963 963
964 rc = nvmem_reg_read(nvmem, cell->offset, buf, cell->bytes); 964 rc = nvmem_reg_read(nvmem, cell->offset, buf, cell->bytes);
965 965
966 if (IS_ERR_VALUE(rc)) 966 if (rc)
967 return rc; 967 return rc;
968 968
969 /* shift bits in-place */ 969 /* shift bits in-place */
@@ -998,7 +998,7 @@ void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len)
998 return ERR_PTR(-ENOMEM); 998 return ERR_PTR(-ENOMEM);
999 999
1000 rc = __nvmem_cell_read(nvmem, cell, buf, len); 1000 rc = __nvmem_cell_read(nvmem, cell, buf, len);
1001 if (IS_ERR_VALUE(rc)) { 1001 if (rc) {
1002 kfree(buf); 1002 kfree(buf);
1003 return ERR_PTR(rc); 1003 return ERR_PTR(rc);
1004 } 1004 }
@@ -1083,7 +1083,7 @@ int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len)
1083 if (cell->bit_offset || cell->nbits) 1083 if (cell->bit_offset || cell->nbits)
1084 kfree(buf); 1084 kfree(buf);
1085 1085
1086 if (IS_ERR_VALUE(rc)) 1086 if (rc)
1087 return rc; 1087 return rc;
1088 1088
1089 return len; 1089 return len;
@@ -1111,11 +1111,11 @@ ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,
1111 return -EINVAL; 1111 return -EINVAL;
1112 1112
1113 rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell); 1113 rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell);
1114 if (IS_ERR_VALUE(rc)) 1114 if (rc)
1115 return rc; 1115 return rc;
1116 1116
1117 rc = __nvmem_cell_read(nvmem, &cell, buf, &len); 1117 rc = __nvmem_cell_read(nvmem, &cell, buf, &len);
1118 if (IS_ERR_VALUE(rc)) 1118 if (rc)
1119 return rc; 1119 return rc;
1120 1120
1121 return len; 1121 return len;
@@ -1141,7 +1141,7 @@ int nvmem_device_cell_write(struct nvmem_device *nvmem,
1141 return -EINVAL; 1141 return -EINVAL;
1142 1142
1143 rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell); 1143 rc = nvmem_cell_info_to_nvmem_cell(nvmem, info, &cell);
1144 if (IS_ERR_VALUE(rc)) 1144 if (rc)
1145 return rc; 1145 return rc;
1146 1146
1147 return nvmem_cell_write(&cell, buf, cell.bytes); 1147 return nvmem_cell_write(&cell, buf, cell.bytes);
@@ -1170,7 +1170,7 @@ int nvmem_device_read(struct nvmem_device *nvmem,
1170 1170
1171 rc = nvmem_reg_read(nvmem, offset, buf, bytes); 1171 rc = nvmem_reg_read(nvmem, offset, buf, bytes);
1172 1172
1173 if (IS_ERR_VALUE(rc)) 1173 if (rc)
1174 return rc; 1174 return rc;
1175 1175
1176 return bytes; 1176 return bytes;
@@ -1198,7 +1198,7 @@ int nvmem_device_write(struct nvmem_device *nvmem,
1198 1198
1199 rc = nvmem_reg_write(nvmem, offset, buf, bytes); 1199 rc = nvmem_reg_write(nvmem, offset, buf, bytes);
1200 1200
1201 if (IS_ERR_VALUE(rc)) 1201 if (rc)
1202 return rc; 1202 return rc;
1203 1203
1204 1204