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