Commit 05e0a60d authored by Eric W. Biederman's avatar Eric W. Biederman

gfs2: Store qd_id in struct gfs2_quota_data as a struct kqid

- Change qd_id in struct gfs2_qutoa_data to struct kqid.
- Remove the now unnecessary QDF_USER bit field in qd_flags.
- Propopoage this change through the code generally making
  things simpler along the way.

Cc: Steven Whitehouse <swhiteho@redhat.com>
Signed-off-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
parent ed87dabc
...@@ -391,7 +391,6 @@ struct gfs2_revoke_replay { ...@@ -391,7 +391,6 @@ struct gfs2_revoke_replay {
}; };
enum { enum {
QDF_USER = 0,
QDF_CHANGE = 1, QDF_CHANGE = 1,
QDF_LOCKED = 2, QDF_LOCKED = 2,
QDF_REFRESH = 3, QDF_REFRESH = 3,
...@@ -403,7 +402,7 @@ struct gfs2_quota_data { ...@@ -403,7 +402,7 @@ struct gfs2_quota_data {
atomic_t qd_count; atomic_t qd_count;
u32 qd_id; struct kqid qd_id;
unsigned long qd_flags; /* QDF_... */ unsigned long qd_flags; /* QDF_... */
s64 qd_change; s64 qd_change;
......
...@@ -122,8 +122,9 @@ int gfs2_shrink_qd_memory(struct shrinker *shrink, struct shrink_control *sc) ...@@ -122,8 +122,9 @@ int gfs2_shrink_qd_memory(struct shrinker *shrink, struct shrink_control *sc)
static u64 qd2index(struct gfs2_quota_data *qd) static u64 qd2index(struct gfs2_quota_data *qd)
{ {
return (2 * (u64)qd->qd_id) + struct kqid qid = qd->qd_id;
test_bit(QDF_USER, &qd->qd_flags) ? 0 : 1; return (2 * (u64)from_kqid(&init_user_ns, qid)) +
(qid.type == USRQUOTA) ? 0 : 1;
} }
static u64 qd2offset(struct gfs2_quota_data *qd) static u64 qd2offset(struct gfs2_quota_data *qd)
...@@ -136,7 +137,7 @@ static u64 qd2offset(struct gfs2_quota_data *qd) ...@@ -136,7 +137,7 @@ static u64 qd2offset(struct gfs2_quota_data *qd)
return offset; return offset;
} }
static int qd_alloc(struct gfs2_sbd *sdp, int user, u32 id, static int qd_alloc(struct gfs2_sbd *sdp, struct kqid qid,
struct gfs2_quota_data **qdp) struct gfs2_quota_data **qdp)
{ {
struct gfs2_quota_data *qd; struct gfs2_quota_data *qd;
...@@ -147,9 +148,7 @@ static int qd_alloc(struct gfs2_sbd *sdp, int user, u32 id, ...@@ -147,9 +148,7 @@ static int qd_alloc(struct gfs2_sbd *sdp, int user, u32 id,
return -ENOMEM; return -ENOMEM;
atomic_set(&qd->qd_count, 1); atomic_set(&qd->qd_count, 1);
qd->qd_id = id; qd->qd_id = qid;
if (user)
set_bit(QDF_USER, &qd->qd_flags);
qd->qd_slot = -1; qd->qd_slot = -1;
INIT_LIST_HEAD(&qd->qd_reclaim); INIT_LIST_HEAD(&qd->qd_reclaim);
...@@ -167,7 +166,7 @@ static int qd_alloc(struct gfs2_sbd *sdp, int user, u32 id, ...@@ -167,7 +166,7 @@ static int qd_alloc(struct gfs2_sbd *sdp, int user, u32 id,
return error; return error;
} }
static int qd_get(struct gfs2_sbd *sdp, int user, u32 id, static int qd_get(struct gfs2_sbd *sdp, struct kqid qid,
struct gfs2_quota_data **qdp) struct gfs2_quota_data **qdp)
{ {
struct gfs2_quota_data *qd = NULL, *new_qd = NULL; struct gfs2_quota_data *qd = NULL, *new_qd = NULL;
...@@ -179,8 +178,7 @@ static int qd_get(struct gfs2_sbd *sdp, int user, u32 id, ...@@ -179,8 +178,7 @@ static int qd_get(struct gfs2_sbd *sdp, int user, u32 id,
found = 0; found = 0;
spin_lock(&qd_lru_lock); spin_lock(&qd_lru_lock);
list_for_each_entry(qd, &sdp->sd_quota_list, qd_list) { list_for_each_entry(qd, &sdp->sd_quota_list, qd_list) {
if (qd->qd_id == id && if (qid_eq(qd->qd_id, qid)) {
!test_bit(QDF_USER, &qd->qd_flags) == !user) {
if (!atomic_read(&qd->qd_count) && if (!atomic_read(&qd->qd_count) &&
!list_empty(&qd->qd_reclaim)) { !list_empty(&qd->qd_reclaim)) {
/* Remove it from reclaim list */ /* Remove it from reclaim list */
...@@ -214,7 +212,7 @@ static int qd_get(struct gfs2_sbd *sdp, int user, u32 id, ...@@ -214,7 +212,7 @@ static int qd_get(struct gfs2_sbd *sdp, int user, u32 id,
return 0; return 0;
} }
error = qd_alloc(sdp, user, id, &new_qd); error = qd_alloc(sdp, qid, &new_qd);
if (error) if (error)
return error; return error;
} }
...@@ -469,8 +467,7 @@ static int qdsb_get(struct gfs2_sbd *sdp, struct kqid qid, ...@@ -469,8 +467,7 @@ static int qdsb_get(struct gfs2_sbd *sdp, struct kqid qid,
{ {
int error; int error;
error = qd_get(sdp, qid.type == USRQUOTA ? QUOTA_USER : QUOTA_GROUP, error = qd_get(sdp, qid, qdp);
from_kqid(&init_user_ns, qid), qdp);
if (error) if (error)
return error; return error;
...@@ -574,18 +571,10 @@ static int sort_qd(const void *a, const void *b) ...@@ -574,18 +571,10 @@ static int sort_qd(const void *a, const void *b)
const struct gfs2_quota_data *qd_a = *(const struct gfs2_quota_data **)a; const struct gfs2_quota_data *qd_a = *(const struct gfs2_quota_data **)a;
const struct gfs2_quota_data *qd_b = *(const struct gfs2_quota_data **)b; const struct gfs2_quota_data *qd_b = *(const struct gfs2_quota_data **)b;
if (!test_bit(QDF_USER, &qd_a->qd_flags) != if (qid_lt(qd_a->qd_id, qd_b->qd_id))
!test_bit(QDF_USER, &qd_b->qd_flags)) {
if (test_bit(QDF_USER, &qd_a->qd_flags))
return -1;
else
return 1;
}
if (qd_a->qd_id < qd_b->qd_id)
return -1; return -1;
if (qd_a->qd_id > qd_b->qd_id) if (qid_lt(qd_b->qd_id, qd_a->qd_id))
return 1; return 1;
return 0; return 0;
} }
...@@ -602,9 +591,9 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change) ...@@ -602,9 +591,9 @@ static void do_qc(struct gfs2_quota_data *qd, s64 change)
if (!test_bit(QDF_CHANGE, &qd->qd_flags)) { if (!test_bit(QDF_CHANGE, &qd->qd_flags)) {
qc->qc_change = 0; qc->qc_change = 0;
qc->qc_flags = 0; qc->qc_flags = 0;
if (test_bit(QDF_USER, &qd->qd_flags)) if (qd->qd_id.type == USRQUOTA)
qc->qc_flags = cpu_to_be32(GFS2_QCF_USER); qc->qc_flags = cpu_to_be32(GFS2_QCF_USER);
qc->qc_id = cpu_to_be32(qd->qd_id); qc->qc_id = cpu_to_be32(from_kqid(&init_user_ns, qd->qd_id));
} }
x = be64_to_cpu(qc->qc_change) + change; x = be64_to_cpu(qc->qc_change) + change;
...@@ -1047,8 +1036,8 @@ static int print_message(struct gfs2_quota_data *qd, char *type) ...@@ -1047,8 +1036,8 @@ static int print_message(struct gfs2_quota_data *qd, char *type)
printk(KERN_INFO "GFS2: fsid=%s: quota %s for %s %u\n", printk(KERN_INFO "GFS2: fsid=%s: quota %s for %s %u\n",
sdp->sd_fsname, type, sdp->sd_fsname, type,
(test_bit(QDF_USER, &qd->qd_flags)) ? "user" : "group", (qd->qd_id.type == USRQUOTA) ? "user" : "group",
qd->qd_id); from_kqid(&init_user_ns, qd->qd_id));
return 0; return 0;
} }
...@@ -1070,8 +1059,8 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid) ...@@ -1070,8 +1059,8 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) { for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
qd = ip->i_res->rs_qa_qd[x]; qd = ip->i_res->rs_qa_qd[x];
if (!((qd->qd_id == uid && test_bit(QDF_USER, &qd->qd_flags)) || if (!(qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
(qd->qd_id == gid && !test_bit(QDF_USER, &qd->qd_flags)))) qid_eq(qd->qd_id, make_kqid_gid(gid))))
continue; continue;
value = (s64)be64_to_cpu(qd->qd_qb.qb_value); value = (s64)be64_to_cpu(qd->qd_qb.qb_value);
...@@ -1081,10 +1070,7 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid) ...@@ -1081,10 +1070,7 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
if (be64_to_cpu(qd->qd_qb.qb_limit) && (s64)be64_to_cpu(qd->qd_qb.qb_limit) < value) { if (be64_to_cpu(qd->qd_qb.qb_limit) && (s64)be64_to_cpu(qd->qd_qb.qb_limit) < value) {
print_message(qd, "exceeded"); print_message(qd, "exceeded");
quota_send_warning(make_kqid(&init_user_ns, quota_send_warning(qd->qd_id,
test_bit(QDF_USER, &qd->qd_flags) ?
USRQUOTA : GRPQUOTA,
qd->qd_id),
sdp->sd_vfs->s_dev, QUOTA_NL_BHARDWARN); sdp->sd_vfs->s_dev, QUOTA_NL_BHARDWARN);
error = -EDQUOT; error = -EDQUOT;
...@@ -1094,10 +1080,7 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid) ...@@ -1094,10 +1080,7 @@ int gfs2_quota_check(struct gfs2_inode *ip, u32 uid, u32 gid)
time_after_eq(jiffies, qd->qd_last_warn + time_after_eq(jiffies, qd->qd_last_warn +
gfs2_tune_get(sdp, gfs2_tune_get(sdp,
gt_quota_warn_period) * HZ)) { gt_quota_warn_period) * HZ)) {
quota_send_warning(make_kqid(&init_user_ns, quota_send_warning(qd->qd_id,
test_bit(QDF_USER, &qd->qd_flags) ?
USRQUOTA : GRPQUOTA,
qd->qd_id),
sdp->sd_vfs->s_dev, QUOTA_NL_BSOFTWARN); sdp->sd_vfs->s_dev, QUOTA_NL_BSOFTWARN);
error = print_message(qd, "warning"); error = print_message(qd, "warning");
qd->qd_last_warn = jiffies; qd->qd_last_warn = jiffies;
...@@ -1121,8 +1104,8 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change, ...@@ -1121,8 +1104,8 @@ void gfs2_quota_change(struct gfs2_inode *ip, s64 change,
for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) { for (x = 0; x < ip->i_res->rs_qa_qd_num; x++) {
qd = ip->i_res->rs_qa_qd[x]; qd = ip->i_res->rs_qa_qd[x];
if ((qd->qd_id == uid && test_bit(QDF_USER, &qd->qd_flags)) || if (qid_eq(qd->qd_id, make_kqid_uid(uid)) ||
(qd->qd_id == gid && !test_bit(QDF_USER, &qd->qd_flags))) { qid_eq(qd->qd_id, make_kqid_gid(gid))) {
do_qc(qd, change); do_qc(qd, change);
} }
} }
...@@ -1183,8 +1166,7 @@ int gfs2_quota_refresh(struct gfs2_sbd *sdp, struct kqid qid) ...@@ -1183,8 +1166,7 @@ int gfs2_quota_refresh(struct gfs2_sbd *sdp, struct kqid qid)
struct gfs2_holder q_gh; struct gfs2_holder q_gh;
int error; int error;
error = qd_get(sdp, qid.type == USRQUOTA ? QUOTA_USER : QUOTA_GROUP, error = qd_get(sdp, qid, &qd);
from_kqid(&init_user_ns, qid), &qd);
if (error) if (error)
return error; return error;
...@@ -1267,8 +1249,7 @@ int gfs2_quota_init(struct gfs2_sbd *sdp) ...@@ -1267,8 +1249,7 @@ int gfs2_quota_init(struct gfs2_sbd *sdp)
if (!qc.qc_change) if (!qc.qc_change)
continue; continue;
error = qd_alloc(sdp, (qc.qc_flags & GFS2_QCF_USER), error = qd_alloc(sdp, qc.qc_id, &qd);
from_kqid(&init_user_ns, qc.qc_id), &qd);
if (error) { if (error) {
brelse(bh); brelse(bh);
goto fail; goto fail;
...@@ -1509,7 +1490,7 @@ static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid, ...@@ -1509,7 +1490,7 @@ static int gfs2_get_dqblk(struct super_block *sb, struct kqid qid,
else else
return -EINVAL; return -EINVAL;
error = qd_get(sdp, type, from_kqid(&init_user_ns, qid), &qd); error = qd_get(sdp, qid, &qd);
if (error) if (error)
return error; return error;
error = do_glock(qd, FORCE, &q_gh); error = do_glock(qd, FORCE, &q_gh);
...@@ -1564,7 +1545,7 @@ static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid, ...@@ -1564,7 +1545,7 @@ static int gfs2_set_dqblk(struct super_block *sb, struct kqid qid,
if (fdq->d_fieldmask & ~GFS2_FIELDMASK) if (fdq->d_fieldmask & ~GFS2_FIELDMASK)
return -EINVAL; return -EINVAL;
error = qd_get(sdp, type, from_kqid(&init_user_ns, qid), &qd); error = qd_get(sdp, qid, &qd);
if (error) if (error)
return error; return error;
......
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