NFS: Store the file system "fsid" value in the NFS super block.
This should enable us to detect if we are crossing a mountpoint in the case where the server is exporting "nohide" mounts. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
8b512d9a88
commit
8b4bdcf899
9 changed files with 30 additions and 15 deletions
|
@ -47,7 +47,6 @@
|
|||
#include <linux/workqueue.h>
|
||||
#include <linux/sunrpc/rpc_pipe_fs.h>
|
||||
|
||||
#include <linux/nfs_fs_sb.h>
|
||||
#include <linux/nfs_fs.h>
|
||||
|
||||
#include <linux/nfs_idmap.h>
|
||||
|
|
|
@ -236,6 +236,7 @@ nfs_get_root(struct super_block *sb, struct nfs_fh *rootfh, struct nfs_fsinfo *f
|
|||
return ERR_PTR(error);
|
||||
}
|
||||
|
||||
server->fsid = fsinfo->fattr->fsid;
|
||||
return nfs_fhget(sb, rootfh, fsinfo->fattr);
|
||||
}
|
||||
|
||||
|
@ -1493,6 +1494,7 @@ out:
|
|||
*/
|
||||
static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
||||
{
|
||||
struct nfs_server *server;
|
||||
struct nfs_inode *nfsi = NFS_I(inode);
|
||||
loff_t cur_isize, new_isize;
|
||||
unsigned int invalid = 0;
|
||||
|
@ -1511,6 +1513,12 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
|
|||
if ((inode->i_mode & S_IFMT) != (fattr->mode & S_IFMT))
|
||||
goto out_changed;
|
||||
|
||||
server = NFS_SERVER(inode);
|
||||
/* Update the fsid if and only if this is the root directory */
|
||||
if (inode == inode->i_sb->s_root->d_inode
|
||||
&& !nfs_fsid_equal(&server->fsid, &fattr->fsid))
|
||||
server->fsid = fattr->fsid;
|
||||
|
||||
/*
|
||||
* Update the read time so we don't revalidate too often.
|
||||
*/
|
||||
|
|
|
@ -131,7 +131,8 @@ xdr_decode_fattr(u32 *p, struct nfs_fattr *fattr)
|
|||
fattr->du.nfs2.blocksize = ntohl(*p++);
|
||||
rdev = ntohl(*p++);
|
||||
fattr->du.nfs2.blocks = ntohl(*p++);
|
||||
fattr->fsid_u.nfs3 = ntohl(*p++);
|
||||
fattr->fsid.major = ntohl(*p++);
|
||||
fattr->fsid.minor = 0;
|
||||
fattr->fileid = ntohl(*p++);
|
||||
p = xdr_decode_time(p, &fattr->atime);
|
||||
p = xdr_decode_time(p, &fattr->mtime);
|
||||
|
|
|
@ -166,7 +166,8 @@ xdr_decode_fattr(u32 *p, struct nfs_fattr *fattr)
|
|||
if (MAJOR(fattr->rdev) != major || MINOR(fattr->rdev) != minor)
|
||||
fattr->rdev = 0;
|
||||
|
||||
p = xdr_decode_hyper(p, &fattr->fsid_u.nfs3);
|
||||
p = xdr_decode_hyper(p, &fattr->fsid.major);
|
||||
fattr->fsid.minor = 0;
|
||||
p = xdr_decode_hyper(p, &fattr->fileid);
|
||||
p = xdr_decode_time3(p, &fattr->atime);
|
||||
p = xdr_decode_time3(p, &fattr->mtime);
|
||||
|
|
|
@ -2217,7 +2217,7 @@ static int decode_attr_symlink_support(struct xdr_stream *xdr, uint32_t *bitmap,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs4_fsid *fsid)
|
||||
static int decode_attr_fsid(struct xdr_stream *xdr, uint32_t *bitmap, struct nfs_fsid *fsid)
|
||||
{
|
||||
uint32_t *p;
|
||||
|
||||
|
@ -2863,7 +2863,7 @@ static int decode_getfattr(struct xdr_stream *xdr, struct nfs_fattr *fattr, cons
|
|||
goto xdr_error;
|
||||
if ((status = decode_attr_size(xdr, bitmap, &fattr->size)) != 0)
|
||||
goto xdr_error;
|
||||
if ((status = decode_attr_fsid(xdr, bitmap, &fattr->fsid_u.nfs4)) != 0)
|
||||
if ((status = decode_attr_fsid(xdr, bitmap, &fattr->fsid)) != 0)
|
||||
goto xdr_error;
|
||||
if ((status = decode_attr_fileid(xdr, bitmap, &fattr->fileid)) != 0)
|
||||
goto xdr_error;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue