diff options
Diffstat (limited to 'drivers/mtd/ubi/eba.c')
-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 | /** |