Commit 518f375c authored by Jeff Layton's avatar Jeff Layton Committed by Chuck Lever
Browse files

nfsd: don't provide pre/post-op attrs if fh_getattr fails



nfsd calls fh_getattr to get the latest inode attrs for pre/post-op
info. In the event that fh_getattr fails, it resorts to scraping cached
values out of the inode directly.

Since these attributes are optional, we can just skip providing them
altogether when this happens.

Signed-off-by: default avatarJeff Layton <jlayton@kernel.org>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Reviewed-by: default avatarNeil Brown <neilb@suse.de>
parent df56b384
Loading
Loading
Loading
Loading
+7 −19
Original line number Diff line number Diff line
@@ -623,16 +623,9 @@ void fh_fill_pre_attrs(struct svc_fh *fhp)

	inode = d_inode(fhp->fh_dentry);
	err = fh_getattr(fhp, &stat);
	if (err) {
		/* Grab the times from inode anyway */
		stat.mtime = inode->i_mtime;
		stat.ctime = inode->i_ctime;
		stat.size  = inode->i_size;
		if (v4 && IS_I_VERSION(inode)) {
			stat.change_cookie = inode_query_iversion(inode);
			stat.result_mask |= STATX_CHANGE_COOKIE;
		}
	}
	if (err)
		return;

	if (v4)
		fhp->fh_pre_change = nfsd4_change_attribute(&stat, inode);

@@ -660,14 +653,9 @@ void fh_fill_post_attrs(struct svc_fh *fhp)
		printk("nfsd: inode locked twice during operation.\n");

	err = fh_getattr(fhp, &fhp->fh_post_attr);
	if (err) {
		fhp->fh_post_saved = false;
		fhp->fh_post_attr.ctime = inode->i_ctime;
		if (v4 && IS_I_VERSION(inode)) {
			fhp->fh_post_attr.change_cookie = inode_query_iversion(inode);
			fhp->fh_post_attr.result_mask |= STATX_CHANGE_COOKIE;
		}
	} else
	if (err)
		return;

	fhp->fh_post_saved = true;
	if (v4)
		fhp->fh_post_change =