diff options
Diffstat (limited to 'system/xen/xsa/xsa206-4.8-0008-oxenstored-only-record-operations-with-side-effects-.patch')
-rw-r--r-- | system/xen/xsa/xsa206-4.8-0008-oxenstored-only-record-operations-with-side-effects-.patch | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/system/xen/xsa/xsa206-4.8-0008-oxenstored-only-record-operations-with-side-effects-.patch b/system/xen/xsa/xsa206-4.8-0008-oxenstored-only-record-operations-with-side-effects-.patch new file mode 100644 index 0000000000..e3de404298 --- /dev/null +++ b/system/xen/xsa/xsa206-4.8-0008-oxenstored-only-record-operations-with-side-effects-.patch @@ -0,0 +1,85 @@ +From f8083d52b6314f92718316f160eea47fef47988e Mon Sep 17 00:00:00 2001 +From: Jonathan Davies <jonathan.davies@citrix.com> +Date: Thu, 23 Mar 2017 14:20:33 +0000 +Subject: [PATCH 08/15] oxenstored: only record operations with side-effects in + history + +There is no need to record "read" operations as they will never cause another +transaction to fail. + +Reported-by: Juergen Gross <jgross@suse.com> +Signed-off-by: Jonathan Davies <jonathan.davies@citrix.com> +Reviewed-by: Thomas Sanders <thomas.sanders@citrix.com> + +--- + tools/ocaml/xenstored/process.ml | 47 ++++++++++++++++++++++++++++++++++++---- + 1 file changed, 43 insertions(+), 4 deletions(-) + +diff --git a/tools/ocaml/xenstored/process.ml b/tools/ocaml/xenstored/process.ml +index 964c044..b435a4a 100644 +--- a/tools/ocaml/xenstored/process.ml ++++ b/tools/ocaml/xenstored/process.ml +@@ -450,6 +450,37 @@ let function_of_type ty = + | _ -> function_of_type_simple_op ty + + (** ++ * Determines which individual (non-transactional) operations we want to retain. ++ * We only want to retain operations that have side-effects in the store since ++ * these can be the cause of transactions failing. ++ *) ++let retain_op_in_history ty = ++ match ty with ++ | Xenbus.Xb.Op.Write ++ | Xenbus.Xb.Op.Mkdir ++ | Xenbus.Xb.Op.Rm ++ | Xenbus.Xb.Op.Setperms -> true ++ | Xenbus.Xb.Op.Debug ++ | Xenbus.Xb.Op.Directory ++ | Xenbus.Xb.Op.Read ++ | Xenbus.Xb.Op.Getperms ++ | Xenbus.Xb.Op.Watch ++ | Xenbus.Xb.Op.Unwatch ++ | Xenbus.Xb.Op.Transaction_start ++ | Xenbus.Xb.Op.Transaction_end ++ | Xenbus.Xb.Op.Introduce ++ | Xenbus.Xb.Op.Release ++ | Xenbus.Xb.Op.Getdomainpath ++ | Xenbus.Xb.Op.Watchevent ++ | Xenbus.Xb.Op.Error ++ | Xenbus.Xb.Op.Isintroduced ++ | Xenbus.Xb.Op.Resume ++ | Xenbus.Xb.Op.Set_target ++ | Xenbus.Xb.Op.Restrict ++ | Xenbus.Xb.Op.Reset_watches ++ | Xenbus.Xb.Op.Invalid -> false ++ ++(** + * Nothrow guarantee. + *) + let process_packet ~store ~cons ~doms ~con ~req = +@@ -465,10 +496,18 @@ let process_packet ~store ~cons ~doms ~con ~req = + Connection.get_transaction con tid + in + +- let before = Store.copy store in +- let response = input_handle_error ~cons ~doms ~fct ~con ~t ~req in +- let after = Store.copy store in +- if tid = Transaction.none then record_commit ~con ~tid ~before ~after; ++ let execute () = input_handle_error ~cons ~doms ~fct ~con ~t ~req in ++ ++ let response = ++ (* Note that transactions are recorded in history separately. *) ++ if tid = Transaction.none && retain_op_in_history ty then begin ++ let before = Store.copy store in ++ let response = execute () in ++ let after = Store.copy store in ++ record_commit ~con ~tid ~before ~after; ++ response ++ end else execute () ++ in + + let response = try + if tid <> Transaction.none then +-- +2.1.4 + |