]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: Use container_of()
authorMarco Bettini <marco.bettini@open-xchange.com>
Thu, 6 Apr 2023 14:55:41 +0000 (14:55 +0000)
committerMarco Bettini <marco.bettini@open-xchange.com>
Fri, 21 Apr 2023 07:11:54 +0000 (07:11 +0000)
src/plugins/virtual/virtual-list.c
src/plugins/virtual/virtual-mail.c
src/plugins/virtual/virtual-save.c
src/plugins/virtual/virtual-search.c
src/plugins/virtual/virtual-storage.c
src/plugins/virtual/virtual-sync.c
src/plugins/virtual/virtual-transaction.c

index 71576e4ad47282f117bc9b099452329206a2c48d..333d01bb2d49a73f9b8d02a608ff1c9baa29199b 100644 (file)
@@ -34,7 +34,7 @@ virtual_get_storage(struct mailbox_list **list, const char **vname,
        struct mailbox *vbox =
                mailbox_alloc(*list, *vname, flags & ENUM_NEGATE(MAILBOX_FLAG_SAVEONLY));
        i_assert(strcmp(vbox->storage->name, VIRTUAL_STORAGE_NAME) == 0);
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)vbox;
+       struct virtual_mailbox *mbox = container_of(vbox, struct virtual_mailbox, box);
        const char *path;
        int ret = mailbox_get_path_to(vbox, MAILBOX_LIST_PATH_TYPE_MAILBOX, &path);
        if (ret > 0)
index fd8303fc587c7f4da90a3072dd5c426d07480fae..7afb932d4ab22151ccf9d39ff38b6e97ce0f01f6 100644 (file)
@@ -6,6 +6,13 @@
 #include "virtual-storage.h"
 #include "virtual-transaction.h"
 
+#define virtual_mail_container_of(mail) \
+       container_of( \
+       container_of( \
+       container_of(mail, struct mail_private, mail), \
+                          struct index_mail,   mail), \
+                          struct virtual_mail, imail)
+
 struct virtual_mail {
        struct index_mail imail;
 
@@ -33,7 +40,8 @@ virtual_mail_alloc(struct mailbox_transaction_context *t,
                   enum mail_fetch_field wanted_fields,
                   struct mailbox_header_lookup_ctx *wanted_headers)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)t->box;
+       struct virtual_mailbox *mbox =
+               container_of(t->box, struct virtual_mailbox, box);
        struct virtual_mail *vmail;
        pool_t mail_pool, data_pool;
 
@@ -55,7 +63,7 @@ virtual_mail_alloc(struct mailbox_transaction_context *t,
 
 static void virtual_mail_close(struct mail *mail)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail **mails;
        unsigned int i, count;
 
@@ -66,7 +74,8 @@ static void virtual_mail_close(struct mail *mail)
 
        mails = array_get_modifiable(&vmail->backend_mails, &count);
        for (i = 0; i < count; i++) {
-               struct mail_private *p = (struct mail_private *)mails[i];
+               struct mail_private *p =
+                       container_of(mails[i], struct mail_private, mail);
 
                if (vmail->imail.freeing)
                        mail_free(&mails[i]);
@@ -98,7 +107,8 @@ static int backend_mail_get(struct virtual_mail *vmail,
                            struct mail **backend_mail_r)
 {
        struct mail *mail = &vmail->imail.mail.mail;
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
+       struct virtual_mailbox *mbox =
+               container_of(mail->box, struct virtual_mailbox, box);
        struct virtual_backend_box *bbox;
 
        *backend_mail_r = NULL;
@@ -145,7 +155,7 @@ struct mail *
 virtual_mail_set_backend_mail(struct mail *mail,
                              struct virtual_backend_box *bbox)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail_private *backend_pmail;
        struct mailbox_transaction_context *backend_trans;
        struct mailbox_header_lookup_ctx *backend_headers;
@@ -170,7 +180,7 @@ virtual_mail_set_backend_mail(struct mail *mail,
 void virtual_mail_set_unattached_backend_mail(struct mail *mail,
                                              struct mail *backend_mail)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail_private *backend_pmail;
 
        vmail->cur_backend_mail = backend_mail;
@@ -181,8 +191,9 @@ void virtual_mail_set_unattached_backend_mail(struct mail *mail,
 
 static void virtual_mail_set_seq(struct mail *mail, uint32_t seq, bool saving)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)mail->box;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
+       struct virtual_mailbox *mbox =
+               container_of(mail->box, struct virtual_mailbox, box);
        const void *data;
 
        i_assert(!saving);
@@ -209,7 +220,7 @@ static bool virtual_mail_set_uid(struct mail *mail, uint32_t uid)
 
 static void virtual_mail_set_uid_cache_updates(struct mail *mail, bool set)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        struct mail_private *p;
 
@@ -221,7 +232,7 @@ static void virtual_mail_set_uid_cache_updates(struct mail *mail, bool set)
 
 static bool virtual_mail_prefetch(struct mail *mail)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        struct mail_private *p;
 
@@ -233,7 +244,7 @@ static bool virtual_mail_prefetch(struct mail *mail)
 
 static int virtual_mail_precache(struct mail *mail)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        struct mail_private *p;
 
@@ -248,7 +259,7 @@ virtual_mail_add_temp_wanted_fields(struct mail *mail,
                                    enum mail_fetch_field fields,
                                    struct mailbox_header_lookup_ctx *headers)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        struct mailbox_header_lookup_ctx *backend_headers, *new_headers;
 
@@ -278,7 +289,7 @@ virtual_mail_add_temp_wanted_fields(struct mail *mail,
 static int
 virtual_mail_get_parts(struct mail *mail, struct message_part **parts_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
@@ -293,7 +304,7 @@ virtual_mail_get_parts(struct mail *mail, struct message_part **parts_r)
 static int
 virtual_mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        int tz;
 
@@ -311,7 +322,7 @@ virtual_mail_get_date(struct mail *mail, time_t *date_r, int *timezone_r)
 
 static int virtual_mail_get_received_date(struct mail *mail, time_t *date_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
@@ -325,7 +336,7 @@ static int virtual_mail_get_received_date(struct mail *mail, time_t *date_r)
 
 static int virtual_mail_get_save_date(struct mail *mail, time_t *date_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        int ret;
 
@@ -339,7 +350,7 @@ static int virtual_mail_get_save_date(struct mail *mail, time_t *date_r)
 
 static int virtual_mail_get_virtual_mail_size(struct mail *mail, uoff_t *size_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
@@ -353,7 +364,7 @@ static int virtual_mail_get_virtual_mail_size(struct mail *mail, uoff_t *size_r)
 
 static int virtual_mail_get_physical_size(struct mail *mail, uoff_t *size_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
@@ -369,7 +380,7 @@ static int
 virtual_mail_get_first_header(struct mail *mail, const char *field,
                              bool decode_to_utf8, const char **value_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        struct mail_private *p;
        int ret;
@@ -390,7 +401,7 @@ static int
 virtual_mail_get_headers(struct mail *mail, const char *field,
                         bool decode_to_utf8, const char *const **value_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        struct mail_private *p;
 
@@ -409,7 +420,7 @@ virtual_mail_get_header_stream(struct mail *mail,
                               struct mailbox_header_lookup_ctx *headers,
                               struct istream **stream_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
        struct mailbox_header_lookup_ctx *backend_headers;
        int ret;
@@ -434,8 +445,9 @@ virtual_mail_get_stream(struct mail *mail, bool get_body,
                        struct message_size *body_size,
                        struct istream **stream_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
-       struct mail_private *vp = (struct mail_private *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
+       struct mail_private *vp =
+               container_of(mail, struct mail_private, mail);
        struct mail *backend_mail;
        const char *reason = t_strdup_printf("virtual mailbox %s: Opened mail UID=%u: %s",
                                             mailbox_get_vname(mail->box), mail->uid, vp->get_stream_reason);
@@ -466,13 +478,14 @@ virtual_mail_get_binary_stream(struct mail *mail,
                               unsigned int *lines_r, bool *binary_r,
                               struct istream **stream_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
                return -1;
 
-       struct mail_private *p = (struct mail_private *)backend_mail;
+       struct mail_private *p =
+               container_of(backend_mail, struct mail_private, mail);
        if (p->v.get_binary_stream(backend_mail, part, include_hdr,
                                   size_r, lines_r, binary_r, stream_r) < 0) {
                virtual_box_copy_error(mail->box, backend_mail->box);
@@ -485,7 +498,7 @@ static int
 virtual_mail_get_special(struct mail *mail, enum mail_fetch_field field,
                         const char **value_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
@@ -500,7 +513,7 @@ virtual_mail_get_special(struct mail *mail, enum mail_fetch_field field,
 static int virtual_mail_get_backend_mail(struct mail *mail,
                                         struct mail **real_mail_r)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
@@ -513,7 +526,7 @@ static int virtual_mail_get_backend_mail(struct mail *mail,
 
 static void virtual_mail_update_pop3_uidl(struct mail *mail, const char *uidl)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
@@ -523,7 +536,7 @@ static void virtual_mail_update_pop3_uidl(struct mail *mail, const char *uidl)
 
 static void virtual_mail_expunge(struct mail *mail)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
@@ -536,7 +549,7 @@ virtual_mail_set_cache_corrupted(struct mail *mail,
                                 enum mail_fetch_field field,
                                 const char *reason)
 {
-       struct virtual_mail *vmail = (struct virtual_mail *)mail;
+       struct virtual_mail *vmail = virtual_mail_container_of(mail);
        struct mail *backend_mail;
 
        if (backend_mail_get(vmail, &backend_mail) < 0)
index 9499cd30980cea6c3d21fbf62695885e99ef099c..353f22c0a03ab8a3f1fe2b51825f54dd9e2d8925 100644 (file)
@@ -17,7 +17,7 @@ struct mail_save_context *
 virtual_save_alloc(struct mailbox_transaction_context *_t)
 {
        struct virtual_transaction_context *t =
-               (struct virtual_transaction_context *)_t;
+               container_of(_t, struct virtual_transaction_context, t);
        struct virtual_mailbox *mbox = (struct virtual_mailbox *)_t->box;
        struct mailbox_transaction_context *backend_trans;
        struct virtual_save_context *ctx;
index ee04a7405338dfe41f2112c7164d164f6f0e647a..6393f6a2a715ee54686a040c7871eb9c1e39a065 100644 (file)
@@ -65,7 +65,7 @@ static void virtual_search_get_records(struct mail_search_context *ctx,
                                       struct virtual_search_context *vctx)
 {
        struct virtual_mailbox *mbox =
-               (struct virtual_mailbox *)ctx->transaction->box;
+               container_of(ctx->transaction->box, struct virtual_mailbox, box);
        const struct virtual_mail_index_record *vrec;
        struct virtual_search_record srec;
        const void *data;
@@ -135,7 +135,8 @@ bool virtual_search_next_nonblock(struct mail_search_context *ctx,
                                  struct mail **mail_r, bool *tryagain_r)
 {
        struct virtual_search_context *vctx = VIRTUAL_CONTEXT_REQUIRE(ctx);
-       struct index_search_context *ictx = (struct index_search_context *)ctx;
+       struct index_search_context *ictx =
+               container_of(ctx, struct index_search_context, mail_ctx);
        uint32_t seq;
 
        switch (vctx->search_state) {
index 2c7cc321b4864618032e8539aad06efe65f10492..4a5314e44709ee0909a1a170fa3485ec1a8e2fb6 100644 (file)
@@ -87,7 +87,8 @@ virtual_storage_create(struct mail_storage *_storage,
                       struct mail_namespace *ns ATTR_UNUSED,
                       const char **error_r)
 {
-       struct virtual_storage *storage = (struct virtual_storage *)_storage;
+       struct virtual_storage *storage =
+               container_of(_storage, struct virtual_storage, storage);
        const char *value;
 
        value = mail_user_plugin_getenv(_storage->user, "virtual_max_open_mailboxes");
@@ -258,7 +259,8 @@ static struct mailbox *
 virtual_mailbox_alloc(struct mail_storage *_storage, struct mailbox_list *list,
                      const char *vname, enum mailbox_flags flags)
 {
-       struct virtual_storage *storage = (struct virtual_storage *)_storage;
+       struct virtual_storage *storage =
+               container_of(_storage, struct virtual_storage, storage);
        struct virtual_mailbox *mbox;
        pool_t pool;
 
@@ -481,7 +483,8 @@ virtual_mailbox_exists(struct mailbox *box, bool auto_boxes ATTR_UNUSED,
 
 static int virtual_mailbox_open(struct mailbox *box)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
        bool broken;
        int ret = 0;
 
@@ -543,7 +546,8 @@ static int virtual_mailbox_open(struct mailbox *box)
 
 static void virtual_mailbox_close(struct mailbox *box)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
 
        virtual_mailbox_close_internal(mbox);
        index_storage_mailbox_close(box);
@@ -551,7 +555,8 @@ static void virtual_mailbox_close(struct mailbox *box)
 
 static void virtual_mailbox_free(struct mailbox *box)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
 
        virtual_config_free(mbox);
        index_storage_mailbox_free(box);
@@ -623,7 +628,8 @@ virtual_storage_get_status(struct mailbox *box,
                           enum mailbox_status_items items,
                           struct mailbox_status *status_r)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
 
        if ((items & STATUS_LAST_CACHED_SEQ) != 0)
                items |= STATUS_MESSAGES;
@@ -658,7 +664,8 @@ virtual_mailbox_get_metadata(struct mailbox *box,
                             enum mailbox_metadata_items items,
                             struct mailbox_metadata *metadata_r)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
        if (index_mailbox_get_metadata(box, items, metadata_r) < 0)
                return -1;
        i_assert(box->opened);
@@ -696,7 +703,8 @@ static int virtual_notify_start(struct virtual_backend_box *bbox)
 
 static void virtual_notify_changes(struct mailbox *box)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
        struct virtual_backend_box **bboxp;
 
        if (box->notify_callback == NULL) {
@@ -756,7 +764,8 @@ virtual_get_virtual_uids(struct mailbox *box,
                         const ARRAY_TYPE(seq_range) *backend_uids,
                         ARRAY_TYPE(seq_range) *virtual_uids_r)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
        struct virtual_backend_box *bbox;
        const struct virtual_backend_uidmap *uids;
        ARRAY_TYPE(seq_range) uid_range;
@@ -798,7 +807,8 @@ virtual_get_virtual_uid_map(struct mailbox *box,
                            const ARRAY_TYPE(seq_range) *backend_uids,
                            ARRAY_TYPE(uint32_t) *virtual_uids_r)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
        struct virtual_backend_box *bbox;
        const struct virtual_backend_uidmap *uids;
        struct seq_range_iter iter;
@@ -836,7 +846,8 @@ virtual_get_virtual_backend_boxes(struct mailbox *box,
                                  ARRAY_TYPE(mailboxes) *mailboxes,
                                  bool only_with_msgs)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
        struct virtual_backend_box *const *bboxes;
        unsigned int i, count;
 
@@ -849,7 +860,8 @@ virtual_get_virtual_backend_boxes(struct mailbox *box,
 
 static bool virtual_is_inconsistent(struct mailbox *box)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
 
        if (mbox->inconsistent)
                return TRUE;
index 2c654f7a3ff85d1fc2445664e261061794924b52..c9799501c3f83df1bad5c3740dbf0e2b207896cb 100644 (file)
@@ -1769,7 +1769,7 @@ virtual_sync_apply_existing_expunges(struct virtual_mailbox *mbox,
                                     struct mailbox_sync_context *sync_ctx)
 {
        struct index_mailbox_sync_context *isync_ctx =
-               (struct index_mailbox_sync_context *)sync_ctx;
+               container_of(sync_ctx, struct index_mailbox_sync_context, ctx);
        struct virtual_backend_box *bbox = NULL;
        struct seq_range_iter iter;
        const struct virtual_mail_index_record *vrec;
@@ -1971,7 +1971,8 @@ static int virtual_sync(struct virtual_mailbox *mbox,
 struct mailbox_sync_context *
 virtual_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
        struct mailbox_sync_context *sync_ctx;
        int ret = 0;
 
index 53ac0a8ee4c87eebcacac6954b996d2f25f4dd6a..319d653d9c339612492c39243bb26969b025dc79 100644 (file)
@@ -10,7 +10,7 @@ virtual_transaction_get(struct mailbox_transaction_context *trans,
                        struct mailbox *backend_box)
 {
        struct virtual_transaction_context *vt =
-               (struct virtual_transaction_context *)trans;
+               container_of(trans, struct virtual_transaction_context, t);
        struct mailbox_transaction_context *const *bt, *new_bt;
        unsigned int i, count;
 
@@ -30,7 +30,8 @@ virtual_transaction_begin(struct mailbox *box,
                          enum mailbox_transaction_flags flags,
                          const char *reason)
 {
-       struct virtual_mailbox *mbox = (struct virtual_mailbox *)box;
+       struct virtual_mailbox *mbox =
+               container_of(box, struct virtual_mailbox, box);
        struct virtual_transaction_context *vt;
 
        vt = i_new(struct virtual_transaction_context, 1);
@@ -44,7 +45,7 @@ int virtual_transaction_commit(struct mailbox_transaction_context *t,
                               struct mail_transaction_commit_changes *changes_r)
 {
        struct virtual_transaction_context *vt =
-               (struct virtual_transaction_context *)t;
+               container_of(t, struct virtual_transaction_context, t);
        struct mailbox_transaction_context **bt;
        unsigned int i, count;
        int ret = 0;
@@ -69,7 +70,7 @@ int virtual_transaction_commit(struct mailbox_transaction_context *t,
 void virtual_transaction_rollback(struct mailbox_transaction_context *t)
 {
        struct virtual_transaction_context *vt =
-               (struct virtual_transaction_context *)t;
+               container_of(t, struct virtual_transaction_context, t);
        struct mailbox_transaction_context **bt;
        unsigned int i, count;