[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen staging-4.15] tools/xenstore: add helpers to free struct buffered_data



commit b322923894ea23f397efc58a938cb9213d7dc617
Author:     Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Tue Sep 13 07:35:07 2022 +0200
Commit:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Tue Nov 1 15:03:25 2022 +0000

    tools/xenstore: add helpers to free struct buffered_data
    
    Add two helpers for freeing struct buffered_data: free_buffered_data()
    for freeing one instance and conn_free_buffered_data() for freeing all
    instances for a connection.
    
    This is avoiding duplicated code and will help later when more actions
    are needed when freeing a struct buffered_data.
    
    This is part of XSA-326.
    
    Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
    Reviewed-by: Julien Grall <jgrall@xxxxxxxxxx>
    (cherry picked from commit ead062a68a9c201a95488e84750a70a107f7b317)
---
 tools/xenstore/xenstored_core.c   | 26 +++++++++++++++++---------
 tools/xenstore/xenstored_core.h   |  2 ++
 tools/xenstore/xenstored_domain.c |  7 +------
 3 files changed, 20 insertions(+), 15 deletions(-)

diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c
index 01d4a2e440..6498bf6036 100644
--- a/tools/xenstore/xenstored_core.c
+++ b/tools/xenstore/xenstored_core.c
@@ -211,6 +211,21 @@ void reopen_log(void)
        }
 }
 
+static void free_buffered_data(struct buffered_data *out,
+                              struct connection *conn)
+{
+       list_del(&out->list);
+       talloc_free(out);
+}
+
+void conn_free_buffered_data(struct connection *conn)
+{
+       struct buffered_data *out;
+
+       while ((out = list_top(&conn->out_list, struct buffered_data, list)))
+               free_buffered_data(out, conn);
+}
+
 static bool write_messages(struct connection *conn)
 {
        int ret;
@@ -254,8 +269,7 @@ static bool write_messages(struct connection *conn)
 
        trace_io(conn, out, 1);
 
-       list_del(&out->list);
-       talloc_free(out);
+       free_buffered_data(out, conn);
 
        return true;
 }
@@ -1472,18 +1486,12 @@ static struct {
  */
 static void ignore_connection(struct connection *conn)
 {
-       struct buffered_data *out, *tmp;
-
        trace("CONN %p ignored\n", conn);
 
        conn->is_ignored = true;
        conn_delete_all_watches(conn);
        conn_delete_all_transactions(conn);
-
-       list_for_each_entry_safe(out, tmp, &conn->out_list, list) {
-               list_del(&out->list);
-               talloc_free(out);
-       }
+       conn_free_buffered_data(conn);
 
        talloc_free(conn->in);
        conn->in = NULL;
diff --git a/tools/xenstore/xenstored_core.h b/tools/xenstore/xenstored_core.h
index 38d97fa081..0ba5b783d4 100644
--- a/tools/xenstore/xenstored_core.h
+++ b/tools/xenstore/xenstored_core.h
@@ -270,6 +270,8 @@ int remember_string(struct hashtable *hash, const char 
*str);
 
 void set_tdb_key(const char *name, TDB_DATA *key);
 
+void conn_free_buffered_data(struct connection *conn);
+
 const char *dump_state_global(FILE *fp);
 const char *dump_state_buffered_data(FILE *fp, const struct connection *c,
                                     const struct connection *conn,
diff --git a/tools/xenstore/xenstored_domain.c 
b/tools/xenstore/xenstored_domain.c
index 3d4d0649a2..72a5cd3b9a 100644
--- a/tools/xenstore/xenstored_domain.c
+++ b/tools/xenstore/xenstored_domain.c
@@ -417,15 +417,10 @@ static struct domain *find_domain_by_domid(unsigned int 
domid)
 static void domain_conn_reset(struct domain *domain)
 {
        struct connection *conn = domain->conn;
-       struct buffered_data *out;
 
        conn_delete_all_watches(conn);
        conn_delete_all_transactions(conn);
-
-       while ((out = list_top(&conn->out_list, struct buffered_data, list))) {
-               list_del(&out->list);
-               talloc_free(out);
-       }
+       conn_free_buffered_data(conn);
 
        talloc_free(conn->in);
 
--
generated by git-patchbot for /home/xen/git/xen.git#staging-4.15



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.