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