18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci#include <linux/fs.h>
38c2ecf20Sopenharmony_ci#include <linux/quota.h>
48c2ecf20Sopenharmony_ci#include <linux/export.h>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci/**
78c2ecf20Sopenharmony_ci *	qid_eq - Test to see if to kquid values are the same
88c2ecf20Sopenharmony_ci *	@left: A qid value
98c2ecf20Sopenharmony_ci *	@right: Another quid value
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci *	Return true if the two qid values are equal and false otherwise.
128c2ecf20Sopenharmony_ci */
138c2ecf20Sopenharmony_cibool qid_eq(struct kqid left, struct kqid right)
148c2ecf20Sopenharmony_ci{
158c2ecf20Sopenharmony_ci	if (left.type != right.type)
168c2ecf20Sopenharmony_ci		return false;
178c2ecf20Sopenharmony_ci	switch(left.type) {
188c2ecf20Sopenharmony_ci	case USRQUOTA:
198c2ecf20Sopenharmony_ci		return uid_eq(left.uid, right.uid);
208c2ecf20Sopenharmony_ci	case GRPQUOTA:
218c2ecf20Sopenharmony_ci		return gid_eq(left.gid, right.gid);
228c2ecf20Sopenharmony_ci	case PRJQUOTA:
238c2ecf20Sopenharmony_ci		return projid_eq(left.projid, right.projid);
248c2ecf20Sopenharmony_ci	default:
258c2ecf20Sopenharmony_ci		BUG();
268c2ecf20Sopenharmony_ci	}
278c2ecf20Sopenharmony_ci}
288c2ecf20Sopenharmony_ciEXPORT_SYMBOL(qid_eq);
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci/**
318c2ecf20Sopenharmony_ci *	qid_lt - Test to see if one qid value is less than another
328c2ecf20Sopenharmony_ci *	@left: The possibly lesser qid value
338c2ecf20Sopenharmony_ci *	@right: The possibly greater qid value
348c2ecf20Sopenharmony_ci *
358c2ecf20Sopenharmony_ci *	Return true if left is less than right and false otherwise.
368c2ecf20Sopenharmony_ci */
378c2ecf20Sopenharmony_cibool qid_lt(struct kqid left, struct kqid right)
388c2ecf20Sopenharmony_ci{
398c2ecf20Sopenharmony_ci	if (left.type < right.type)
408c2ecf20Sopenharmony_ci		return true;
418c2ecf20Sopenharmony_ci	if (left.type > right.type)
428c2ecf20Sopenharmony_ci		return false;
438c2ecf20Sopenharmony_ci	switch (left.type) {
448c2ecf20Sopenharmony_ci	case USRQUOTA:
458c2ecf20Sopenharmony_ci		return uid_lt(left.uid, right.uid);
468c2ecf20Sopenharmony_ci	case GRPQUOTA:
478c2ecf20Sopenharmony_ci		return gid_lt(left.gid, right.gid);
488c2ecf20Sopenharmony_ci	case PRJQUOTA:
498c2ecf20Sopenharmony_ci		return projid_lt(left.projid, right.projid);
508c2ecf20Sopenharmony_ci	default:
518c2ecf20Sopenharmony_ci		BUG();
528c2ecf20Sopenharmony_ci	}
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ciEXPORT_SYMBOL(qid_lt);
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci/**
578c2ecf20Sopenharmony_ci *	from_kqid - Create a qid from a kqid user-namespace pair.
588c2ecf20Sopenharmony_ci *	@targ: The user namespace we want a qid in.
598c2ecf20Sopenharmony_ci *	@kqid: The kernel internal quota identifier to start with.
608c2ecf20Sopenharmony_ci *
618c2ecf20Sopenharmony_ci *	Map @kqid into the user-namespace specified by @targ and
628c2ecf20Sopenharmony_ci *	return the resulting qid.
638c2ecf20Sopenharmony_ci *
648c2ecf20Sopenharmony_ci *	There is always a mapping into the initial user_namespace.
658c2ecf20Sopenharmony_ci *
668c2ecf20Sopenharmony_ci *	If @kqid has no mapping in @targ (qid_t)-1 is returned.
678c2ecf20Sopenharmony_ci */
688c2ecf20Sopenharmony_ciqid_t from_kqid(struct user_namespace *targ, struct kqid kqid)
698c2ecf20Sopenharmony_ci{
708c2ecf20Sopenharmony_ci	switch (kqid.type) {
718c2ecf20Sopenharmony_ci	case USRQUOTA:
728c2ecf20Sopenharmony_ci		return from_kuid(targ, kqid.uid);
738c2ecf20Sopenharmony_ci	case GRPQUOTA:
748c2ecf20Sopenharmony_ci		return from_kgid(targ, kqid.gid);
758c2ecf20Sopenharmony_ci	case PRJQUOTA:
768c2ecf20Sopenharmony_ci		return from_kprojid(targ, kqid.projid);
778c2ecf20Sopenharmony_ci	default:
788c2ecf20Sopenharmony_ci		BUG();
798c2ecf20Sopenharmony_ci	}
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ciEXPORT_SYMBOL(from_kqid);
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci/**
848c2ecf20Sopenharmony_ci *	from_kqid_munged - Create a qid from a kqid user-namespace pair.
858c2ecf20Sopenharmony_ci *	@targ: The user namespace we want a qid in.
868c2ecf20Sopenharmony_ci *	@kqid: The kernel internal quota identifier to start with.
878c2ecf20Sopenharmony_ci *
888c2ecf20Sopenharmony_ci *	Map @kqid into the user-namespace specified by @targ and
898c2ecf20Sopenharmony_ci *	return the resulting qid.
908c2ecf20Sopenharmony_ci *
918c2ecf20Sopenharmony_ci *	There is always a mapping into the initial user_namespace.
928c2ecf20Sopenharmony_ci *
938c2ecf20Sopenharmony_ci *	Unlike from_kqid from_kqid_munged never fails and always
948c2ecf20Sopenharmony_ci *	returns a valid projid.  This makes from_kqid_munged
958c2ecf20Sopenharmony_ci *	appropriate for use in places where failing to provide
968c2ecf20Sopenharmony_ci *	a qid_t is not a good option.
978c2ecf20Sopenharmony_ci *
988c2ecf20Sopenharmony_ci *	If @kqid has no mapping in @targ the kqid.type specific
998c2ecf20Sopenharmony_ci *	overflow identifier is returned.
1008c2ecf20Sopenharmony_ci */
1018c2ecf20Sopenharmony_ciqid_t from_kqid_munged(struct user_namespace *targ, struct kqid kqid)
1028c2ecf20Sopenharmony_ci{
1038c2ecf20Sopenharmony_ci	switch (kqid.type) {
1048c2ecf20Sopenharmony_ci	case USRQUOTA:
1058c2ecf20Sopenharmony_ci		return from_kuid_munged(targ, kqid.uid);
1068c2ecf20Sopenharmony_ci	case GRPQUOTA:
1078c2ecf20Sopenharmony_ci		return from_kgid_munged(targ, kqid.gid);
1088c2ecf20Sopenharmony_ci	case PRJQUOTA:
1098c2ecf20Sopenharmony_ci		return from_kprojid_munged(targ, kqid.projid);
1108c2ecf20Sopenharmony_ci	default:
1118c2ecf20Sopenharmony_ci		BUG();
1128c2ecf20Sopenharmony_ci	}
1138c2ecf20Sopenharmony_ci}
1148c2ecf20Sopenharmony_ciEXPORT_SYMBOL(from_kqid_munged);
1158c2ecf20Sopenharmony_ci
1168c2ecf20Sopenharmony_ci/**
1178c2ecf20Sopenharmony_ci *	qid_valid - Report if a valid value is stored in a kqid.
1188c2ecf20Sopenharmony_ci *	@qid: The kernel internal quota identifier to test.
1198c2ecf20Sopenharmony_ci */
1208c2ecf20Sopenharmony_cibool qid_valid(struct kqid qid)
1218c2ecf20Sopenharmony_ci{
1228c2ecf20Sopenharmony_ci	switch (qid.type) {
1238c2ecf20Sopenharmony_ci	case USRQUOTA:
1248c2ecf20Sopenharmony_ci		return uid_valid(qid.uid);
1258c2ecf20Sopenharmony_ci	case GRPQUOTA:
1268c2ecf20Sopenharmony_ci		return gid_valid(qid.gid);
1278c2ecf20Sopenharmony_ci	case PRJQUOTA:
1288c2ecf20Sopenharmony_ci		return projid_valid(qid.projid);
1298c2ecf20Sopenharmony_ci	default:
1308c2ecf20Sopenharmony_ci		BUG();
1318c2ecf20Sopenharmony_ci	}
1328c2ecf20Sopenharmony_ci}
1338c2ecf20Sopenharmony_ciEXPORT_SYMBOL(qid_valid);
134