summaryrefslogtreecommitdiff
path: root/libbcachefs/nocow_locking.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/nocow_locking.c')
-rw-r--r--libbcachefs/nocow_locking.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/libbcachefs/nocow_locking.c b/libbcachefs/nocow_locking.c
index 962218fa..58cfd540 100644
--- a/libbcachefs/nocow_locking.c
+++ b/libbcachefs/nocow_locking.c
@@ -47,7 +47,7 @@ bool __bch2_bucket_nocow_trylock(struct nocow_lock_bucket *l,
int v, lock_val = flags ? 1 : -1;
unsigned i;
- spin_lock(&l->lock);
+ guard(spinlock)(&l->lock);
for (i = 0; i < ARRAY_SIZE(l->b); i++)
if (l->b[i] == dev_bucket)
@@ -58,21 +58,19 @@ bool __bch2_bucket_nocow_trylock(struct nocow_lock_bucket *l,
l->b[i] = dev_bucket;
goto take_lock;
}
-fail:
- spin_unlock(&l->lock);
+
return false;
got_entry:
v = atomic_read(&l->l[i]);
if (lock_val > 0 ? v < 0 : v > 0)
- goto fail;
+ return false;
take_lock:
v = atomic_read(&l->l[i]);
/* Overflow? */
if (v && sign(v + lock_val) != sign(v))
- goto fail;
+ return false;
atomic_add(lock_val, &l->l[i]);
- spin_unlock(&l->lock);
return true;
}