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