Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a9a4a87a authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Use the inode->i_version to cache NFSv4 change attribute information

parent 919066d6
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -240,7 +240,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct
			sizeof(delegation->stateid.data));
			sizeof(delegation->stateid.data));
	delegation->type = res->delegation_type;
	delegation->type = res->delegation_type;
	delegation->maxsize = res->maxsize;
	delegation->maxsize = res->maxsize;
	delegation->change_attr = nfsi->change_attr;
	delegation->change_attr = inode->i_version;
	delegation->cred = get_rpccred(cred);
	delegation->cred = get_rpccred(cred);
	delegation->inode = inode;
	delegation->inode = inode;
	delegation->flags = 1<<NFS_DELEGATION_REFERENCED;
	delegation->flags = 1<<NFS_DELEGATION_REFERENCED;
+2 −2
Original line number Original line Diff line number Diff line
@@ -212,7 +212,7 @@ static uint16_t nfs_fscache_inode_get_aux(const void *cookie_netfs_data,
	auxdata.ctime = nfsi->vfs_inode.i_ctime;
	auxdata.ctime = nfsi->vfs_inode.i_ctime;


	if (NFS_SERVER(&nfsi->vfs_inode)->nfs_client->rpc_ops->version == 4)
	if (NFS_SERVER(&nfsi->vfs_inode)->nfs_client->rpc_ops->version == 4)
		auxdata.change_attr = nfsi->change_attr;
		auxdata.change_attr = nfsi->vfs_inode.i_version;


	if (bufmax > sizeof(auxdata))
	if (bufmax > sizeof(auxdata))
		bufmax = sizeof(auxdata);
		bufmax = sizeof(auxdata);
@@ -244,7 +244,7 @@ enum fscache_checkaux nfs_fscache_inode_check_aux(void *cookie_netfs_data,
	auxdata.ctime = nfsi->vfs_inode.i_ctime;
	auxdata.ctime = nfsi->vfs_inode.i_ctime;


	if (NFS_SERVER(&nfsi->vfs_inode)->nfs_client->rpc_ops->version == 4)
	if (NFS_SERVER(&nfsi->vfs_inode)->nfs_client->rpc_ops->version == 4)
		auxdata.change_attr = nfsi->change_attr;
		auxdata.change_attr = nfsi->vfs_inode.i_version;


	if (memcmp(data, &auxdata, datalen) != 0)
	if (memcmp(data, &auxdata, datalen) != 0)
		return FSCACHE_CHECKAUX_OBSOLETE;
		return FSCACHE_CHECKAUX_OBSOLETE;
+8 −8
Original line number Original line Diff line number Diff line
@@ -318,7 +318,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
		memset(&inode->i_atime, 0, sizeof(inode->i_atime));
		memset(&inode->i_atime, 0, sizeof(inode->i_atime));
		memset(&inode->i_mtime, 0, sizeof(inode->i_mtime));
		memset(&inode->i_mtime, 0, sizeof(inode->i_mtime));
		memset(&inode->i_ctime, 0, sizeof(inode->i_ctime));
		memset(&inode->i_ctime, 0, sizeof(inode->i_ctime));
		nfsi->change_attr = 0;
		inode->i_version = 0;
		inode->i_size = 0;
		inode->i_size = 0;
		inode->i_nlink = 0;
		inode->i_nlink = 0;
		inode->i_uid = -2;
		inode->i_uid = -2;
@@ -344,7 +344,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr)
				| NFS_INO_INVALID_ACCESS
				| NFS_INO_INVALID_ACCESS
				| NFS_INO_INVALID_ACL;
				| NFS_INO_INVALID_ACL;
		if (fattr->valid & NFS_ATTR_FATTR_CHANGE)
		if (fattr->valid & NFS_ATTR_FATTR_CHANGE)
			nfsi->change_attr = fattr->change_attr;
			inode->i_version = fattr->change_attr;
		else if (nfs_server_capable(inode, NFS_CAP_CHANGE_ATTR))
		else if (nfs_server_capable(inode, NFS_CAP_CHANGE_ATTR))
			nfsi->cache_validity |= NFS_INO_INVALID_ATTR
			nfsi->cache_validity |= NFS_INO_INVALID_ATTR
				| NFS_INO_INVALID_DATA;
				| NFS_INO_INVALID_DATA;
@@ -897,8 +897,8 @@ static unsigned long nfs_wcc_update_inode(struct inode *inode, struct nfs_fattr


	if ((fattr->valid & NFS_ATTR_FATTR_PRECHANGE)
	if ((fattr->valid & NFS_ATTR_FATTR_PRECHANGE)
			&& (fattr->valid & NFS_ATTR_FATTR_CHANGE)
			&& (fattr->valid & NFS_ATTR_FATTR_CHANGE)
			&& nfsi->change_attr == fattr->pre_change_attr) {
			&& inode->i_version == fattr->pre_change_attr) {
		nfsi->change_attr = fattr->change_attr;
		inode->i_version = fattr->change_attr;
		if (S_ISDIR(inode->i_mode))
		if (S_ISDIR(inode->i_mode))
			nfsi->cache_validity |= NFS_INO_INVALID_DATA;
			nfsi->cache_validity |= NFS_INO_INVALID_DATA;
		ret |= NFS_INO_INVALID_ATTR;
		ret |= NFS_INO_INVALID_ATTR;
@@ -952,7 +952,7 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
		return -EIO;
		return -EIO;


	if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 &&
	if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 &&
			nfsi->change_attr != fattr->change_attr)
			inode->i_version != fattr->change_attr)
		invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
		invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;


	/* Verify a few of the more important attributes */
	/* Verify a few of the more important attributes */
@@ -1163,7 +1163,7 @@ int nfs_post_op_update_inode_force_wcc(struct inode *inode, struct nfs_fattr *fa
	}
	}
	if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 &&
	if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 &&
			(fattr->valid & NFS_ATTR_FATTR_PRECHANGE) == 0) {
			(fattr->valid & NFS_ATTR_FATTR_PRECHANGE) == 0) {
		fattr->pre_change_attr = NFS_I(inode)->change_attr;
		fattr->pre_change_attr = inode->i_version;
		fattr->valid |= NFS_ATTR_FATTR_PRECHANGE;
		fattr->valid |= NFS_ATTR_FATTR_PRECHANGE;
	}
	}
	if ((fattr->valid & NFS_ATTR_FATTR_CTIME) != 0 &&
	if ((fattr->valid & NFS_ATTR_FATTR_CTIME) != 0 &&
@@ -1244,13 +1244,13 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)


	/* More cache consistency checks */
	/* More cache consistency checks */
	if (fattr->valid & NFS_ATTR_FATTR_CHANGE) {
	if (fattr->valid & NFS_ATTR_FATTR_CHANGE) {
		if (nfsi->change_attr != fattr->change_attr) {
		if (inode->i_version != fattr->change_attr) {
			dprintk("NFS: change_attr change on server for file %s/%ld\n",
			dprintk("NFS: change_attr change on server for file %s/%ld\n",
					inode->i_sb->s_id, inode->i_ino);
					inode->i_sb->s_id, inode->i_ino);
			invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
			invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL;
			if (S_ISDIR(inode->i_mode))
			if (S_ISDIR(inode->i_mode))
				nfs_force_lookup_revalidate(inode);
				nfs_force_lookup_revalidate(inode);
			nfsi->change_attr = fattr->change_attr;
			inode->i_version = fattr->change_attr;
		}
		}
	} else if (server->caps & NFS_CAP_CHANGE_ATTR)
	} else if (server->caps & NFS_CAP_CHANGE_ATTR)
		invalid |= save_cache_validity;
		invalid |= save_cache_validity;
+2 −2
Original line number Original line Diff line number Diff line
@@ -753,9 +753,9 @@ static void update_changeattr(struct inode *dir, struct nfs4_change_info *cinfo)


	spin_lock(&dir->i_lock);
	spin_lock(&dir->i_lock);
	nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
	nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA;
	if (!cinfo->atomic || cinfo->before != nfsi->change_attr)
	if (!cinfo->atomic || cinfo->before != dir->i_version)
		nfs_force_lookup_revalidate(dir);
		nfs_force_lookup_revalidate(dir);
	nfsi->change_attr = cinfo->after;
	dir->i_version = cinfo->after;
	spin_unlock(&dir->i_lock);
	spin_unlock(&dir->i_lock);
}
}


+1 −1
Original line number Original line Diff line number Diff line
@@ -390,7 +390,7 @@ static int nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
	error = radix_tree_insert(&nfsi->nfs_page_tree, req->wb_index, req);
	error = radix_tree_insert(&nfsi->nfs_page_tree, req->wb_index, req);
	BUG_ON(error);
	BUG_ON(error);
	if (!nfsi->npages && nfs_have_delegation(inode, FMODE_WRITE))
	if (!nfsi->npages && nfs_have_delegation(inode, FMODE_WRITE))
		nfsi->change_attr++;
		inode->i_version++;
	set_bit(PG_MAPPED, &req->wb_flags);
	set_bit(PG_MAPPED, &req->wb_flags);
	SetPagePrivate(req->wb_page);
	SetPagePrivate(req->wb_page);
	set_page_private(req->wb_page, (unsigned long)req);
	set_page_private(req->wb_page, (unsigned long)req);
Loading