summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/inode.c10
-rw-r--r--include/uapi/linux/bcache.h7
2 files changed, 15 insertions, 2 deletions
diff --git a/drivers/md/bcache/inode.c b/drivers/md/bcache/inode.c
index 72a3c1e64349..29fb04913bac 100644
--- a/drivers/md/bcache/inode.c
+++ b/drivers/md/bcache/inode.c
@@ -116,7 +116,13 @@ int bch_inode_create(struct cache_set *c, struct bkey_i *inode,
bool searched_from_start = false;
int ret;
- if ((max && *hint >= max) || *hint < min)
+ if (!max)
+ max = ULLONG_MAX;
+
+ if (c->opts.inodes_32bit)
+ max = min_t(u64, max, U32_MAX);
+
+ if (*hint >= max || *hint < min)
*hint = min;
if (*hint == min)
@@ -125,7 +131,7 @@ again:
bch_btree_iter_init_intent(&iter, c, BTREE_ID_INODES, POS(*hint, 0));
while ((k = bch_btree_iter_peek_with_holes(&iter)).k) {
- if (max && k.k->p.inode >= max)
+ if (k.k->p.inode >= max)
break;
if (k.k->type < BCH_INODE_FS) {
diff --git a/include/uapi/linux/bcache.h b/include/uapi/linux/bcache.h
index 1019f125f880..bce0838f7760 100644
--- a/include/uapi/linux/bcache.h
+++ b/include/uapi/linux/bcache.h
@@ -779,6 +779,9 @@ enum {
#define BCH_COMPRESSION_NR 3U
+/* Limit inode numbers to 32 bits: */
+LE64_BITMASK(CACHE_INODE_32BIT, struct cache_sb, flags, 56, 57);
+
/* options: */
/**
@@ -836,6 +839,10 @@ enum {
BCH_STR_HASH_NR, \
CACHE_SET_STR_HASH_TYPE, \
true) \
+ CACHE_SET_OPT(inodes_32bit, \
+ bch_bool_opt, 2, \
+ CACHE_INODE_32BIT, \
+ true) \
/* backing device specific stuff: */