Commit d834c165 authored by Linus Torvalds's avatar Linus Torvalds

pccard_store_cis: fix wrong error handling

The test for the error from pcmcia_replace_cis() was incorrect, and
would always trigger (because if an error didn't happen, the "ret" value
would not be zero, it would be the passed-in count).

Reported and debugged by Fabrice Bellet <fabrice@bellet.info>

Rather than just fix the single broken test, make the code in question
use an understandable code-sequence instead, fixing the whole function
to be more readable.
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 4e9011d5
...@@ -298,7 +298,7 @@ static ssize_t pccard_store_cis(struct kobject *kobj, char *buf, loff_t off, siz ...@@ -298,7 +298,7 @@ static ssize_t pccard_store_cis(struct kobject *kobj, char *buf, loff_t off, siz
{ {
struct pcmcia_socket *s = to_socket(container_of(kobj, struct class_device, kobj)); struct pcmcia_socket *s = to_socket(container_of(kobj, struct class_device, kobj));
cisdump_t *cis; cisdump_t *cis;
ssize_t ret = count; int error;
if (off) if (off)
return -EINVAL; return -EINVAL;
...@@ -316,25 +316,22 @@ static ssize_t pccard_store_cis(struct kobject *kobj, char *buf, loff_t off, siz ...@@ -316,25 +316,22 @@ static ssize_t pccard_store_cis(struct kobject *kobj, char *buf, loff_t off, siz
cis->Length = count + 1; cis->Length = count + 1;
memcpy(cis->Data, buf, count); memcpy(cis->Data, buf, count);
if (pcmcia_replace_cis(s, cis)) error = pcmcia_replace_cis(s, cis);
ret = -EIO;
kfree(cis); kfree(cis);
if (error)
return -EIO;
if (!ret) { mutex_lock(&s->skt_mutex);
mutex_lock(&s->skt_mutex); if ((s->callback) && (s->state & SOCKET_PRESENT) &&
if ((s->callback) && (s->state & SOCKET_PRESENT) && !(s->state & SOCKET_CARDBUS)) {
!(s->state & SOCKET_CARDBUS)) { if (try_module_get(s->callback->owner)) {
if (try_module_get(s->callback->owner)) { s->callback->requery(s);
s->callback->requery(s); module_put(s->callback->owner);
module_put(s->callback->owner);
}
} }
mutex_unlock(&s->skt_mutex);
} }
mutex_unlock(&s->skt_mutex);
return count;
return (ret);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment