Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3327996imu; Sun, 11 Nov 2018 12:28:33 -0800 (PST) X-Google-Smtp-Source: AJdET5cbpjGBPK11ghH5OTMbAf1KnQGHeIUbGp1CpTb37KgpiKArLQtoXKZh0gYVZKPRPk7o0Ru3 X-Received: by 2002:a63:6ecf:: with SMTP id j198mr4216021pgc.3.1541968113333; Sun, 11 Nov 2018 12:28:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1541968113; cv=none; d=google.com; s=arc-20160816; b=JoDccT+sv2lmLeB9Ru5YB4w08Z/vHsJ0R80sGkOxkdCr0HX1x8QraPwfSLEjvLRsUl SBIgEWSz0wTmSiigUKBzmzC4h7xI1rTG1/3WOD5XvEcPjUVBiL74gNspfMLvNvxvBOwa 5DLloCwfOrFyQqvf3PJqBs1FFxXW2Z+l7RLqQRYYA2NL+E/wcMExa+FTg0052+k32naI dtovgbdPGfUU3xxw80E/fz0MwioOWN+LBJV1v2NMX8+5r4fEwPP2xjJKzX6v43//3tnq C+e4ExmmKwtcFoNFApg1x+zPjIb0rMvygFJ649ePKir2hGUm4q4+OYrnRyFm3AB31gvL GdXg== 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=ZD98badWM2OalkIXQJm7Yr+5eh5JSYU0nV17WsLcfOs=; b=rsbmXYiktrT1hy6JlOokSzQl3VGMz0COc7IR+FJyLPVn7Mdiwvd6FNMbq1n8zEJxmO /8TrjDqwuQdguQsXctgQ36+9UFCCR5ReZCYbvriPaaT3KuzG+3OlX7djd981pTUL+leq 7e7hvAGlClRDNuN/vJkWhad7E0U3W+fpq1P0oyL3dv2FmGOmhAz4pa8Spl+oPrU2Khlp vSdnkk4LIpcgIQ7gYpEfPX/Ir9lL2i/pVBZLZcjqaR6GFUpKBSF5n2RmWHMyVXALrl+z cNpurGcvJL5N9syMqQWl7LqMKTzLPtoDtPlYj47cGZFmKAZfaLj6SSf7kmpqoE6/5pRC nvhw== 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 70-v6si17216812pfz.20.2018.11.11.12.28.18; Sun, 11 Nov 2018 12:28:33 -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 S1730589AbeKLFsY (ORCPT + 99 others); Mon, 12 Nov 2018 00:48:24 -0500 Received: from shadbolt.e.decadent.org.uk ([88.96.1.126]:50704 "EHLO shadbolt.e.decadent.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730488AbeKLFsY (ORCPT ); Mon, 12 Nov 2018 00:48:24 -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 1gLvsk-0000tu-0Y; Sun, 11 Nov 2018 19:58:54 +0000 Received: from ben by deadeye with local (Exim 4.91) (envelope-from ) id 1gLvsZ-0001qF-M6; 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, "Yan, Zheng" , "Bryan Henderson" Date: Sun, 11 Nov 2018 19:49:05 +0000 Message-ID: X-Mailer: LinuxStableQueue (scripts by bwh) Subject: [PATCH 3.16 325/366] ceph: use lookup request to revalidate dentry 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: "Yan, Zheng" commit 200fd27c8fa2ba8bb4529033967b69a7cbfa2c2e upstream. If dentry has no lease, ceph_d_revalidate() previously return 0. This causes VFS to invalidate the dentry and create a new dentry for later lookup. Invalidating a dentry also detach any underneath mount points. So mount point inside cephfs can disapear mystically (even the mount point is not modified by other hosts). The fix is using lookup request to revalidate dentry without lease. This can partly solve the mount points disapear issue (as long as the mount point is not modified by other hosts) Signed-off-by: Yan, Zheng Cc: Bryan Henderson [bwh: Backported to 3.16: Add the ceph_security_xattr_wanted() function] Signed-off-by: Ben Hutchings --- fs/ceph/dir.c | 34 ++++++++++++++++++++++++++++++++++ fs/ceph/inode.c | 1 + 2 files changed, 35 insertions(+) --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -1064,6 +1064,40 @@ static int ceph_d_revalidate(struct dent valid = 1; } + if (!valid) { + struct ceph_mds_client *mdsc = + ceph_sb_to_client(dir->i_sb)->mdsc; + struct ceph_mds_request *req; + int op, mask, err; + + op = ceph_snap(dir) == CEPH_SNAPDIR ? + CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP; + req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS); + if (!IS_ERR(req)) { + req->r_dentry = dget(dentry); + req->r_num_caps = 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; + } + } + ceph_mdsc_put_request(req); + dout("d_revalidate %p lookup result=%d\n", + dentry, err); + } + } + dout("d_revalidate %p %s\n", dentry, valid ? "valid" : "invalid"); if (valid) { ceph_dentry_lru_touch(dentry); --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -1251,6 +1251,7 @@ retry_lookup: dout(" %p links to %p %llx.%llx, not %llx.%llx\n", dn, dn->d_inode, ceph_vinop(dn->d_inode), ceph_vinop(in)); + d_invalidate(dn); have_lease = false; } --- a/fs/ceph/super.h +++ b/fs/ceph/super.h @@ -736,6 +736,15 @@ extern void __ceph_destroy_xattrs(struct extern void __init ceph_xattr_init(void); extern void ceph_xattr_exit(void); +#ifdef CONFIG_SECURITY +extern bool ceph_security_xattr_wanted(struct inode *in); +#else +static inline bool ceph_security_xattr_wanted(struct inode *in) +{ + return false; +} +#endif + /* acl.c */ extern const struct xattr_handler *ceph_xattr_handlers[]; --- a/fs/ceph/xattr.c +++ b/fs/ceph/xattr.c @@ -1128,3 +1128,10 @@ int ceph_removexattr(struct dentry *dent return __ceph_removexattr(dentry, name); } + +#ifdef CONFIG_SECURITY +bool ceph_security_xattr_wanted(struct inode *in) +{ + return in->i_security != NULL; +} +#endif