diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-07-26 02:37:59 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-10-07 12:36:43 -0800 |
commit | d4925a2109e37aee759ac0ea1c96c0e6550329db (patch) | |
tree | c3318fab561846ac64b3426cc9bfa3aa19cfd5a6 | |
parent | 8c8d671c182a2195be973c5dde17b38b7268ede5 (diff) |
bcache: bch_disk_reservation_get() now takes flags argument
-rw-r--r-- | drivers/md/bcache/btree_update.c | 10 | ||||
-rw-r--r-- | drivers/md/bcache/buckets.c | 21 | ||||
-rw-r--r-- | drivers/md/bcache/buckets.h | 9 | ||||
-rw-r--r-- | drivers/md/bcache/fs-io.c | 14 | ||||
-rw-r--r-- | drivers/md/bcache/migrate.c | 2 | ||||
-rw-r--r-- | drivers/md/bcache/request.c | 2 |
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(©.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, ©.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; |