/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _BCACHEFS_QUOTA_H #define _BCACHEFS_QUOTA_H #include "inode.h" #include "quota_types.h" enum bkey_invalid_flags; extern const struct bch_sb_field_ops bch_sb_field_ops_quota; int bch2_quota_invalid(struct bch_fs *, struct bkey_s_c, enum bkey_invalid_flags, struct printbuf *); void bch2_quota_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c); #define bch2_bkey_ops_quota ((struct bkey_ops) { \ .key_invalid = bch2_quota_invalid, \ .val_to_text = bch2_quota_to_text, \ .min_val_size = 32, \ }) static inline struct bch_qid bch_qid(struct bch_inode_unpacked *u) { return (struct bch_qid) { .q[QTYP_USR] = u->bi_uid, .q[QTYP_GRP] = u->bi_gid, .q[QTYP_PRJ] = u->bi_project ? u->bi_project - 1 : 0, }; } static inline unsigned enabled_qtypes(struct bch_fs *c) { return ((c->opts.usrquota << QTYP_USR)| (c->opts.grpquota << QTYP_GRP)| (c->opts.prjquota << QTYP_PRJ)); } #ifdef CONFIG_BCACHEFS_QUOTA int bch2_quota_acct(struct bch_fs *, struct bch_qid, enum quota_counters, s64, enum quota_acct_mode); int bch2_quota_transfer(struct bch_fs *, unsigned, struct bch_qid, struct bch_qid, u64, enum quota_acct_mode); void bch2_fs_quota_exit(struct bch_fs *); void bch2_fs_quota_init(struct bch_fs *); int bch2_fs_quota_read(struct bch_fs *); extern const struct quotactl_ops bch2_quotactl_operations; #else static inline int bch2_quota_acct(struct bch_fs *c, struct bch_qid qid, enum quota_counters counter, s64 v, enum quota_acct_mode mode) { return 0; } static inline int bch2_quota_transfer(struct bch_fs *c, unsigned qtypes, struct bch_qid dst, struct bch_qid src, u64 space, enum quota_acct_mode mode) { return 0; } static inline void bch2_fs_quota_exit(struct bch_fs *c) {} static inline void bch2_fs_quota_init(struct bch_fs *c) {} static inline int bch2_fs_quota_read(struct bch_fs *c) { return 0; } #endif #endif /* _BCACHEFS_QUOTA_H */