diff options
Diffstat (limited to 'system/xen/xsa/xsa206-4.8-0006-oxenstored-add-transaction-info-relevant-to-history-.patch')
-rw-r--r-- | system/xen/xsa/xsa206-4.8-0006-oxenstored-add-transaction-info-relevant-to-history-.patch | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/system/xen/xsa/xsa206-4.8-0006-oxenstored-add-transaction-info-relevant-to-history-.patch b/system/xen/xsa/xsa206-4.8-0006-oxenstored-add-transaction-info-relevant-to-history-.patch new file mode 100644 index 0000000000..e9f23d62c1 --- /dev/null +++ b/system/xen/xsa/xsa206-4.8-0006-oxenstored-add-transaction-info-relevant-to-history-.patch @@ -0,0 +1,88 @@ +From eedcaba31d907b889f571113e7d9739e5ce1e9e5 Mon Sep 17 00:00:00 2001 +From: Jonathan Davies <jonathan.davies@citrix.com> +Date: Tue, 14 Mar 2017 12:17:38 +0000 +Subject: [PATCH 06/15] oxenstored: add transaction info relevant to + history-tracking + +Specifically: + * retain the original store (not just the root) in full transactions + * store commit count at the time of the start of the transaction + +Reported-by: Juergen Gross <jgross@suse.com> +Signed-off-by: Jonathan Davies <jonathan.davies@citrix.com> +Reviewed-by: Thomas Sanders <thomas.sanders@citrix.com> +Reviewed-by: Ian Jackson <ian.jackson@eu.citrix.com> +Reviewed-by: Christian Lindig <christian.lindig@citrix.com> +--- + tools/ocaml/xenstored/process.ml | 2 +- + tools/ocaml/xenstored/transaction.ml | 12 ++++++++---- + 2 files changed, 9 insertions(+), 5 deletions(-) + +diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml +index 7b60376..5f92044 100644 +--- a/tools/ocaml/xenstored/process.ml ++++ b/tools/ocaml/xenstored/process.ml +@@ -301,7 +301,7 @@ let transaction_replay c t doms cons = + | Transaction.No -> + error "attempted to replay a non-full transaction"; + false +- | Transaction.Full(id, oldroot, cstore) -> ++ | Transaction.Full(id, oldstore, cstore) -> + let tid = Connection.start_transaction c cstore in + let new_t = Transaction.make tid cstore in + let con = sprintf "r(%d):%s" id (Connection.get_domstr c) in +diff --git a/tools/ocaml/xenstored/transaction.ml b/tools/ocaml/xenstored/transaction.ml +index 6f758ff..b1791b3 100644 +--- a/tools/ocaml/xenstored/transaction.ml ++++ b/tools/ocaml/xenstored/transaction.ml +@@ -73,12 +73,13 @@ let can_coalesce oldroot currentroot path = + + type ty = No | Full of ( + int * (* Transaction id *) +- Store.Node.t * (* Original root *) ++ Store.t * (* Original store *) + Store.t (* A pointer to the canonical store: its root changes on each transaction-commit *) + ) + + type t = { + ty: ty; ++ start_count: int64; + store: Store.t; (* This is the store that we change in write operations. *) + quota: Quota.t; + mutable paths: (Xenbus.Xb.Op.operation * Store.Path.t) list; +@@ -87,10 +88,13 @@ type t = { + mutable write_lowpath: Store.Path.t option; + } + ++let counter = ref 0L ++ + let make id store = +- let ty = if id = none then No else Full(id, Store.get_root store, store) in ++ let ty = if id = none then No else Full(id, Store.copy store, store) in + { + ty = ty; ++ start_count = !counter; + store = if id = none then store else Store.copy store; + quota = Quota.copy store.Store.quota; + paths = []; +@@ -161,7 +165,7 @@ let commit ~con t = + let has_commited = + match t.ty with + | No -> true +- | Full (id, oldroot, cstore) -> (* "cstore" meaning current canonical store *) ++ | Full (id, oldstore, cstore) -> (* "cstore" meaning current canonical store *) + let commit_partial oldroot cstore store = + (* get the lowest path of the query and verify that it hasn't + been modified by others transactions. *) +@@ -204,7 +208,7 @@ let commit ~con t = + if !test_eagain && Random.int 3 = 0 then + false + else +- try_commit oldroot cstore t.store ++ try_commit (Store.get_root oldstore) cstore t.store + in + if has_commited && has_write_ops then + Disk.write t.store; +-- +2.1.4 + |