diff options
| -rw-r--r-- | drivers/mtd/ubi/eba.c | 27 |
1 files changed, 7 insertions, 20 deletions
diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c index 623d25f4855f..8dc488fc0cdf 100644 --- a/drivers/mtd/ubi/eba.c +++ b/drivers/mtd/ubi/eba.c | |||
| @@ -223,22 +223,18 @@ static int leb_read_lock(struct ubi_device *ubi, int vol_id, int lnum) | |||
| 223 | */ | 223 | */ |
| 224 | static void leb_read_unlock(struct ubi_device *ubi, int vol_id, int lnum) | 224 | static void leb_read_unlock(struct ubi_device *ubi, int vol_id, int lnum) |
| 225 | { | 225 | { |
| 226 | int free = 0; | ||
| 227 | struct ubi_ltree_entry *le; | 226 | struct ubi_ltree_entry *le; |
| 228 | 227 | ||
| 229 | spin_lock(&ubi->ltree_lock); | 228 | spin_lock(&ubi->ltree_lock); |
| 230 | le = ltree_lookup(ubi, vol_id, lnum); | 229 | le = ltree_lookup(ubi, vol_id, lnum); |
| 231 | le->users -= 1; | 230 | le->users -= 1; |
| 232 | ubi_assert(le->users >= 0); | 231 | ubi_assert(le->users >= 0); |
| 232 | up_read(&le->mutex); | ||
| 233 | if (le->users == 0) { | 233 | if (le->users == 0) { |
| 234 | rb_erase(&le->rb, &ubi->ltree); | 234 | rb_erase(&le->rb, &ubi->ltree); |
| 235 | free = 1; | 235 | kfree(le); |
| 236 | } | 236 | } |
| 237 | spin_unlock(&ubi->ltree_lock); | 237 | spin_unlock(&ubi->ltree_lock); |
| 238 | |||
| 239 | up_read(&le->mutex); | ||
| 240 | if (free) | ||
| 241 | kfree(le); | ||
| 242 | } | 238 | } |
| 243 | 239 | ||
| 244 | /** | 240 | /** |
| @@ -274,7 +270,6 @@ static int leb_write_lock(struct ubi_device *ubi, int vol_id, int lnum) | |||
| 274 | */ | 270 | */ |
| 275 | static int leb_write_trylock(struct ubi_device *ubi, int vol_id, int lnum) | 271 | static int leb_write_trylock(struct ubi_device *ubi, int vol_id, int lnum) |
| 276 | { | 272 | { |
| 277 | int free; | ||
| 278 | struct ubi_ltree_entry *le; | 273 | struct ubi_ltree_entry *le; |
| 279 | 274 | ||
| 280 | le = ltree_add_entry(ubi, vol_id, lnum); | 275 | le = ltree_add_entry(ubi, vol_id, lnum); |
| @@ -289,12 +284,9 @@ static int leb_write_trylock(struct ubi_device *ubi, int vol_id, int lnum) | |||
| 289 | ubi_assert(le->users >= 0); | 284 | ubi_assert(le->users >= 0); |
| 290 | if (le->users == 0) { | 285 | if (le->users == 0) { |
| 291 | rb_erase(&le->rb, &ubi->ltree); | 286 | rb_erase(&le->rb, &ubi->ltree); |
| 292 | free = 1; | ||
| 293 | } else | ||
| 294 | free = 0; | ||
| 295 | spin_unlock(&ubi->ltree_lock); | ||
| 296 | if (free) | ||
| 297 | kfree(le); | 287 | kfree(le); |
| 288 | } | ||
| 289 | spin_unlock(&ubi->ltree_lock); | ||
| 298 | 290 | ||
| 299 | return 1; | 291 | return 1; |
| 300 | } | 292 | } |
| @@ -307,23 +299,18 @@ static int leb_write_trylock(struct ubi_device *ubi, int vol_id, int lnum) | |||
| 307 | */ | 299 | */ |
| 308 | static void leb_write_unlock(struct ubi_device *ubi, int vol_id, int lnum) | 300 | static void leb_write_unlock(struct ubi_device *ubi, int vol_id, int lnum) |
| 309 | { | 301 | { |
| 310 | int free; | ||
| 311 | struct ubi_ltree_entry *le; | 302 | struct ubi_ltree_entry *le; |
| 312 | 303 | ||
| 313 | spin_lock(&ubi->ltree_lock); | 304 | spin_lock(&ubi->ltree_lock); |
| 314 | le = ltree_lookup(ubi, vol_id, lnum); | 305 | le = ltree_lookup(ubi, vol_id, lnum); |
| 315 | le->users -= 1; | 306 | le->users -= 1; |
| 316 | ubi_assert(le->users >= 0); | 307 | ubi_assert(le->users >= 0); |
| 308 | up_write(&le->mutex); | ||
| 317 | if (le->users == 0) { | 309 | if (le->users == 0) { |
| 318 | rb_erase(&le->rb, &ubi->ltree); | 310 | rb_erase(&le->rb, &ubi->ltree); |
| 319 | free = 1; | ||
| 320 | } else | ||
| 321 | free = 0; | ||
| 322 | spin_unlock(&ubi->ltree_lock); | ||
| 323 | |||
| 324 | up_write(&le->mutex); | ||
| 325 | if (free) | ||
| 326 | kfree(le); | 311 | kfree(le); |
| 312 | } | ||
| 313 | spin_unlock(&ubi->ltree_lock); | ||
| 327 | } | 314 | } |
| 328 | 315 | ||
| 329 | /** | 316 | /** |
