Re: [PATCH] Replace obscure constructs in fs/block_dev.c

From: Johannes Weiner
Date: Sun Jun 17 2007 - 11:42:45 EST


Hi,

please ignore the last revision of this patch. There were some places where
semantics where changed instead of just presentation. Also the bd_claim()
'fixup' was reverted, due to a misunderstanding of the code.


This patch replaces some funky codepaths in fs/block_dev.c with cleaner
versions of the affected places.

Signed-off-by: Johannes Weiner <hannes-kernel@xxxxxxxxxxxx>
diff --git a/fs/block_dev.c b/fs/block_dev.c
index ea1480a..710de2f 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -874,7 +874,7 @@ static struct bd_holder *find_bd_holder(struct block_device *bdev,
*/
static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo)
{
- int ret;
+ int err;

if (!bo)
return -EINVAL;
@@ -882,15 +882,18 @@ static int add_bd_holder(struct block_device *bdev, struct bd_holder *bo)
if (!bd_holder_grab_dirs(bdev, bo))
return -EBUSY;

- ret = add_symlink(bo->sdir, bo->sdev);
- if (ret == 0) {
- ret = add_symlink(bo->hdir, bo->hdev);
- if (ret)
- del_symlink(bo->sdir, bo->sdev);
+ err = add_symlink(bo->sdir, bo->sdev);
+ if (err)
+ return err;
+
+ err = add_symlink(bo->hdir, bo->hdev);
+ if (err) {
+ del_symlink(bo->sdir, bo->sdev);
+ return err;
}
- if (ret == 0)
- list_add_tail(&bo->list, &bdev->bd_holder_list);
- return ret;
+
+ list_add_tail(&bo->list, &bdev->bd_holder_list);
+ return err;
}

/**
@@ -948,7 +951,7 @@ static struct bd_holder *del_bd_holder(struct block_device *bdev,
static int bd_claim_by_kobject(struct block_device *bdev, void *holder,
struct kobject *kobj)
{
- int res;
+ int err;
struct bd_holder *bo, *found;

if (!kobj)
@@ -959,21 +962,24 @@ static int bd_claim_by_kobject(struct block_device *bdev, void *holder,
return -ENOMEM;

mutex_lock(&bdev->bd_mutex);
- res = bd_claim(bdev, holder);
- if (res == 0) {
- found = find_bd_holder(bdev, bo);
- if (found == NULL) {
- res = add_bd_holder(bdev, bo);
- if (res)
- bd_release(bdev);
- }
- }

- if (res || found)
+ err = bd_claim(bdev, holder);
+ if (err)
+ goto out;
+
+ found = find_bd_holder(bdev, bo);
+ if (found)
+ goto out;
+
+ err = add_bd_holder(bdev, bo);
+ if (err)
+ bd_release(bdev);
+
+out:
+ if (err || found)
free_bd_holder(bo);
mutex_unlock(&bdev->bd_mutex);
-
- return res;
+ return err;
}

/**