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,
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,
struct bch_inode_unpacked *bi,
void *p)
......@@ -124,11 +111,7 @@ static int fssetxattr_inode_update_fn(struct bch_inode_info *inode,
struct flags_set *s = p;
if (s->projid != bi->bi_project) {
if (s->projid)
bi->bi_fields_set |= 1U << Inode_opt_project;
else
bi->bi_fields_set &= ~(1U << Inode_opt_project);
bi->bi_project = s->projid;
}
......@@ -151,7 +134,10 @@ static int bch2_ioc_fssetxattr(struct bch_fs *c,
if (fa.fsx_xflags)
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);
if (ret)
......@@ -164,7 +150,7 @@ static int bch2_ioc_fssetxattr(struct bch_fs *c,
}
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)
goto err_unlock;
......
......@@ -121,6 +121,19 @@ int bch2_fs_quota_transfer(struct bch_fs *,
unsigned,
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);
/* 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)
return (struct bch_qid) {
.q[QTYP_USR] = u->bi_uid,
.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,
}
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);
err:
mutex_unlock(&inode->ei_update_lock);
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