From patchwork Sun Jun 17 00:56:48 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keno Fischer X-Patchwork-Id: 930434 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=juliacomputing.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=juliacomputing-com.20150623.gappssmtp.com header.i=@juliacomputing-com.20150623.gappssmtp.com header.b="tcUC6G9Y"; dkim-atps=neutral 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 417bc96pXmz9s29 for ; Sun, 17 Jun 2018 11:04:57 +1000 (AEST) Received: from localhost ([::1]:53388 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fUM7j-0002Kk-Gg for incoming@patchwork.ozlabs.org; Sat, 16 Jun 2018 21:04:55 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56787) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fUM0R-0005h9-Mk for qemu-devel@nongnu.org; Sat, 16 Jun 2018 20:57:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fUM0Q-0003FO-Cq for qemu-devel@nongnu.org; Sat, 16 Jun 2018 20:57:23 -0400 Received: from mail-qk0-x243.google.com ([2607:f8b0:400d:c09::243]:40486) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fUM0Q-0003FJ-7q for qemu-devel@nongnu.org; Sat, 16 Jun 2018 20:57:22 -0400 Received: by mail-qk0-x243.google.com with SMTP id r66-v6so7667766qkr.7 for ; Sat, 16 Jun 2018 17:57:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=juliacomputing-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; bh=iHYdMVdKbYIX0TzYjHw3lSfvTsIARHO4irsE2aq/rLk=; b=tcUC6G9Y//J/OGBn9G9yEex8gHbLq7pLqRx4UEqmBLax5FAXa5/2M1C0lzMIZoGCFM Ye/oS1Y2821dL6p4YkrO/U/WkxLHEzZvk7hYo8aFUOzqmBB8MV0eK4ZBOv2gROA4dwAP nhy5nKwq8zoF6QjFZRHnDyD51ZNGRlMkLeMEkgzp0KDiq7ECxKPVb7EcPKERXkbVyfCo 7HTTUF51NPPoza3Mo96/JOJJcb2/wVOUfa0mY+4UubwL7u0M2bJzFrkiNHjM/bubFVZz 2pGoa/+F0eas5XWJyAlKJzyNEB8pT427VSa8GuK1L/4ONLkA4TIpdO4X76SzZrY8Rjaz vYpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=iHYdMVdKbYIX0TzYjHw3lSfvTsIARHO4irsE2aq/rLk=; b=s//YxanC0jSzW6FDkvhjbZGfSd7uU2vdy228Sc8yYK3W93kOOTDM/18lkHwq301cyB koEr7dxN5rjkJ6pbAXFulPcnTY2uh6C9ENE6bYx3h/UyEX79amlUQxxvHKokcuc+s3q1 vxV+KrlWkOoQ/mtcml33yH9O3he1cZ7PUrXP9KcMoKH7xRavCMMuqYGFOPXQ6Bs80/R8 U27gMQwqYVkYRNooWx9MIdIS3TzxNZ3L+KsFn3bgwmvHZKZ0tbQHJ5+QgJPiEAXdeNoW Km3fr2mFkkX81YvfkMjXWStwdPwJNDQ72ZJSGDjCk1aoEWvdktJ9uIPn6r6o9kjKPg6q efOQ== X-Gm-Message-State: APt69E26QJXT8OQRRj0p8eaaGwVcdcvp5vTbKRAfSwM1rpMAcAFDwCEY xtuNKcxK5g7cwEbwTYgJbELxtdVJoWc= X-Google-Smtp-Source: ADUXVKLvvBhKnMcCf58EE5ZaDPP4fCU60wlQn7OIy6xPyYjAGBcysukTjAECmF/jxNtFLbKjZQWA2g== X-Received: by 2002:a37:9d13:: with SMTP id g19-v6mr5899213qke.217.1529197041419; Sat, 16 Jun 2018 17:57:21 -0700 (PDT) Received: from localhost.localdomain (96-86-104-61-static.hfc.comcastbusiness.net. [96.86.104.61]) by smtp.gmail.com with ESMTPSA id x21-v6sm7302186qto.2.2018.06.16.17.57.20 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 16 Jun 2018 17:57:20 -0700 (PDT) From: Keno Fischer To: qemu-devel@nongnu.org Date: Sat, 16 Jun 2018 20:56:48 -0400 Message-Id: <7d1009b3e1f8c1ee7a5c7bf1fa71282d0345010c.1529196703.git.keno@juliacomputing.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: References: In-Reply-To: References: X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c09::243 Subject: [Qemu-devel] [PATCH v3 04/13] 9p: darwin: Handle struct dirent differences 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: Keno Fischer , groug@kaod.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" On darwin d_seekoff exists, but is optional and does not seem to be commonly used by file systems. Use `telldir` instead to obtain the seek offset. Signed-off-by: Keno Fischer --- hw/9pfs/9p-synth.c | 2 ++ hw/9pfs/9p.c | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/hw/9pfs/9p-synth.c b/hw/9pfs/9p-synth.c index eb68b42..a312f8c 100644 --- a/hw/9pfs/9p-synth.c +++ b/hw/9pfs/9p-synth.c @@ -221,7 +221,9 @@ static void synth_direntry(V9fsSynthNode *node, { strcpy(entry->d_name, node->name); entry->d_ino = node->attr->inode; +#ifndef CONFIG_DARWIN entry->d_off = off + 1; +#endif } static struct dirent *synth_get_dentry(V9fsSynthNode *dir, diff --git a/hw/9pfs/9p.c b/hw/9pfs/9p.c index 8e6b908..06139c9 100644 --- a/hw/9pfs/9p.c +++ b/hw/9pfs/9p.c @@ -1738,6 +1738,25 @@ static int v9fs_xattr_read(V9fsState *s, V9fsPDU *pdu, V9fsFidState *fidp, return offset; } +/** + * Get the seek offset of a dirent. If not available from the structure itself, + * obtain it by calling telldir. + */ +static int v9fs_dent_telldir(V9fsPDU *pdu, V9fsFidState *fidp, + struct dirent *dent) +{ +#ifdef CONFIG_DARWIN + /* + * Darwin has d_seekoff, which appears to function similarly to d_off. + * However, it does not appear to be supported on all file systems, + * so use telldir for correctness. + */ + return v9fs_co_telldir(pdu, fidp); +#else + return dent->d_off; +#endif +} + static int coroutine_fn v9fs_do_readdir_with_stat(V9fsPDU *pdu, V9fsFidState *fidp, uint32_t max_count) @@ -1801,7 +1820,11 @@ static int coroutine_fn v9fs_do_readdir_with_stat(V9fsPDU *pdu, count += len; v9fs_stat_free(&v9stat); v9fs_path_free(&path); - saved_dir_pos = dent->d_off; + saved_dir_pos = v9fs_dent_telldir(pdu, fidp, dent); + if (saved_dir_pos < 0) { + err = saved_dir_pos; + break; + } } v9fs_readdir_unlock(&fidp->fs.dir); @@ -1915,7 +1938,7 @@ static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu, V9fsFidState *fidp, V9fsString name; int len, err = 0; int32_t count = 0; - off_t saved_dir_pos; + off_t saved_dir_pos, off; struct dirent *dent; /* save the directory position */ @@ -1951,10 +1974,15 @@ static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu, V9fsFidState *fidp, /* Fill the other fields with dummy values */ qid.type = 0; qid.version = 0; + off = v9fs_dent_telldir(pdu, fidp, dent); + if (off < 0) { + err = off; + break; + } /* 11 = 7 + 4 (7 = start offset, 4 = space for storing count) */ len = pdu_marshal(pdu, 11 + count, "Qqbs", - &qid, dent->d_off, + &qid, off, dent->d_type, &name); v9fs_readdir_unlock(&fidp->fs.dir); @@ -1966,7 +1994,7 @@ static int coroutine_fn v9fs_do_readdir(V9fsPDU *pdu, V9fsFidState *fidp, } count += len; v9fs_string_free(&name); - saved_dir_pos = dent->d_off; + saved_dir_pos = off; } v9fs_readdir_unlock(&fidp->fs.dir);