qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 2/3] block: adjust qmp_transaction to be extenda


From: Wenchao Xia
Subject: Re: [Qemu-devel] [PATCH 2/3] block: adjust qmp_transaction to be extendable
Date: Thu, 18 Apr 2013 11:00:04 +0800
User-agent: Mozilla/5.0 (Windows NT 5.1; rv:17.0) Gecko/20130328 Thunderbird/17.0.5

于 2013-4-17 22:42, Stefan Hajnoczi 写道:
On Mon, Apr 01, 2013 at 06:01:30PM +0800, Wenchao Xia wrote:
  /* New and old BlockDriverState structs for group snapshots */
-typedef struct BlkTransactionStates {
+typedef struct BdrvActionOps {
+    int (*commit)(BlockdevAction *action, void **p_opaque, Error **errp);
+    void (*rollback)(BlockdevAction *action, void *opaque);
+    void (*clean)(BlockdevAction *action, void *opaque);

Please document these functions.

  OK.

+const BdrvActionOps external_snapshot_ops = {
+    .commit = external_snapshot_commit,
+    .rollback = external_snapshot_rollback,
+    .clean = external_snapshot_clean,
+};
+
+typedef struct BlkTransactionStates {
+    BlockdevAction *action;
+    void *opaque;
+    const BdrvActionOps *ops;
      QSIMPLEQ_ENTRY(BlkTransactionStates) entry;
  } BlkTransactionStates;

The relationship between BlkTransactionStates and ExternalSnapshotState
can be simplified:

typedef struct {
     int (*commit)(BlkTransactionState *state, Error **errp);
     void (*rollback)(BlkTransactionState *state);
     void (*clean)(BlkTransactionState *state);
     size_t instance_size;
} BdrvActionOps;

typedef struct BlkTransactionState {
     BlockDevAction *action;
     const BdrvActionOps *ops;
     QSIMPLEQ_ENTRY(BlkTransactionState) entry;
} BlkTransactionState;

typedef struct {
     BlkTransactionState common;
     BlockDriverState *old_bs;
     BlockDriverState *new_bs;
} ExternalSnapshotState;

const BdrvActionOps external_snapshot_ops = {
     .commit = external_snapshot_commit,
     .rollback = external_snapshot_rollback,
     .clean = external_snapshot_clean,
     .instance_size = sizeof(ExternalSnapshotState);
};

This eliminates the opaque pointer and g_free(state) can be handled by
qmp_transaction().  This way action types no longer need to free opaque.

  Where should be ExternalSnapshotState* placed, insert it into
BlkTransactionState, or BdrvActionOps?

--
Best Regards

Wenchao Xia




reply via email to

[Prev in Thread] Current Thread [Next in Thread]