Blame SOURCES/xfsprogs-5.7.0-xfs_quota-refactor-code-to-generate-id-from-name.patch

1569e6
From 67a73d6139d0336eb7ced05bd78a26b57f408187 Mon Sep 17 00:00:00 2001
1569e6
From: Eric Sandeen <sandeen@redhat.com>
1569e6
Date: Tue, 26 May 2020 14:36:04 -0400
1569e6
Subject: [PATCH] xfs_quota: refactor code to generate id from name
1569e6
1569e6
There's boilerplate for setting limits and warnings, where we have
1569e6
a case statement for each of the 3 quota types, and from there call
1569e6
3 different functions to configure each of the 3 types, each of which
1569e6
calls its own version of id to string function...
1569e6
1569e6
Refactor this so that the main function can call a generic id to string
1569e6
conversion routine, and then call a common action.  This save a lot of
1569e6
LOC.
1569e6
1569e6
I was looking at allowing xfs to bump out individual grace periods like
1569e6
setquota can do, and this refactoring allows us to add new actions like
1569e6
that without copying all the boilerplate again.
1569e6
1569e6
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
1569e6
Reviewed-by: Christoph Hellwig <hch@lst.de>
1569e6
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
1569e6
---
1569e6
 quota/edit.c | 194 +++++++++++++--------------------------------------
1569e6
 1 file changed, 49 insertions(+), 145 deletions(-)
1569e6
1569e6
Index: xfsprogs-5.0.0/quota/edit.c
1569e6
===================================================================
1569e6
--- xfsprogs-5.0.0.orig/quota/edit.c
1569e6
+++ xfsprogs-5.0.0/quota/edit.c
1569e6
@@ -101,6 +101,40 @@ warn_help(void)
1569e6
 "\n"));
1569e6
 }
1569e6
 
1569e6
+static uint32_t
1569e6
+id_from_string(
1569e6
+	char	*name,
1569e6
+	int	type)
1569e6
+{
1569e6
+	uint32_t	id = -1;
1569e6
+	const char	*type_name = "unknown type";
1569e6
+
1569e6
+	switch (type) {
1569e6
+	case XFS_USER_QUOTA:
1569e6
+		type_name = "user";
1569e6
+		id = uid_from_string(name);
1569e6
+		break;
1569e6
+	case XFS_GROUP_QUOTA:
1569e6
+		type_name = "group";
1569e6
+		id = gid_from_string(name);
1569e6
+		break;
1569e6
+	case XFS_PROJ_QUOTA:
1569e6
+		type_name = "project";
1569e6
+		id = prid_from_string(name);
1569e6
+		break;
1569e6
+	default:
1569e6
+		ASSERT(0);
1569e6
+		break;
1569e6
+	}
1569e6
+
1569e6
+	if (id == -1) {
1569e6
+		fprintf(stderr, _("%s: invalid %s name: %s\n"),
1569e6
+			type_name, progname, name);
1569e6
+		exitcode = 1;
1569e6
+	}
1569e6
+	return id;
1569e6
+}
1569e6
+
1569e6
 static void
1569e6
 set_limits(
1569e6
 	uint32_t	id,
1569e6
@@ -135,75 +169,6 @@ set_limits(
1569e6
 	}
1569e6
 }
1569e6
 
1569e6
-static void
1569e6
-set_user_limits(
1569e6
-	char		*name,
1569e6
-	uint		type,
1569e6
-	uint		mask,
1569e6
-	uint64_t	*bsoft,
1569e6
-	uint64_t	*bhard,
1569e6
-	uint64_t	*isoft,
1569e6
-	uint64_t	*ihard,
1569e6
-	uint64_t	*rtbsoft,
1569e6
-	uint64_t	*rtbhard)
1569e6
-{
1569e6
-	uid_t		uid = uid_from_string(name);
1569e6
-
1569e6
-	if (uid == -1) {
1569e6
-		exitcode = 1;
1569e6
-		fprintf(stderr, _("%s: invalid user name: %s\n"),
1569e6
-				progname, name);
1569e6
-	} else
1569e6
-		set_limits(uid, type, mask, fs_path->fs_name,
1569e6
-				bsoft, bhard, isoft, ihard, rtbsoft, rtbhard);
1569e6
-}
1569e6
-
1569e6
-static void
1569e6
-set_group_limits(
1569e6
-	char		*name,
1569e6
-	uint		type,
1569e6
-	uint		mask,
1569e6
-	uint64_t	*bsoft,
1569e6
-	uint64_t	*bhard,
1569e6
-	uint64_t	*isoft,
1569e6
-	uint64_t	*ihard,
1569e6
-	uint64_t	*rtbsoft,
1569e6
-	uint64_t	*rtbhard)
1569e6
-{
1569e6
-	gid_t		gid = gid_from_string(name);
1569e6
-
1569e6
-	if (gid == -1) {
1569e6
-		exitcode = 1;
1569e6
-		fprintf(stderr, _("%s: invalid group name: %s\n"),
1569e6
-				progname, name);
1569e6
-	} else
1569e6
-		set_limits(gid, type, mask, fs_path->fs_name,
1569e6
-				bsoft, bhard, isoft, ihard, rtbsoft, rtbhard);
1569e6
-}
1569e6
-
1569e6
-static void
1569e6
-set_project_limits(
1569e6
-	char		*name,
1569e6
-	uint		type,
1569e6
-	uint		mask,
1569e6
-	uint64_t	*bsoft,
1569e6
-	uint64_t	*bhard,
1569e6
-	uint64_t	*isoft,
1569e6
-	uint64_t	*ihard,
1569e6
-	uint64_t	*rtbsoft,
1569e6
-	uint64_t	*rtbhard)
1569e6
-{
1569e6
-	prid_t		prid = prid_from_string(name);
1569e6
-
1569e6
-	if (prid == -1) {
1569e6
-		exitcode = 1;
1569e6
-		fprintf(stderr, _("%s: invalid project name: %s\n"),
1569e6
-				progname, name);
1569e6
-	} else
1569e6
-		set_limits(prid, type, mask, fs_path->fs_name,
1569e6
-				bsoft, bhard, isoft, ihard, rtbsoft, rtbhard);
1569e6
-}
1569e6
-
1569e6
 /* extract number of blocks from an ascii string */
1569e6
 static int
1569e6
 extractb(
1569e6
@@ -258,6 +223,7 @@ limit_f(
1569e6
 	char		**argv)
1569e6
 {
1569e6
 	char		*name;
1569e6
+	uint32_t	id;
1569e6
 	uint64_t	bsoft, bhard, isoft, ihard, rtbsoft, rtbhard;
1569e6
 	int		c, type = 0, mask = 0, flags = 0;
1569e6
 	uint		bsize, ssize, endoptions;
1569e6
@@ -339,20 +305,13 @@ limit_f(
1569e6
 		return command_usage(&limit_cmd);
1569e6
 	}
1569e6
 
1569e6
-	switch (type) {
1569e6
-	case XFS_USER_QUOTA:
1569e6
-		set_user_limits(name, type, mask,
1569e6
-			&bsoft, &bhard, &isoft, &ihard, &rtbsoft, &rtbhard);
1569e6
-		break;
1569e6
-	case XFS_GROUP_QUOTA:
1569e6
-		set_group_limits(name, type, mask,
1569e6
-			&bsoft, &bhard, &isoft, &ihard, &rtbsoft, &rtbhard);
1569e6
-		break;
1569e6
-	case XFS_PROJ_QUOTA:
1569e6
-		set_project_limits(name, type, mask,
1569e6
-			&bsoft, &bhard, &isoft, &ihard, &rtbsoft, &rtbhard);
1569e6
-		break;
1569e6
-	}
1569e6
+
1569e6
+	id = id_from_string(name, type);
1569e6
+	if (id >= 0)
1569e6
+		set_limits(id, type, mask, fs_path->fs_name,
1569e6
+			   &bsoft, &bhard, &isoft, &ihard, &rtbsoft, &rtbhard);
1569e6
+	else
1569e6
+		exitcode = -1;
1569e6
 	return 0;
1569e6
 }
1569e6
 
1569e6
@@ -561,63 +520,13 @@ set_warnings(
1569e6
 	}
1569e6
 }
1569e6
 
1569e6
-static void
1569e6
-set_user_warnings(
1569e6
-	char		*name,
1569e6
-	uint		type,
1569e6
-	uint		mask,
1569e6
-	uint		value)
1569e6
-{
1569e6
-	uid_t		uid = uid_from_string(name);
1569e6
-
1569e6
-	if (uid == -1) {
1569e6
-		exitcode = 1;
1569e6
-		fprintf(stderr, _("%s: invalid user name: %s\n"),
1569e6
-				progname, name);
1569e6
-	} else
1569e6
-		set_warnings(uid, type, mask, fs_path->fs_name, value);
1569e6
-}
1569e6
-
1569e6
-static void
1569e6
-set_group_warnings(
1569e6
-	char		*name,
1569e6
-	uint		type,
1569e6
-	uint		mask,
1569e6
-	uint		value)
1569e6
-{
1569e6
-	gid_t		gid = gid_from_string(name);
1569e6
-
1569e6
-	if (gid == -1) {
1569e6
-		exitcode = 1;
1569e6
-		fprintf(stderr, _("%s: invalid group name: %s\n"),
1569e6
-				progname, name);
1569e6
-	} else
1569e6
-		set_warnings(gid, type, mask, fs_path->fs_name, value);
1569e6
-}
1569e6
-
1569e6
-static void
1569e6
-set_project_warnings(
1569e6
-	char		*name,
1569e6
-	uint		type,
1569e6
-	uint		mask,
1569e6
-	uint		value)
1569e6
-{
1569e6
-	prid_t		prid = prid_from_string(name);
1569e6
-
1569e6
-	if (prid == -1) {
1569e6
-		exitcode = 1;
1569e6
-		fprintf(stderr, _("%s: invalid project name: %s\n"),
1569e6
-				progname, name);
1569e6
-	} else
1569e6
-		set_warnings(prid, type, mask, fs_path->fs_name, value);
1569e6
-}
1569e6
-
1569e6
 static int
1569e6
 warn_f(
1569e6
 	int		argc,
1569e6
 	char		**argv)
1569e6
 {
1569e6
 	char		*name;
1569e6
+	uint32_t	id;
1569e6
 	uint		value;
1569e6
 	int		c, flags = 0, type = 0, mask = 0;
1569e6
 
1569e6
@@ -675,17 +584,12 @@ warn_f(
1569e6
 		return command_usage(&warn_cmd);
1569e6
 	}
1569e6
 
1569e6
-	switch (type) {
1569e6
-	case XFS_USER_QUOTA:
1569e6
-		set_user_warnings(name, type, mask, value);
1569e6
-		break;
1569e6
-	case XFS_GROUP_QUOTA:
1569e6
-		set_group_warnings(name, type, mask, value);
1569e6
-		break;
1569e6
-	case XFS_PROJ_QUOTA:
1569e6
-		set_project_warnings(name, type, mask, value);
1569e6
-		break;
1569e6
-	}
1569e6
+	id = id_from_string(name, type);
1569e6
+	if (id >= 0)
1569e6
+		set_warnings(id, type, mask, fs_path->fs_name, value);
1569e6
+	else
1569e6
+		exitcode = -1;
1569e6
+
1569e6
 	return 0;
1569e6
 }
1569e6