qemu-ga: use key-value store to avoid recycling fd handles after restart
commitf305d504ab1114c578a64c90e17885129eb8d0aa
authorMichael Roth <mdroth@linux.vnet.ibm.com>
Fri, 1 Mar 2013 17:40:27 +0000 (1 11:40 -0600)
committerMichael Roth <mdroth@linux.vnet.ibm.com>
Tue, 2 Apr 2013 16:16:31 +0000 (2 11:16 -0500)
tree6aa673532f87a60abd3a661d34d56c8da6266834
parentd3652a1b286063f02425adc18515804272ebef18
qemu-ga: use key-value store to avoid recycling fd handles after restart

Hosts hold on to handles provided by guest-file-open for periods that can
span beyond the life of the qemu-ga process that issued them. Since these
are issued starting from 0 on every restart, we run the risk of issuing
duplicate handles after restarts/reboots.

As a result, users with a stale copy of these handles may end up
reading/writing corrupted data due to their existing handles effectively
being re-assigned to an unexpected file or offset.

We unfortunately do not issue handles as strings, but as integers, so a
solution such as using UUIDs can't be implemented without introducing a
new interface.

As a workaround, we fix this by implementing a persistent key-value store
that will be used to track the value of the last handle that was issued
across restarts/reboots to avoid issuing duplicates.

The store is automatically written to the same directory we currently
set via --statedir to track fsfreeze state, and so should be applicable
for stable releases where this flag is supported.

A follow-up can use this same store for handling fsfreeze state, but
that change is cosmetic and left out for now.

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Cc: qemu-stable@nongnu.org
* fixed guest_file_handle_add() return value from uint64_t to int64_t
(cherry picked from commit 39097daf15c42243742667607d2cad2c9dc4f764)

Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
qga/commands-posix.c
qga/guest-agent-core.h
qga/main.c