xref: /openbmc/linux/fs/quota/kqid.c (revision b2441318)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2e8a3e471SEric W. Biederman #include <linux/fs.h>
3e8a3e471SEric W. Biederman #include <linux/quota.h>
4e8a3e471SEric W. Biederman #include <linux/export.h>
5e8a3e471SEric W. Biederman 
6e8a3e471SEric W. Biederman /**
7e8a3e471SEric W. Biederman  *	qid_eq - Test to see if to kquid values are the same
8e8a3e471SEric W. Biederman  *	@left: A qid value
9e8a3e471SEric W. Biederman  *	@right: Another quid value
10e8a3e471SEric W. Biederman  *
11e8a3e471SEric W. Biederman  *	Return true if the two qid values are equal and false otherwise.
12e8a3e471SEric W. Biederman  */
qid_eq(struct kqid left,struct kqid right)13e8a3e471SEric W. Biederman bool qid_eq(struct kqid left, struct kqid right)
14e8a3e471SEric W. Biederman {
15e8a3e471SEric W. Biederman 	if (left.type != right.type)
16e8a3e471SEric W. Biederman 		return false;
17e8a3e471SEric W. Biederman 	switch(left.type) {
18e8a3e471SEric W. Biederman 	case USRQUOTA:
19e8a3e471SEric W. Biederman 		return uid_eq(left.uid, right.uid);
20e8a3e471SEric W. Biederman 	case GRPQUOTA:
21e8a3e471SEric W. Biederman 		return gid_eq(left.gid, right.gid);
22e8a3e471SEric W. Biederman 	case PRJQUOTA:
23e8a3e471SEric W. Biederman 		return projid_eq(left.projid, right.projid);
24e8a3e471SEric W. Biederman 	default:
25e8a3e471SEric W. Biederman 		BUG();
26e8a3e471SEric W. Biederman 	}
27e8a3e471SEric W. Biederman }
28e8a3e471SEric W. Biederman EXPORT_SYMBOL(qid_eq);
29e8a3e471SEric W. Biederman 
30e8a3e471SEric W. Biederman /**
31e8a3e471SEric W. Biederman  *	qid_lt - Test to see if one qid value is less than another
32e8a3e471SEric W. Biederman  *	@left: The possibly lesser qid value
33e8a3e471SEric W. Biederman  *	@right: The possibly greater qid value
34e8a3e471SEric W. Biederman  *
35e8a3e471SEric W. Biederman  *	Return true if left is less than right and false otherwise.
36e8a3e471SEric W. Biederman  */
qid_lt(struct kqid left,struct kqid right)37e8a3e471SEric W. Biederman bool qid_lt(struct kqid left, struct kqid right)
38e8a3e471SEric W. Biederman {
39e8a3e471SEric W. Biederman 	if (left.type < right.type)
40e8a3e471SEric W. Biederman 		return true;
41e8a3e471SEric W. Biederman 	if (left.type > right.type)
42e8a3e471SEric W. Biederman 		return false;
43e8a3e471SEric W. Biederman 	switch (left.type) {
44e8a3e471SEric W. Biederman 	case USRQUOTA:
45e8a3e471SEric W. Biederman 		return uid_lt(left.uid, right.uid);
46e8a3e471SEric W. Biederman 	case GRPQUOTA:
47e8a3e471SEric W. Biederman 		return gid_lt(left.gid, right.gid);
48e8a3e471SEric W. Biederman 	case PRJQUOTA:
49e8a3e471SEric W. Biederman 		return projid_lt(left.projid, right.projid);
50e8a3e471SEric W. Biederman 	default:
51e8a3e471SEric W. Biederman 		BUG();
52e8a3e471SEric W. Biederman 	}
53e8a3e471SEric W. Biederman }
54e8a3e471SEric W. Biederman EXPORT_SYMBOL(qid_lt);
55e8a3e471SEric W. Biederman 
56e8a3e471SEric W. Biederman /**
57e8a3e471SEric W. Biederman  *	from_kqid - Create a qid from a kqid user-namespace pair.
58e8a3e471SEric W. Biederman  *	@targ: The user namespace we want a qid in.
592c15ac5bSFabian Frederick  *	@kqid: The kernel internal quota identifier to start with.
60e8a3e471SEric W. Biederman  *
61e8a3e471SEric W. Biederman  *	Map @kqid into the user-namespace specified by @targ and
62e8a3e471SEric W. Biederman  *	return the resulting qid.
63e8a3e471SEric W. Biederman  *
64e8a3e471SEric W. Biederman  *	There is always a mapping into the initial user_namespace.
65e8a3e471SEric W. Biederman  *
66e8a3e471SEric W. Biederman  *	If @kqid has no mapping in @targ (qid_t)-1 is returned.
67e8a3e471SEric W. Biederman  */
from_kqid(struct user_namespace * targ,struct kqid kqid)68e8a3e471SEric W. Biederman qid_t from_kqid(struct user_namespace *targ, struct kqid kqid)
69e8a3e471SEric W. Biederman {
70e8a3e471SEric W. Biederman 	switch (kqid.type) {
71e8a3e471SEric W. Biederman 	case USRQUOTA:
72e8a3e471SEric W. Biederman 		return from_kuid(targ, kqid.uid);
73e8a3e471SEric W. Biederman 	case GRPQUOTA:
74e8a3e471SEric W. Biederman 		return from_kgid(targ, kqid.gid);
75e8a3e471SEric W. Biederman 	case PRJQUOTA:
76e8a3e471SEric W. Biederman 		return from_kprojid(targ, kqid.projid);
77e8a3e471SEric W. Biederman 	default:
78e8a3e471SEric W. Biederman 		BUG();
79e8a3e471SEric W. Biederman 	}
80e8a3e471SEric W. Biederman }
81e8a3e471SEric W. Biederman EXPORT_SYMBOL(from_kqid);
82e8a3e471SEric W. Biederman 
83e8a3e471SEric W. Biederman /**
84e8a3e471SEric W. Biederman  *	from_kqid_munged - Create a qid from a kqid user-namespace pair.
85e8a3e471SEric W. Biederman  *	@targ: The user namespace we want a qid in.
86e8a3e471SEric W. Biederman  *	@kqid: The kernel internal quota identifier to start with.
87e8a3e471SEric W. Biederman  *
88e8a3e471SEric W. Biederman  *	Map @kqid into the user-namespace specified by @targ and
89e8a3e471SEric W. Biederman  *	return the resulting qid.
90e8a3e471SEric W. Biederman  *
91e8a3e471SEric W. Biederman  *	There is always a mapping into the initial user_namespace.
92e8a3e471SEric W. Biederman  *
93e8a3e471SEric W. Biederman  *	Unlike from_kqid from_kqid_munged never fails and always
94e8a3e471SEric W. Biederman  *	returns a valid projid.  This makes from_kqid_munged
95e8a3e471SEric W. Biederman  *	appropriate for use in places where failing to provide
96e8a3e471SEric W. Biederman  *	a qid_t is not a good option.
97e8a3e471SEric W. Biederman  *
98e8a3e471SEric W. Biederman  *	If @kqid has no mapping in @targ the kqid.type specific
99e8a3e471SEric W. Biederman  *	overflow identifier is returned.
100e8a3e471SEric W. Biederman  */
from_kqid_munged(struct user_namespace * targ,struct kqid kqid)101e8a3e471SEric W. Biederman qid_t from_kqid_munged(struct user_namespace *targ, struct kqid kqid)
102e8a3e471SEric W. Biederman {
103e8a3e471SEric W. Biederman 	switch (kqid.type) {
104e8a3e471SEric W. Biederman 	case USRQUOTA:
105e8a3e471SEric W. Biederman 		return from_kuid_munged(targ, kqid.uid);
106e8a3e471SEric W. Biederman 	case GRPQUOTA:
107e8a3e471SEric W. Biederman 		return from_kgid_munged(targ, kqid.gid);
108e8a3e471SEric W. Biederman 	case PRJQUOTA:
109e8a3e471SEric W. Biederman 		return from_kprojid_munged(targ, kqid.projid);
110e8a3e471SEric W. Biederman 	default:
111e8a3e471SEric W. Biederman 		BUG();
112e8a3e471SEric W. Biederman 	}
113e8a3e471SEric W. Biederman }
114e8a3e471SEric W. Biederman EXPORT_SYMBOL(from_kqid_munged);
115e8a3e471SEric W. Biederman 
116e8a3e471SEric W. Biederman /**
117e8a3e471SEric W. Biederman  *	qid_valid - Report if a valid value is stored in a kqid.
118e8a3e471SEric W. Biederman  *	@qid: The kernel internal quota identifier to test.
119e8a3e471SEric W. Biederman  */
qid_valid(struct kqid qid)120e8a3e471SEric W. Biederman bool qid_valid(struct kqid qid)
121e8a3e471SEric W. Biederman {
122e8a3e471SEric W. Biederman 	switch (qid.type) {
123e8a3e471SEric W. Biederman 	case USRQUOTA:
124e8a3e471SEric W. Biederman 		return uid_valid(qid.uid);
125e8a3e471SEric W. Biederman 	case GRPQUOTA:
126e8a3e471SEric W. Biederman 		return gid_valid(qid.gid);
127e8a3e471SEric W. Biederman 	case PRJQUOTA:
128e8a3e471SEric W. Biederman 		return projid_valid(qid.projid);
129e8a3e471SEric W. Biederman 	default:
130e8a3e471SEric W. Biederman 		BUG();
131e8a3e471SEric W. Biederman 	}
132e8a3e471SEric W. Biederman }
133e8a3e471SEric W. Biederman EXPORT_SYMBOL(qid_valid);
134