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

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