Commit 2fab25cd authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: more project quota fixes

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 69d46f90
...@@ -104,19 +104,6 @@ static int bch2_ioc_fsgetxattr(struct bch_inode_info *inode, ...@@ -104,19 +104,6 @@ static int bch2_ioc_fsgetxattr(struct bch_inode_info *inode,
return copy_to_user(arg, &fa, sizeof(fa)); return copy_to_user(arg, &fa, sizeof(fa));
} }
static int bch2_set_projid(struct bch_fs *c,
struct bch_inode_info *inode,
u32 projid)
{
struct bch_qid qid = inode->ei_qid;
qid.q[QTYP_PRJ] = projid;
return bch2_fs_quota_transfer(c, inode, qid,
1 << QTYP_PRJ,
KEY_TYPE_QUOTA_PREALLOC);
}
static int fssetxattr_inode_update_fn(struct bch_inode_info *inode, static int fssetxattr_inode_update_fn(struct bch_inode_info *inode,
struct bch_inode_unpacked *bi, struct bch_inode_unpacked *bi,
void *p) void *p)
...@@ -124,11 +111,7 @@ static int fssetxattr_inode_update_fn(struct bch_inode_info *inode, ...@@ -124,11 +111,7 @@ static int fssetxattr_inode_update_fn(struct bch_inode_info *inode,
struct flags_set *s = p; struct flags_set *s = p;
if (s->projid != bi->bi_project) { if (s->projid != bi->bi_project) {
if (s->projid) bi->bi_fields_set |= 1U << Inode_opt_project;
bi->bi_fields_set |= 1U << Inode_opt_project;
else
bi->bi_fields_set &= ~(1U << Inode_opt_project);
bi->bi_project = s->projid; bi->bi_project = s->projid;
} }
...@@ -151,7 +134,10 @@ static int bch2_ioc_fssetxattr(struct bch_fs *c, ...@@ -151,7 +134,10 @@ static int bch2_ioc_fssetxattr(struct bch_fs *c,
if (fa.fsx_xflags) if (fa.fsx_xflags)
return -EOPNOTSUPP; return -EOPNOTSUPP;
s.projid = fa.fsx_projid; if (fa.fsx_projid >= U32_MAX)
return -EINVAL;
s.projid = fa.fsx_projid + 1;
ret = mnt_want_write_file(file); ret = mnt_want_write_file(file);
if (ret) if (ret)
...@@ -164,7 +150,7 @@ static int bch2_ioc_fssetxattr(struct bch_fs *c, ...@@ -164,7 +150,7 @@ static int bch2_ioc_fssetxattr(struct bch_fs *c,
} }
mutex_lock(&inode->ei_update_lock); mutex_lock(&inode->ei_update_lock);
ret = bch2_set_projid(c, inode, fa.fsx_projid); ret = bch2_set_projid(c, inode, s.projid);
if (ret) if (ret)
goto err_unlock; goto err_unlock;
......
...@@ -121,6 +121,19 @@ int bch2_fs_quota_transfer(struct bch_fs *, ...@@ -121,6 +121,19 @@ int bch2_fs_quota_transfer(struct bch_fs *,
unsigned, unsigned,
enum quota_acct_mode); enum quota_acct_mode);
static inline int bch2_set_projid(struct bch_fs *c,
struct bch_inode_info *inode,
u32 projid)
{
struct bch_qid qid = inode->ei_qid;
qid.q[QTYP_PRJ] = projid;
return bch2_fs_quota_transfer(c, inode, qid,
1 << QTYP_PRJ,
KEY_TYPE_QUOTA_PREALLOC);
}
struct inode *bch2_vfs_inode_get(struct bch_fs *, u64); struct inode *bch2_vfs_inode_get(struct bch_fs *, u64);
/* returns 0 if we want to do the update, or error is passed up */ /* returns 0 if we want to do the update, or error is passed up */
......
...@@ -20,7 +20,7 @@ static inline struct bch_qid bch_qid(struct bch_inode_unpacked *u) ...@@ -20,7 +20,7 @@ static inline struct bch_qid bch_qid(struct bch_inode_unpacked *u)
return (struct bch_qid) { return (struct bch_qid) {
.q[QTYP_USR] = u->bi_uid, .q[QTYP_USR] = u->bi_uid,
.q[QTYP_GRP] = u->bi_gid, .q[QTYP_GRP] = u->bi_gid,
.q[QTYP_PRJ] = u->bi_project, .q[QTYP_PRJ] = u->bi_project ? u->bi_project - 1 : 0,
}; };
} }
......
...@@ -515,7 +515,14 @@ static int bch2_xattr_bcachefs_set(const struct xattr_handler *handler, ...@@ -515,7 +515,14 @@ static int bch2_xattr_bcachefs_set(const struct xattr_handler *handler,
} }
mutex_lock(&inode->ei_update_lock); mutex_lock(&inode->ei_update_lock);
if (inode_opt_id == Inode_opt_project) {
ret = bch2_set_projid(c, inode, s.v);
if (ret)
goto err;
}
ret = bch2_write_inode(c, inode, inode_opt_set_fn, &s, 0); ret = bch2_write_inode(c, inode, inode_opt_set_fn, &s, 0);
err:
mutex_unlock(&inode->ei_update_lock); mutex_unlock(&inode->ei_update_lock);
if (value && if (value &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment