From patchwork Mon Jan 30 12:10:52 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kurz X-Patchwork-Id: 721426 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3vBpWS25jvz9s3T for ; Mon, 30 Jan 2017 23:25:24 +1100 (AEDT) Received: from localhost ([::1]:59934 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cYB1N-0001p4-Nz for incoming@patchwork.ozlabs.org; Mon, 30 Jan 2017 07:25:21 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45633) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cYAnY-0005Cs-EV for qemu-devel@nongnu.org; Mon, 30 Jan 2017 07:11:05 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cYAnV-00009l-BK for qemu-devel@nongnu.org; Mon, 30 Jan 2017 07:11:04 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:40191) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cYAnV-00009W-1i for qemu-devel@nongnu.org; Mon, 30 Jan 2017 07:11:01 -0500 Received: from pps.filterd (m0098394.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.20/8.16.0.20) with SMTP id v0UC8fEH003566 for ; Mon, 30 Jan 2017 07:11:00 -0500 Received: from e38.co.us.ibm.com (e38.co.us.ibm.com [32.97.110.159]) by mx0a-001b2d01.pphosted.com with ESMTP id 28a2r8xgrv-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Mon, 30 Jan 2017 07:10:59 -0500 Received: from localhost by e38.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 30 Jan 2017 05:10:58 -0700 Received: from d03dlp02.boulder.ibm.com (9.17.202.178) by e38.co.us.ibm.com (192.168.1.138) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 30 Jan 2017 05:10:55 -0700 Received: from b03cxnp08026.gho.boulder.ibm.com (b03cxnp08026.gho.boulder.ibm.com [9.17.130.18]) by d03dlp02.boulder.ibm.com (Postfix) with ESMTP id 43E3B3E40048; Mon, 30 Jan 2017 05:10:55 -0700 (MST) Received: from b03ledav003.gho.boulder.ibm.com (b03ledav003.gho.boulder.ibm.com [9.17.130.234]) by b03cxnp08026.gho.boulder.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id v0UCA8bJ11272494; Mon, 30 Jan 2017 05:10:55 -0700 Received: from b03ledav003.gho.boulder.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1F88D6A03B; Mon, 30 Jan 2017 05:10:55 -0700 (MST) Received: from bahia.lan (unknown [9.164.157.254]) by b03ledav003.gho.boulder.ibm.com (Postfix) with ESMTP id 5052F6A042; Mon, 30 Jan 2017 05:10:53 -0700 (MST) From: Greg Kurz To: qemu-devel@nongnu.org Date: Mon, 30 Jan 2017 13:10:52 +0100 In-Reply-To: <148577817618.10533.9740628265078537215.stgit@bahia.lan> References: <148577817618.10533.9740628265078537215.stgit@bahia.lan> User-Agent: StGit/0.17.1-20-gc0b1b-dirty MIME-Version: 1.0 X-TM-AS-GCONF: 00 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 17013012-0028-0000-0000-000006E96F2F X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00006524; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000201; SDB=6.00814714; UDB=6.00397662; IPR=6.00592156; BA=6.00005099; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00014105; XFM=3.00000011; UTC=2017-01-30 12:10:57 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17013012-0029-0000-0000-000033247801 Message-Id: <148577825207.10533.10471571079961535708.stgit@bahia.lan> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-01-30_08:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=3 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1612050000 definitions=main-1701300122 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [generic] [fuzzy] X-Received-From: 148.163.156.1 Subject: [Qemu-devel] [PATCH RFC 10/36] v9fs: local: improve error handling in rename op X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "Aneesh Kumar K.V" , jannh@google.com, Greg Kurz , ppandit@redhat.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" When using the mapped-file security model, we also have to rename the metadata file if it exists. In case of failure, we should rollback. To achieve that, this patch moves the renaming of the main file before the renaming of the metadata file. Signed-off-by: Greg Kurz --- hw/9pfs/9p-local.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/hw/9pfs/9p-local.c b/hw/9pfs/9p-local.c index ebc3e208efa0..df453414c902 100644 --- a/hw/9pfs/9p-local.c +++ b/hw/9pfs/9p-local.c @@ -1192,26 +1192,39 @@ static int local_rename(FsContext *ctx, const char *oldpath, { int err; char *buffer, *buffer1; + int serrno; + + buffer = rpath(ctx, oldpath); + buffer1 = rpath(ctx, newpath); + err = rename(buffer, buffer1); + if (err < 0) { + goto out; + } if (ctx->export_flags & V9FS_SM_MAPPED_FILE) { + char *vbuffer, *vbuffer1; + err = local_create_mapped_attr_dir(ctx, newpath); if (err < 0) { - return err; + goto out_err; } /* rename the .virtfs_metadata files */ - buffer = local_mapped_attr_path(ctx, oldpath); - buffer1 = local_mapped_attr_path(ctx, newpath); - err = rename(buffer, buffer1); - g_free(buffer); - g_free(buffer1); + vbuffer = local_mapped_attr_path(ctx, oldpath); + vbuffer1 = local_mapped_attr_path(ctx, newpath); + err = rename(vbuffer, vbuffer1); + g_free(vbuffer); + g_free(vbuffer1); if (err < 0 && errno != ENOENT) { - return err; + goto err_out; } } + goto out; - buffer = rpath(ctx, oldpath); - buffer1 = rpath(ctx, newpath); - err = rename(buffer, buffer1); +err_out: + serrno = errno; + rename(buffer1, buffer); + errno = serrno; +out: g_free(buffer); g_free(buffer1); return err;