Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3329565imu; Sun, 11 Nov 2018 12:30:31 -0800 (PST) X-Google-Smtp-Source: AJdET5f7YHNl+ype4JNPTKWmH3/lpcxAXib3WhAbXUbFGO720adTzkGKH2TFCky3h3OlSj2fhswr X-Received: by 2002:a63:235f:: with SMTP id u31mr14934867pgm.122.1541968231797; Sun, 11 Nov 2018 12:30:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541968231; cv=none; d=google.com; s=arc-20160816; b=jQOs/S61xRsAELKoqNYx2IXdvLJ+v7twci4E9fRbMLko4+cEtSTt4A+8TIuXPexjnK MSjfsx6Sg+EfElOR2scJWyoRUZUfm8RTT6UHb0IbgXSzxUmNmsIrXaud+/abHP7rANcl BDPSpORIcwcJdjnJlED7jlNTedYIYJlt/dNnDeMnpmYh+sYG/7HojospIsDz1gvXxPPu OnNWobBMptQv4Vysq5jq3yTLcv+Xv1hVGlYXGsEwy2o/Zrhg4FormsjbP7s2jf5d5kYo VCfUtAa8FS9wyeRqA9NhA1o5pjWHQ03ZhE4XgJxL6FuENwngAabi59C5p2OhBhXBhj8R 8r7w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:subject:message-id:date:cc:to :from:mime-version:content-transfer-encoding:content-disposition; bh=ZsUwHjbqMkf5tWdW4W6VUzYBI2+AuzKlng7xQZmkCpw=; b=KrKDQKaLMpbdLlGkPIcGk1d77Ak5lm1CDnQKW+Azt8tSKPg/peqNasDqGIN4M65JJ/ fgghYN9oPH8Q0P/dT1epQRpjy6Zno2iIib/fTb1acDoB92CZlLGHyVFPw4PNgqWR3vYv oZ+ljpZwIgMy0CnMCgDoY8kLV4q63LjCl2VkTrwLrjzwm2Hu4AXwRl+pssPtDNuebwne Q3nTYvkQZpXQu30etx6n0Omr9HynrqofWQ/wPkdrULkeS/Npma1ek+wsq43hpmLYT6ek M0lRGVVwbKjW4254VqNYO4QdhtDtuJDKRAOhV8Yh9D56F6zl7g9u+DNvjx5flS0B2s7g UqIg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b131si14257524pga.51.2018.11.11.12.30.16; Sun, 11 Nov 2018 12:30:31 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730533AbeKLFsX (ORCPT + 99 others); Mon, 12 Nov 2018 00:48:23 -0500 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:50604 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729628AbeKLFsX (ORCPT ); Mon, 12 Nov 2018 00:48:23 -0500 Received: from [192.168.4.242] (helo=deadeye) by shadbolt.decadent.org.uk with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1gLvsi-0000l9-Nu; Sun, 11 Nov 2018 19:58:52 +0000 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1gLvsZ-0001qK-No; Sun, 11 Nov 2018 19:58:43 +0000 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 From: Ben Hutchings To: linux-kernel@vger.kernel.org, stable@vger.kernel.org CC: akpm@linux-foundation.org, "Jeff Layton" , "Donatas Abraitis" , "Yan, Zheng" , "Bryan Henderson" , "Ilya Dryomov" Date: Sun, 11 Nov 2018 19:49:05 +0000 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) Subject: [PATCH 3.16 326/366] ceph: don't set req->r_locked_dir in ceph_d_revalidate In-Reply-To: X-SA-Exim-Connect-IP: 192.168.4.242 X-SA-Exim-Mail-From: ben@decadent.org.uk X-SA-Exim-Scanned: No (on shadbolt.decadent.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 3.16.61-rc1 review patch. If anyone has any objections, please let me know. ------------------ From: Jeff Layton commit c3f4688a08fd86f1bf8e055724c84b7a40a09733 upstream. This function sets req->r_locked_dir which is supposed to indicate to ceph_fill_trace that the parent's i_rwsem is locked for write. Unfortunately, there is no guarantee that the dir will be locked when d_revalidate is called, so we really don't want ceph_fill_trace to do any dcache manipulation from this context. Clear req->r_locked_dir since it's clearly not safe to do that. What we really want to know with d_revalidate is whether the dentry still points to the same inode. ceph_fill_trace installs a pointer to the inode in req->r_target_inode, so we can just compare that to d_inode(dentry) to see if it's the same one after the lookup. Also, since we aren't generally interested in the parent here, we can switch to using a GETATTR to hint that to the MDS, which also means that we only need to reserve one cap. Finally, just remove the d_unhashed check. That's really outside the purview of a filesystem's d_revalidate. If the thing became unhashed while we're checking it, then that's up to the VFS to handle anyway. Fixes: 200fd27c8fa2 ("ceph: use lookup request to revalidate dentry") Link: http://tracker.ceph.com/issues/18041 Reported-by: Donatas Abraitis Signed-off-by: Jeff Layton Reviewed-by: "Yan, Zheng" Signed-off-by: Ilya Dryomov Cc: Bryan Henderson [bwh: Backported to 3.16: s/d_really_is_(positive|negative)/d_is_\1/ since we don't have to consider overlayfs] Signed-off-by: Ben Hutchings --- fs/ceph/dir.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -1071,26 +1071,30 @@ static int ceph_d_revalidate(struct dent int op, mask, err; op = ceph_snap(dir) == CEPH_SNAPDIR ? - CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP; + CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_GETATTR; req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS); if (!IS_ERR(req)) { req->r_dentry = dget(dentry); - req->r_num_caps = 2; + req->r_num_caps = op == CEPH_MDS_OP_GETATTR ? 1 : 2; mask = CEPH_STAT_CAP_INODE | CEPH_CAP_AUTH_SHARED; if (ceph_security_xattr_wanted(dir)) mask |= CEPH_CAP_XATTR_SHARED; req->r_args.getattr.mask = mask; - req->r_locked_dir = dir; err = ceph_mdsc_do_request(mdsc, NULL, req); - if (err == 0 || err == -ENOENT) { - if (dentry == req->r_dentry) { - valid = !d_unhashed(dentry); - } else { - d_invalidate(req->r_dentry); - err = -EAGAIN; - } + switch (err) { + case 0: + if (d_is_positive(dentry) && + d_inode(dentry) == req->r_target_inode) + valid = 1; + break; + case -ENOENT: + if (d_is_negative(dentry)) + valid = 1; + /* Fallthrough */ + default: + break; } ceph_mdsc_put_request(req); dout("d_revalidate %p lookup result=%d\n",