From patchwork Fri Jun 3 17:37:22 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Adamson X-Patchwork-Id: 848292 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p53KGsm1016319 for ; Fri, 3 Jun 2011 20:16:54 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751876Ab1FCUQx (ORCPT ); Fri, 3 Jun 2011 16:16:53 -0400 Received: from mx2.netapp.com ([216.240.18.37]:31100 "EHLO mx2.netapp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751589Ab1FCUQx (ORCPT ); Fri, 3 Jun 2011 16:16:53 -0400 X-IronPort-AV: E=Sophos;i="4.65,315,1304319600"; d="scan'208";a="552945710" Received: from smtp1.corp.netapp.com ([10.57.156.124]) by mx2-out.netapp.com with ESMTP; 03 Jun 2011 13:16:52 -0700 Received: from localhost.localdomain (laino1-lxp.hq.netapp.com [10.58.48.170]) by smtp1.corp.netapp.com (8.13.1/8.13.1/NTAP-1.6) with ESMTP id p53KGq6S023501; Fri, 3 Jun 2011 13:16:52 -0700 (PDT) From: andros@netapp.com To: trond.myklebust@netapp.com Cc: linux-nfs@vger.kernel.org, Andy Adamson Subject: [PATCH Version 3 1/1] NFSv4.1: allow nfs_fhget to succeed with mounted on fileid Date: Fri, 3 Jun 2011 13:37:22 -0400 Message-Id: <1307122642-2695-1-git-send-email-andros@netapp.com> X-Mailer: git-send-email 1.6.6 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Fri, 03 Jun 2011 20:16:54 +0000 (UTC) From: Andy Adamson Commit 28331a46d88459788c8fca72dbb0415cd7f514c9 "Ensure we request the ordinary fileid when doing readdirplus" changed the meaning of NFS_ATTR_FATTR_FILEID which used to be set when FATTR4_WORD1_MOUNTED_ON_FILED was requested. Allow nfs_fhget to succeed with only a mounted on fileid when crossing a mountpoint or a referral. Signed-off-by: Andy Adamson --- fs/nfs/inode.c | 4 +++- fs/nfs/internal.h | 7 +++++++ fs/nfs/nfs4proc.c | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 144f2a3..06b40e3 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -256,7 +256,9 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) nfs_attr_check_mountpoint(sb, fattr); - if ((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0 && (fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) + if (((fattr->valid & NFS_ATTR_FATTR_FILEID) == 0 && + (fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) && + nfs_attr_check_mounted_on_fileid(fattr)) goto out_no_inode; if ((fattr->valid & NFS_ATTR_FATTR_TYPE) == 0) goto out_no_inode; diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index b9056cb..da0a52e 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -45,6 +45,13 @@ static inline void nfs_attr_check_mountpoint(struct super_block *parent, struct fattr->valid |= NFS_ATTR_FATTR_MOUNTPOINT; } +static inline int nfs_attr_check_mounted_on_fileid(struct nfs_fattr *fattr) +{ + return (((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) == 0) || + (((fattr->valid & NFS_ATTR_FATTR_MOUNTPOINT) == 0) && + ((fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL) == 0))); +} + struct nfs_clone_mount { const struct super_block *sb; const struct dentry *dentry; diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index d2c4b59..49142f3 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -4669,7 +4669,7 @@ static size_t nfs4_xattr_list_nfs4_acl(struct dentry *dentry, char *list, static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr) { - if (!((fattr->valid & NFS_ATTR_FATTR_FILEID) && + if (!((fattr->valid & NFS_ATTR_FATTR_MOUNTED_ON_FILEID) && (fattr->valid & NFS_ATTR_FATTR_FSID) && (fattr->valid & NFS_ATTR_FATTR_V4_REFERRAL))) return; @@ -4678,6 +4678,7 @@ static void nfs_fixup_referral_attributes(struct nfs_fattr *fattr) NFS_ATTR_FATTR_NLINK; fattr->mode = S_IFDIR | S_IRUGO | S_IXUGO; fattr->nlink = 2; + fattr->fileid = fattr->mounted_on_fileid; } int nfs4_proc_fs_locations(struct inode *dir, const struct qstr *name,