goto out;
aed.name = p;
aed.bitnum = bitnum;
- afs_event(ATTRIBUTE_ADD, &pb, &aed);
+ ret = afs_event(ATTRIBUTE_ADD, &pb, &aed);
+ if (ret < 0)
+ goto out;
greatest_att_bitnum = PARA_MAX(greatest_att_bitnum, (int)bitnum);
}
out:
if (ret < 0)
para_printf(&pb, "cannot rename %s to %s\n", old, new);
else
- afs_event(ATTRIBUTE_RENAME, &pb, NULL);
+ ret = afs_event(ATTRIBUTE_RENAME, &pb, NULL);
flush_and_free_pb(&pb);
return ret;
}
para_printf(pb, "cannot remove %s\n", name);
return ret;
}
- afs_event(ATTRIBUTE_REMOVE, pb, &red);
- return 1;
+ return afs_event(ATTRIBUTE_REMOVE, pb, &red);
}
static int com_rmatt_callback(int fd, const struct osl_object *query)
return ret;
}
+static int att_logical_or(struct osl_row *row, void *data)
+{
+ uint64_t *att_mask = data;
+ struct osl_object bitnum_obj;
+ int ret = osl_get_object(attribute_table, row, ATTCOL_BITNUM, &bitnum_obj);
+
+ if (ret < 0)
+ return ret;
+ *att_mask |= 1 << *(unsigned char *)bitnum_obj.data;
+ return 0;
+}
+
+/**
+ * Compute the attribute bit mask and check each afs info bitmap.
+ *
+ * \param fd Needed for the para buffer.
+ * \param query Unused.
+ *
+ * This iterates over all attributes in the attribute table and computes the
+ * logical or of 1 << b where b is the bit number of the attribute. The
+ * resulting bit mask is passed to aft_check_attributes() which performs the
+ * actual check.
+ *
+ * \return Standard.
+ *
+ * \sa \ref aft_check_attributes().
+ */
+int attribute_check_callback(int fd, __a_unused const struct osl_object *query)
+{
+ int ret;
+ uint64_t att_mask = 0; /* bits corresponding to a attributes */
+ 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,
+ };
+
+ ret = osl_rbtree_loop(attribute_table, ATTCOL_BITNUM, &att_mask,
+ att_logical_or);
+ if (ret < 0) {
+ PARA_ERROR_LOG("attribute table loop failed: %s\n",
+ para_strerror(-ret));
+ return ret;
+ }
+ ret = aft_check_attributes(att_mask, &pb);
+ flush_and_free_pb(&pb);
+ return ret;
+}
+
/**
* Close the attribute table.
*