summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-07-26 02:37:59 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 12:36:43 -0800
commitd4925a2109e37aee759ac0ea1c96c0e6550329db (patch)
treec3318fab561846ac64b3426cc9bfa3aa19cfd5a6
parent8c8d671c182a2195be973c5dde17b38b7268ede5 (diff)
bcache: bch_disk_reservation_get() now takes flags argument
-rw-r--r--drivers/md/bcache/btree_update.c10
-rw-r--r--drivers/md/bcache/buckets.c21
-rw-r--r--drivers/md/bcache/buckets.h9
-rw-r--r--drivers/md/bcache/fs-io.c14
-rw-r--r--drivers/md/bcache/migrate.c2
-rw-r--r--drivers/md/bcache/request.c2
6 files changed, 27 insertions, 31 deletions
diff --git a/drivers/md/bcache/btree_update.c b/drivers/md/bcache/btree_update.c
index 8fcfc44ebeea..ac6e8c0395e2 100644
--- a/drivers/md/bcache/btree_update.c
+++ b/drivers/md/bcache/btree_update.c
@@ -523,11 +523,13 @@ static struct btree_reserve *__bch_btree_reserve_get(struct cache_set *c,
struct btree_reserve *reserve;
struct btree *b;
struct disk_reservation disk_res = { 0, 0 };
- unsigned sectors = nr_nodes * c->sb.btree_node_size;
- int ret;
+ unsigned sectors = nr_nodes * c->sb.btree_node_size;
+ int ret, flags = BCH_DISK_RESERVATION_GC_LOCK_HELD;
+
+ if (!check_enospc)
+ flags |= BCH_DISK_RESERVATION_NOFAIL;
- if (__bch_disk_reservation_get(c, &disk_res, sectors,
- check_enospc, true))
+ if (bch_disk_reservation_get(c, &disk_res, sectors, flags))
return ERR_PTR(-ENOSPC);
BUG_ON(nr_nodes > BTREE_RESERVE_MAX);
diff --git a/drivers/md/bcache/buckets.c b/drivers/md/bcache/buckets.c
index 61abd50ffd63..13cccbcd42d4 100644
--- a/drivers/md/bcache/buckets.c
+++ b/drivers/md/bcache/buckets.c
@@ -541,10 +541,9 @@ void bch_disk_reservation_put(struct cache_set *c,
#define SECTORS_CACHE 1024
-int __bch_disk_reservation_get(struct cache_set *c,
- struct disk_reservation *res,
- unsigned sectors,
- bool check_enospc, bool gc_lock_held)
+int bch_disk_reservation_get(struct cache_set *c,
+ struct disk_reservation *res,
+ unsigned sectors, int flags)
{
struct bucket_stats_cache_set *stats;
u64 old, new, v;
@@ -584,13 +583,14 @@ recalculate:
* GC recalculates sectors_available when it starts, so that hopefully
* we don't normally end up blocking here:
*/
- if (!gc_lock_held)
+ if (!(flags & BCH_DISK_RESERVATION_GC_LOCK_HELD))
down_read(&c->gc_lock);
lg_global_lock(&c->bucket_stats_lock);
sectors_available = __recalc_sectors_available(c);
- if (!check_enospc || sectors <= sectors_available) {
+ if (sectors <= sectors_available ||
+ (flags & BCH_DISK_RESERVATION_NOFAIL)) {
atomic64_set(&c->sectors_available,
max_t(s64, 0, sectors_available - sectors));
stats->sectors_online_reserved += sectors;
@@ -602,15 +602,8 @@ recalculate:
}
lg_global_unlock(&c->bucket_stats_lock);
- if (!gc_lock_held)
+ if (!(flags & BCH_DISK_RESERVATION_GC_LOCK_HELD))
up_read(&c->gc_lock);
return ret;
}
-
-int bch_disk_reservation_get(struct cache_set *c,
- struct disk_reservation *res,
- unsigned sectors)
-{
- return __bch_disk_reservation_get(c, res, sectors, true, false);
-}
diff --git a/drivers/md/bcache/buckets.h b/drivers/md/bcache/buckets.h
index 5f79394e482b..03e9c1e14b4d 100644
--- a/drivers/md/bcache/buckets.h
+++ b/drivers/md/bcache/buckets.h
@@ -249,11 +249,12 @@ void bch_recalc_sectors_available(struct cache_set *);
void bch_disk_reservation_put(struct cache_set *,
struct disk_reservation *);
-int __bch_disk_reservation_get(struct cache_set *,
- struct disk_reservation *,
- unsigned, bool, bool);
+
+#define BCH_DISK_RESERVATION_NOFAIL (1 << 0)
+#define BCH_DISK_RESERVATION_GC_LOCK_HELD (1 << 1)
+
int bch_disk_reservation_get(struct cache_set *,
struct disk_reservation *,
- unsigned);
+ unsigned, int);
#endif /* _BUCKETS_H */
diff --git a/drivers/md/bcache/fs-io.c b/drivers/md/bcache/fs-io.c
index a71a4cdd45d3..c1477379e4f6 100644
--- a/drivers/md/bcache/fs-io.c
+++ b/drivers/md/bcache/fs-io.c
@@ -448,8 +448,8 @@ static int bch_get_page_reservation(struct cache_set *c, struct page *page,
s->alloc_state == BCH_PAGE_ALLOCATED)
return 0;
- ret = __bch_disk_reservation_get(c, &res, PAGE_SECTORS,
- check_enospc, false);
+ ret = bch_disk_reservation_get(c, &res, PAGE_SECTORS, !check_enospc
+ ? BCH_DISK_RESERVATION_NOFAIL : 0);
if (ret)
return ret;
@@ -1401,7 +1401,7 @@ static int bch_direct_IO_write(struct cache_set *c, struct kiocb *req,
* Have to then guard against racing with truncate (deleting data that
* we would have been overwriting)
*/
- ret = bch_disk_reservation_get(c, &dio->res, iter->count >> 9);
+ ret = bch_disk_reservation_get(c, &dio->res, iter->count >> 9, 0);
if (unlikely(ret)) {
closure_debug_destroy(&dio->cl);
bio_put(bio);
@@ -1936,9 +1936,8 @@ static long bch_fcollapse(struct inode *inode, loff_t offset, loff_t len)
BUG_ON(bkey_cmp(dst.pos, bkey_start_pos(&copy.k.k)));
- ret = __bch_disk_reservation_get(c, &disk_res,
- copy.k.k.size,
- false, false);
+ ret = bch_disk_reservation_get(c, &disk_res, copy.k.k.size,
+ BCH_DISK_RESERVATION_NOFAIL);
BUG_ON(ret);
ret = bch_btree_insert_at(&dst, &copy.k, &disk_res,
@@ -2083,7 +2082,8 @@ static long bch_fallocate(struct inode *inode, int mode,
if (!bkey_extent_is_allocation(k.k) ||
bkey_extent_is_compressed(c, k)) {
- ret = bch_disk_reservation_get(c, &disk_res, sectors);
+ ret = bch_disk_reservation_get(c, &disk_res,
+ sectors, 0);
if (ret)
goto err_put_sectors_dirty;
}
diff --git a/drivers/md/bcache/migrate.c b/drivers/md/bcache/migrate.c
index 91dc277cca3d..236e0e469b4f 100644
--- a/drivers/md/bcache/migrate.c
+++ b/drivers/md/bcache/migrate.c
@@ -41,7 +41,7 @@ static int issue_migration_move(struct cache *ca,
struct moving_io *io;
struct disk_reservation res;
- if (bch_disk_reservation_get(c, &res, k.k->size))
+ if (bch_disk_reservation_get(c, &res, k.k->size, 0))
return -ENOSPC;
io = moving_io_alloc(k);
diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c
index 97a2ba16fb1f..dc3fa5477d6c 100644
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@ -688,7 +688,7 @@ static void __blockdev_volume_make_request(struct request_queue *q,
unsigned flags = 0;
if (bio_op(bio) != REQ_OP_DISCARD &&
- bch_disk_reservation_get(d->c, &res, bio_sectors(bio))) {
+ bch_disk_reservation_get(d->c, &res, bio_sectors(bio), 0)) {
s->iop.error = -ENOSPC;
continue_at(&s->cl, search_free, NULL);
return;