Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp417828ybt; Fri, 10 Jul 2020 03:16:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyA3GdHT5VayiDnJSkzrZbb5D/2e3dO9XZ1atS0Iv51gg4L03hibW5f0S10MNt1j/HUdjO2 X-Received: by 2002:aa7:c4d1:: with SMTP id p17mr48255947edr.268.1594376210087; Fri, 10 Jul 2020 03:16:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1594376210; cv=none; d=google.com; s=arc-20160816; b=n0O4MlTXi5Uznb0rJfY2Gpfi8kCcqnPeP9FHuS/2mdoAWqMDU/GCwD2iQVliMxibG6 n331k0IkyQWyoqEz0R2g1AJTDSuT2qKtcif5R7hr4PCHi0beQn11kVgeN07mPNTF49zU BSQjKC1Jioqh28rls5G2oFrZIQUGiINfdBBZ5jtjqKhfJFJe9zB/KRKkFipzZuLecaV6 Dyp/tnYRkAjGKSzRpsqIPnBN7HRrSBJf/O+Fu/E+oF/rRejSvzmSQaWIkWmG7a0Id8Lm mkZwrD9wttFg7Cceo0mocBsqXnlRAM9PCi0a5wKecbZSEcNs+Cd972WJO2nEyQOYrL2o zjHw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from; bh=xEWeOmiRcNZxDMo4w56xaQpcnFr17PiLtiCDZ6VQFCM=; b=dZ02Ll5hYfyZBgI/OEaoxInptEwKy4AR+Vcw061ThXHhsJXeDzrHVtQZVTy9b7mI9X WDZQN7fmWCrcqV7W+fSQNR8MOv79nsiMhvJ9wZdm96HaFOc0/w2JjoJL5OAdwFg84K6p 0Cy52J5LVxzya+2NUOnKe2TEDt4x1MmElxt+L1j/RqibYJQAHnRgjjT11JBqDTR1z9PY 1p9x9qvEchS08DlcjPubuwGX2R3fzZSialKJCj1MwSQ/RML5EZML0ncnIjEsuOefF5aV OY1FnM92VTyTVgYWzTbE5tOgBZ8SwU/Grn5T6J1lFHtYmspG+Ea036vquv+LubkvIjdk v47Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y97si4009765ede.234.2020.07.10.03.16.25; Fri, 10 Jul 2020 03:16:50 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726816AbgGJKQB (ORCPT + 99 others); Fri, 10 Jul 2020 06:16:01 -0400 Received: from foss.arm.com ([217.140.110.172]:37054 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726496AbgGJKQA (ORCPT ); Fri, 10 Jul 2020 06:16:00 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1304A31B; Fri, 10 Jul 2020 03:16:00 -0700 (PDT) Received: from entos-d05.shanghai.arm.com (entos-d05.shanghai.arm.com [10.169.212.212]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id E9F513F9AB; Fri, 10 Jul 2020 03:15:56 -0700 (PDT) From: Jianyong Wu To: ericvh@gmail.com, lucho@ionkov.net, asmadeus@codewreck.org, v9fs-developer@lists.sourceforge.net Cc: linux-kernel@vger.kernel.org, Steve.Capper@arm.com, Kaly.Xin@arm.com, justin.he@arm.com, jianyong.wu@arm.com, wei.chen@arm.com Subject: [PATCH v4] 9p: retrieve fid from file when file instance exist. Date: Fri, 10 Jul 2020 18:15:48 +0800 Message-Id: <20200710101548.10108-1-jianyong.wu@arm.com> X-Mailer: git-send-email 2.17.1 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In the current setattr implementation in 9p, fid is always retrieved from dentry no matter file instance exists or not. If so, there may be some info related to opened file instance dropped. So it's better to retrieve fid from file instance when it is passed to setattr. for example: fd=open("tmp", O_RDWR); ftruncate(fd, 10); The file context related with the fd will be lost as fid is always retrieved from dentry, then the backend can't get the info of file context. It is against the original intention of user and may lead to bug. Signed-off-by: Jianyong Wu --- fs/9p/vfs_inode.c | 9 +++++++-- fs/9p/vfs_inode_dotl.c | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index c9255d399917..cd004dee2214 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -1090,7 +1090,7 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr) { int retval; struct v9fs_session_info *v9ses; - struct p9_fid *fid; + struct p9_fid *fid = NULL; struct p9_wstat wstat; p9_debug(P9_DEBUG_VFS, "\n"); @@ -1100,7 +1100,12 @@ static int v9fs_vfs_setattr(struct dentry *dentry, struct iattr *iattr) retval = -EPERM; v9ses = v9fs_dentry2v9ses(dentry); - fid = v9fs_fid_lookup(dentry); + if (iattr->ia_valid & ATTR_FILE) { + fid = iattr->ia_file->private_data; + WARN_ON(!fid); + } + if (!fid) + fid = v9fs_fid_lookup(dentry); if(IS_ERR(fid)) return PTR_ERR(fid); diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 60328b21c5fb..0028eccb665a 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c @@ -540,7 +540,7 @@ static int v9fs_mapped_iattr_valid(int iattr_valid) int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr) { int retval; - struct p9_fid *fid; + struct p9_fid *fid = NULL; struct p9_iattr_dotl p9attr; struct inode *inode = d_inode(dentry); @@ -560,7 +560,12 @@ int v9fs_vfs_setattr_dotl(struct dentry *dentry, struct iattr *iattr) p9attr.mtime_sec = iattr->ia_mtime.tv_sec; p9attr.mtime_nsec = iattr->ia_mtime.tv_nsec; - fid = v9fs_fid_lookup(dentry); + if (iattr->ia_valid & ATTR_FILE) { + fid = iattr->ia_file->private_data; + WARN_ON(!fid); + } + if (!fid) + fid = v9fs_fid_lookup(dentry); if (IS_ERR(fid)) return PTR_ERR(fid); -- 2.17.1