Commit | Line | Data |
---|---|---|
e8a3e471 EB |
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 | * @kuid: 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); |