diff options
Diffstat (limited to 'libbcachefs/quota.c')
-rw-r--r-- | libbcachefs/quota.c | 45 |
1 files changed, 28 insertions, 17 deletions
diff --git a/libbcachefs/quota.c b/libbcachefs/quota.c index d28f1333..bb03d83a 100644 --- a/libbcachefs/quota.c +++ b/libbcachefs/quota.c @@ -4,7 +4,22 @@ #include "quota.h" #include "super-io.h" -static const char *bch2_quota_invalid(const struct bch_fs *c, struct bkey_s_c k) +static const char *bch2_sb_validate_quota(struct bch_sb *sb, + struct bch_sb_field *f) +{ + struct bch_sb_field_quota *q = field_to_type(f, quota); + + if (vstruct_bytes(&q->field) != sizeof(*q)) + return "invalid field quota: wrong size"; + + return NULL; +} + +const struct bch_sb_field_ops bch_sb_field_ops_quota = { + .validate = bch2_sb_validate_quota, +}; + +const char *bch2_quota_invalid(const struct bch_fs *c, struct bkey_s_c k) { struct bkey_s_c_quota dq; @@ -30,8 +45,8 @@ static const char * const bch2_quota_counters[] = { "inodes", }; -static void bch2_quota_to_text(struct bch_fs *c, char *buf, - size_t size, struct bkey_s_c k) +void bch2_quota_to_text(struct bch_fs *c, char *buf, + size_t size, struct bkey_s_c k) { char *out = buf, *end= buf + size; struct bkey_s_c_quota dq; @@ -50,11 +65,6 @@ static void bch2_quota_to_text(struct bch_fs *c, char *buf, } } -const struct bkey_ops bch2_bkey_quota_ops = { - .key_invalid = bch2_quota_invalid, - .val_to_text = bch2_quota_to_text, -}; - #ifdef CONFIG_BCACHEFS_QUOTA #include <linux/cred.h> @@ -399,7 +409,7 @@ static void bch2_sb_quota_read(struct bch_fs *c) struct bch_sb_field_quota *sb_quota; unsigned i, j; - sb_quota = bch2_sb_get_quota(c->disk_sb); + sb_quota = bch2_sb_get_quota(c->disk_sb.sb); if (!sb_quota) return; @@ -476,13 +486,13 @@ static int bch2_quota_enable(struct super_block *sb, unsigned uflags) mutex_lock(&c->sb_lock); if (uflags & FS_QUOTA_UDQ_ENFD) - SET_BCH_SB_USRQUOTA(c->disk_sb, true); + SET_BCH_SB_USRQUOTA(c->disk_sb.sb, true); if (uflags & FS_QUOTA_GDQ_ENFD) - SET_BCH_SB_GRPQUOTA(c->disk_sb, true); + SET_BCH_SB_GRPQUOTA(c->disk_sb.sb, true); if (uflags & FS_QUOTA_PDQ_ENFD) - SET_BCH_SB_PRJQUOTA(c->disk_sb, true); + SET_BCH_SB_PRJQUOTA(c->disk_sb.sb, true); bch2_write_super(c); mutex_unlock(&c->sb_lock); @@ -499,13 +509,13 @@ static int bch2_quota_disable(struct super_block *sb, unsigned uflags) mutex_lock(&c->sb_lock); if (uflags & FS_QUOTA_UDQ_ENFD) - SET_BCH_SB_USRQUOTA(c->disk_sb, false); + SET_BCH_SB_USRQUOTA(c->disk_sb.sb, false); if (uflags & FS_QUOTA_GDQ_ENFD) - SET_BCH_SB_GRPQUOTA(c->disk_sb, false); + SET_BCH_SB_GRPQUOTA(c->disk_sb.sb, false); if (uflags & FS_QUOTA_PDQ_ENFD) - SET_BCH_SB_PRJQUOTA(c->disk_sb, false); + SET_BCH_SB_PRJQUOTA(c->disk_sb.sb, false); bch2_write_super(c); mutex_unlock(&c->sb_lock); @@ -616,9 +626,10 @@ static int bch2_quota_set_info(struct super_block *sb, int type, q = &c->quotas[type]; mutex_lock(&c->sb_lock); - sb_quota = bch2_sb_get_quota(c->disk_sb); + sb_quota = bch2_sb_get_quota(c->disk_sb.sb); if (!sb_quota) { - sb_quota = bch2_fs_sb_resize_quota(c, sizeof(*sb_quota) / sizeof(u64)); + sb_quota = bch2_sb_resize_quota(&c->disk_sb, + sizeof(*sb_quota) / sizeof(u64)); if (!sb_quota) return -ENOSPC; } |