summaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi/kapi.c
diff options
context:
space:
mode:
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2007-12-17 13:22:55 +0100
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2007-12-26 18:15:15 +0100
commit35ad5fb76cc0a08e14068408b064103439feee36 (patch)
tree21f90c6206a0d49ded3b35defb705c4fb131eebb /drivers/mtd/ubi/kapi.c
parentUBI: fix error path (diff)
downloadlinux-35ad5fb76cc0a08e14068408b064103439feee36.tar.xz
linux-35ad5fb76cc0a08e14068408b064103439feee36.zip
UBI: fix and cleanup volume opening functions
This patch fixes error codes of the functions - if the device number is out of range, -EINVAL should be returned. It also removes unneeded try_module_get call from the open by name function. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'drivers/mtd/ubi/kapi.c')
-rw-r--r--drivers/mtd/ubi/kapi.c61
1 files changed, 25 insertions, 36 deletions
diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c
index 96f5fef5f3fa..9c283768319f 100644
--- a/drivers/mtd/ubi/kapi.c
+++ b/drivers/mtd/ubi/kapi.c
@@ -104,37 +104,32 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode)
dbg_msg("open device %d volume %d, mode %d", ubi_num, vol_id, mode);
- err = -ENODEV;
- if (ubi_num < 0)
- return ERR_PTR(err);
-
- ubi = ubi_devices[ubi_num];
+ if (ubi_num < 0 || ubi_num >= UBI_MAX_DEVICES)
+ return ERR_PTR(-EINVAL);
- if (!try_module_get(THIS_MODULE))
- return ERR_PTR(err);
+ if (mode != UBI_READONLY && mode != UBI_READWRITE &&
+ mode != UBI_EXCLUSIVE)
+ return ERR_PTR(-EINVAL);
- if (ubi_num >= UBI_MAX_DEVICES || !ubi)
- goto out_put;
+ ubi = ubi_devices[ubi_num];
+ if (!ubi)
+ return ERR_PTR(-ENODEV);
- err = -EINVAL;
if (vol_id < 0 || vol_id >= ubi->vtbl_slots)
- goto out_put;
- if (mode != UBI_READONLY && mode != UBI_READWRITE &&
- mode != UBI_EXCLUSIVE)
- goto out_put;
+ return ERR_PTR(-EINVAL);
desc = kmalloc(sizeof(struct ubi_volume_desc), GFP_KERNEL);
- if (!desc) {
- err = -ENOMEM;
- goto out_put;
- }
+ if (!desc)
+ return ERR_PTR(-ENOMEM);
+
+ err = -ENODEV;
+ if (!try_module_get(THIS_MODULE))
+ goto out_free;
spin_lock(&ubi->volumes_lock);
vol = ubi->volumes[vol_id];
- if (!vol) {
- err = -ENODEV;
+ if (!vol)
goto out_unlock;
- }
err = -EBUSY;
switch (mode) {
@@ -184,13 +179,14 @@ struct ubi_volume_desc *ubi_open_volume(int ubi_num, int vol_id, int mode)
vol->checked = 1;
}
mutex_unlock(&ubi->volumes_mutex);
+
return desc;
out_unlock:
spin_unlock(&ubi->volumes_lock);
- kfree(desc);
-out_put:
module_put(THIS_MODULE);
+out_free:
+ kfree(desc);
return ERR_PTR(err);
}
EXPORT_SYMBOL_GPL(ubi_open_volume);
@@ -207,7 +203,6 @@ struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
int mode)
{
int i, vol_id = -1, len;
- struct ubi_volume_desc *ret;
struct ubi_device *ubi;
dbg_msg("open volume %s, mode %d", name, mode);
@@ -219,14 +214,12 @@ struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
if (len > UBI_VOL_NAME_MAX)
return ERR_PTR(-EINVAL);
- ret = ERR_PTR(-ENODEV);
- if (!try_module_get(THIS_MODULE))
- return ret;
-
- if (ubi_num < 0 || ubi_num >= UBI_MAX_DEVICES || !ubi_devices[ubi_num])
- goto out_put;
+ if (ubi_num < 0 || ubi_num >= UBI_MAX_DEVICES)
+ return ERR_PTR(-EINVAL);
ubi = ubi_devices[ubi_num];
+ if (!ubi)
+ return ERR_PTR(-ENODEV);
spin_lock(&ubi->volumes_lock);
/* Walk all volumes of this UBI device */
@@ -241,13 +234,9 @@ struct ubi_volume_desc *ubi_open_volume_nm(int ubi_num, const char *name,
spin_unlock(&ubi->volumes_lock);
if (vol_id < 0)
- goto out_put;
-
- ret = ubi_open_volume(ubi_num, vol_id, mode);
+ return ERR_PTR(-ENODEV);
-out_put:
- module_put(THIS_MODULE);
- return ret;
+ return ubi_open_volume(ubi_num, vol_id, mode);
}
EXPORT_SYMBOL_GPL(ubi_open_volume_nm);