]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/quota.c
Update bcachefs sources to fd381c355c bcachefs: Fix a null ptr deref in fsck check_ex...
[bcachefs-tools-debian] / libbcachefs / quota.c
index db817273652771e73943a22629122313df9cd79b..331f22835d1859574cd073784242d557e130d7cd 100644 (file)
@@ -26,7 +26,7 @@ static int bch2_sb_quota_validate(struct bch_sb *sb, struct bch_sb_field *f,
        if (vstruct_bytes(&q->field) < sizeof(*q)) {
                prt_printf(err, "wrong size (got %zu should be %zu)",
                       vstruct_bytes(&q->field), sizeof(*q));
-               return -EINVAL;
+               return -BCH_ERR_invalid_sb_quota;
        }
 
        return 0;
@@ -59,18 +59,18 @@ const struct bch_sb_field_ops bch_sb_field_ops_quota = {
 };
 
 int bch2_quota_invalid(const struct bch_fs *c, struct bkey_s_c k,
-                      int rw, struct printbuf *err)
+                      unsigned flags, struct printbuf *err)
 {
        if (k.k->p.inode >= QTYP_NR) {
                prt_printf(err, "invalid quota type (%llu >= %u)",
                       k.k->p.inode, QTYP_NR);
-               return -EINVAL;
+               return -BCH_ERR_invalid_bkey;
        }
 
        if (bkey_val_bytes(k.k) != sizeof(struct bch_quota)) {
                prt_printf(err, "incorrect value size (%zu != %zu)",
                       bkey_val_bytes(k.k), sizeof(struct bch_quota));
-               return -EINVAL;
+               return -BCH_ERR_invalid_bkey;
        }
 
        return 0;
@@ -364,16 +364,16 @@ int bch2_quota_acct(struct bch_fs *c, struct bch_qid qid,
 
        memset(&msgs, 0, sizeof(msgs));
 
+       for_each_set_qtype(c, i, q, qtypes) {
+               mq[i] = genradix_ptr_alloc(&q->table, qid.q[i], GFP_KERNEL);
+               if (!mq[i])
+                       return -ENOMEM;
+       }
+
        for_each_set_qtype(c, i, q, qtypes)
                mutex_lock_nested(&q->lock, i);
 
        for_each_set_qtype(c, i, q, qtypes) {
-               mq[i] = genradix_ptr_alloc(&q->table, qid.q[i], GFP_NOFS);
-               if (!mq[i]) {
-                       ret = -ENOMEM;
-                       goto err;
-               }
-
                ret = bch2_quota_check_limit(c, i, mq[i], &msgs, counter, v, mode);
                if (ret)
                        goto err;
@@ -416,18 +416,17 @@ int bch2_quota_transfer(struct bch_fs *c, unsigned qtypes,
 
        memset(&msgs, 0, sizeof(msgs));
 
+       for_each_set_qtype(c, i, q, qtypes) {
+               src_q[i] = genradix_ptr_alloc(&q->table, src.q[i], GFP_KERNEL);
+               dst_q[i] = genradix_ptr_alloc(&q->table, dst.q[i], GFP_KERNEL);
+               if (!src_q[i] || !dst_q[i])
+                       return -ENOMEM;
+       }
+
        for_each_set_qtype(c, i, q, qtypes)
                mutex_lock_nested(&q->lock, i);
 
        for_each_set_qtype(c, i, q, qtypes) {
-               src_q[i] = genradix_ptr_alloc(&q->table, src.q[i], GFP_NOFS);
-               dst_q[i] = genradix_ptr_alloc(&q->table, dst.q[i], GFP_NOFS);
-
-               if (!src_q[i] || !dst_q[i]) {
-                       ret = -ENOMEM;
-                       goto err;
-               }
-
                ret = bch2_quota_check_limit(c, i, dst_q[i], &msgs, Q_SPC,
                                             dst_q[i]->c[Q_SPC].v + space,
                                             mode);
@@ -710,7 +709,7 @@ static int bch2_quota_remove(struct super_block *sb, unsigned uflags)
 
                ret = bch2_btree_delete_range(c, BTREE_ID_quotas,
                                              POS(QTYP_USR, 0),
-                                             POS(QTYP_USR + 1, 0),
+                                             POS(QTYP_USR, U64_MAX),
                                              0, NULL);
                if (ret)
                        return ret;
@@ -722,7 +721,7 @@ static int bch2_quota_remove(struct super_block *sb, unsigned uflags)
 
                ret = bch2_btree_delete_range(c, BTREE_ID_quotas,
                                              POS(QTYP_GRP, 0),
-                                             POS(QTYP_GRP + 1, 0),
+                                             POS(QTYP_GRP, U64_MAX),
                                              0, NULL);
                if (ret)
                        return ret;
@@ -734,7 +733,7 @@ static int bch2_quota_remove(struct super_block *sb, unsigned uflags)
 
                ret = bch2_btree_delete_range(c, BTREE_ID_quotas,
                                              POS(QTYP_PRJ, 0),
-                                             POS(QTYP_PRJ + 1, 0),
+                                             POS(QTYP_PRJ, U64_MAX),
                                              0, NULL);
                if (ret)
                        return ret;