From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40986) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c6L7T-0001Zz-Fl for qemu-devel@nongnu.org; Mon, 14 Nov 2016 12:32:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c6L7Q-0006Zq-5u for qemu-devel@nongnu.org; Mon, 14 Nov 2016 12:32:35 -0500 Received: from 1.mo53.mail-out.ovh.net ([178.32.108.164]:55871) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c6L7Q-0006ZO-0J for qemu-devel@nongnu.org; Mon, 14 Nov 2016 12:32:32 -0500 Received: from player158.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo53.mail-out.ovh.net (Postfix) with ESMTP id A29BB42CA0 for ; Mon, 14 Nov 2016 18:32:30 +0100 (CET) Date: Mon, 14 Nov 2016 18:32:26 +0100 From: Greg Kurz Message-ID: <20161114183226.0f3d4461@bahia> In-Reply-To: <5829af0b.84f4420a.a436f.4a6d@mx.google.com> References: <1479126778-125867-1-git-send-email-Qiang(liqiang6-s@360.cn)> <5829af0b.84f4420a.a436f.4a6d@mx.google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 1/3] 9pfs: add cleanup operation in FileOperations List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Li Qiang Cc: qemu-devel@nongnu.org, liqiang6-s@360.cn On Mon, 14 Nov 2016 07:32:56 -0500 Li Qiang wrote: > From: Li Qiang > > Currently, the backend of VirtFS doesn't have a cleanup > function. This will lead resource leak issues if the backed > driver allocates resources. This patch addresses this issue. > > Signed-off-by: Li Qiang > --- > fsdev/file-op-9p.h | 1 + > hw/9pfs/9p.c | 3 +++ > 2 files changed, 4 insertions(+) > > diff --git a/fsdev/file-op-9p.h b/fsdev/file-op-9p.h > index 6db9fea..a56dc84 100644 > --- a/fsdev/file-op-9p.h > +++ b/fsdev/file-op-9p.h > @@ -100,6 +100,7 @@ struct FileOperations > { > int (*parse_opts)(QemuOpts *, struct FsDriverEntry *); > int (*init)(struct FsContext *); > + void (*cleanup)(struct FsContext *); > int (*lstat)(FsContext *, V9fsPath *, struct stat *); > ssize_t (*readlink)(FsContext *, V9fsPath *, char *, size_t); > int (*chmod)(FsContext *, V9fsPath *, FsCred *); > diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c > index aea7e9d..166b5a7 100644 > --- a/hw/9pfs/9p.c > +++ b/hw/9pfs/9p.c > @@ -3532,6 +3532,9 @@ void v9fs_device_unrealize_common(V9fsState *s, Error **errp) > { > g_free(s->ctx.fs_root); > g_free(s->tag); > + if (s->ops->cleanup) { > + s->ops->cleanup(&s->ctx); > + } Unrealize should undo things that were set during realize in reverse order: please move the cleanup stuff above calls to g_free() (which are actually misordered since tag is allocated after fs_root... maybe you can fix that too in a preparatory patch). You also have to call cleanup in the error path of realize if init was called. > } > > typedef struct VirtfsCoResetData {