From bc01d9124d52c8f68061a10d9952d2a36ef03fe5 Mon Sep 17 00:00:00 2001
From: Andre Noll <maan@tuebingen.mpg.de>
Date: Sun, 5 Apr 2015 22:22:04 +0000
Subject: [PATCH] rmatt: Cleanup callback.

Get rid of struct remove_attribute_action_data, since only the para
buffer is necessary. This changes the code to pass a pointer to the
para buffer itself as the data pointer for ->action() of the pattern
matching loop.
---
 attribute.c | 50 ++++++++++++++++----------------------------------
 1 file changed, 16 insertions(+), 34 deletions(-)

diff --git a/attribute.c b/attribute.c
index e0e9a2fa..af1400c8 100644
--- a/attribute.c
+++ b/attribute.c
@@ -343,53 +343,37 @@ int com_mvatt(struct command_context *cc)
 		com_mvatt_callback, afs_cb_result_handler, cc);
 }
 
-/** Data passed to the action handler of com_rmatt(). */
-struct remove_attribute_action_data {
-	/** Message buffer. */
-	struct para_buffer pb;
-	/** Number of attributes removed. */
-	int num_removed;
-	/** Bitwise "or" of the removed attributes. */
-	uint64_t mask_of_removed_atts;
-};
-
-/* returns succcess even on errors to keep the loop going */
 static int remove_attribute(struct osl_table *table, struct osl_row *row,
 		const char *name, void *data)
 {
-	struct remove_attribute_action_data *raad = data;
+	struct para_buffer *pb = data;
 	int ret;
 	struct rmatt_event_data red = {.name = name};
 
 	ret = get_attribute_bitnum_by_name(name, &red.bitnum);
 	if (ret < 0) {
-		para_printf(&raad->pb, "%s: %s\n", name, para_strerror(-ret));
+		para_printf(pb, "cannot remove %s\n", name);
 		return ret;
 	}
+	para_printf(pb, "removing attribute %s\n", name);
 	ret = osl(osl_del_row(table, row));
 	if (ret < 0) {
-		para_printf(&raad->pb, "%s: %s\n", name, para_strerror(-ret));
+		para_printf(pb, "cannot remove %s\n", name);
 		return ret;
 	}
-	para_printf(&raad->pb, "removed attribute %s\n", name);
-	raad->num_removed++;
-	raad->mask_of_removed_atts |= (1 << red.bitnum);
-	afs_event(ATTRIBUTE_REMOVE, &raad->pb, &red);
+	afs_event(ATTRIBUTE_REMOVE, pb, &red);
 	return 1;
 }
 
 static int com_rmatt_callback(int fd, const struct osl_object *query)
 {
-	struct remove_attribute_action_data raad = {
-		.num_removed = 0,
-		.pb = {
-			.max_size = shm_get_shmmax(),
-			.private_data = &(struct afs_max_size_handler_data) {
-				.fd = fd,
-				.band = SBD_OUTPUT
-			},
-			.max_size_handler = afs_max_size_handler,
-		}
+	struct para_buffer pb = {
+		.max_size = shm_get_shmmax(),
+		.private_data = &(struct afs_max_size_handler_data) {
+			.fd = fd,
+			.band = SBD_OUTPUT
+		},
+		.max_size_handler = afs_max_size_handler,
 	};
 	int ret;
 	struct pattern_match_data pmd = {
@@ -397,18 +381,16 @@ static int com_rmatt_callback(int fd, const struct osl_object *query)
 		.patterns = *query,
 		.loop_col_num = ATTCOL_BITNUM,
 		.match_col_num = ATTCOL_NAME,
-		.data = &raad,
+		.data = &pb,
 		.action = remove_attribute
 	};
 	ret = for_each_matching_row(&pmd);
-	if (ret < 0) {
-		para_printf(&raad.pb, "%s\n", para_strerror(-ret));
+	if (ret < 0)
 		goto out;
-	}
-	if (!raad.num_removed)
+	if (pmd.num_matches == 0)
 		ret = -E_NO_MATCH;
 out:
-	flush_and_free_pb(&raad.pb);
+	flush_and_free_pb(&pb);
 	return ret;
 }
 
-- 
2.39.5