Message ID | 20191112190223.225956-1-martin@geanix.com |
---|---|
State | Rejected |
Delegated to: | Wolfgang Denk |
Headers | show |
Series | [U-Boot] tools: env: handle corrupted ubi volumes during sanity check | expand |
Dear Martin, In message <20191112190223.225956-1-martin@geanix.com> you wrote: > A partially written ubi volume is marked as such by the kernel. Such a > mark causes the initial ubi sanity check to fail instead of falling back > to the redundant environment. > > Fix this by special casing the EBADF return code from the UBI_IOCEBISMAP > ioctl, as this is only ever returned in case of a partially written > volume. The CRC checking will decide which environment to use anyways. I dislike this approach, sorry. > Signed-off-by: Martin Hundebøll <martin@geanix.com> > --- > tools/env/fw_env.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c > index cfada0ee11..f7904ae036 100644 > --- a/tools/env/fw_env.c > +++ b/tools/env/fw_env.c > @@ -1608,7 +1608,13 @@ static int check_device_config(int dev) > > if (IS_UBI(dev)) { > rc = ioctl(fd, UBI_IOCEBISMAP, &lnum); > - if (rc < 0) { > + if (rc < 0 && errno == EBADF) { > + /* EBADF here means we are dealing with a partially > + * written UBI volume, Leave it for now to allow the > + * use of the redundant env. CRC checking will decide > + * which to use */ > + rc = 0; No, we have an error here, so we should report that error to the user at least. Saying "oh, this error is not an error" is wrong. Think especially of the case when there is no redundant environment at all! If you want to drop through to trying to read the other copy of the enviropnment (if there is one !!!) this needs to be implemented differently. Naked-by: Wolfgang Denk <wd@denx.de> Best regards, Wolfgang Denk
diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c index cfada0ee11..f7904ae036 100644 --- a/tools/env/fw_env.c +++ b/tools/env/fw_env.c @@ -1608,7 +1608,13 @@ static int check_device_config(int dev) if (IS_UBI(dev)) { rc = ioctl(fd, UBI_IOCEBISMAP, &lnum); - if (rc < 0) { + if (rc < 0 && errno == EBADF) { + /* EBADF here means we are dealing with a partially + * written UBI volume, Leave it for now to allow the + * use of the redundant env. CRC checking will decide + * which to use */ + rc = 0; + } else if (rc < 0) { fprintf(stderr, "Cannot get UBI information for %s\n", DEVNAME(dev)); goto err;
A partially written ubi volume is marked as such by the kernel. Such a mark causes the initial ubi sanity check to fail instead of falling back to the redundant environment. Fix this by special casing the EBADF return code from the UBI_IOCEBISMAP ioctl, as this is only ever returned in case of a partially written volume. The CRC checking will decide which environment to use anyways. Signed-off-by: Martin Hundebøll <martin@geanix.com> --- tools/env/fw_env.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)