@@ -1442,7 +1442,6 @@ static void destroy_node_rm(struct connection *conn, struct node *node)
static int destroy_node(struct connection *conn, struct node *node)
{
destroy_node_rm(conn, node);
- domain_nbentry_dec(conn, node->perms.p[0].id);
/*
* It is not possible to easily revert the changes in a transaction.
@@ -1788,27 +1787,11 @@ static int do_set_perms(const void *ctx, struct connection *conn,
old_perms = node->perms;
domain_nbentry_dec(conn, node->perms.p[0].id);
node->perms = perms;
- if (domain_nbentry_inc(conn, node->perms.p[0].id)) {
- node->perms = old_perms;
- /*
- * This should never fail because we had a reference on the
- * domain before and Xenstored is single-threaded.
- */
- domain_nbentry_inc(conn, node->perms.p[0].id);
+ if (domain_nbentry_inc(conn, node->perms.p[0].id))
return ENOMEM;
- }
- if (write_node(conn, node, false)) {
- int saved_errno = errno;
-
- domain_nbentry_dec(conn, node->perms.p[0].id);
- node->perms = old_perms;
- /* No failure possible as above. */
- domain_nbentry_inc(conn, node->perms.p[0].id);
-
- errno = saved_errno;
+ if (write_node(conn, node, false))
return errno;
- }
fire_watches(conn, ctx, name, node, false, &old_perms);
send_ack(conn, XS_SET_PERMS);
@@ -20,9 +20,9 @@
#define _XENSTORED_DOMAIN_H
enum {
+ ACC_NODES,
ACC_REQ_N, /* Number of elements per request and domain. */
- ACC_NODES = ACC_REQ_N,
- ACC_TR_N, /* Number of elements per transaction and domain. */
+ ACC_TR_N = ACC_REQ_N, /* Number of elements per transaction and domain. */
ACC_N = ACC_TR_N /* Number of elements per domain. */
};
Add the node accounting to the accounting information buffering in order to avoid having to undo it in case of failure. Signed-off-by: Juergen Gross <jgross@suse.com> --- tools/xenstore/xenstored_core.c | 21 ++------------------- tools/xenstore/xenstored_domain.h | 4 ++-- 2 files changed, 4 insertions(+), 21 deletions(-)