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

Commit 6dad4d89 authored by Oleg Drokin's avatar Oleg Drokin Committed by Greg Kroah-Hartman
Browse files

staging/lustre/llite: Restore proper opencache operations



Mark dentries that came to us via NFS in a special way so that
we can tell them apart during open and activate open cache
(we really don't want to do open/close RPC for every NFS IO).

This became needed since dentry revlidate no longer reimplements
any RPCs for lookup, and as such if a dentry is valid,
ll_revalidate_dentry returns 1 and ll_lookup_it() is never visited
during opens, we get straght into ll_file_open() without a valid
intent/RPC. This used to be only true for NFS, so opencache was
engaged needlessly, and it carries a cost of it's own if there is
in fact no repetitive file opening-closing going on

Signed-off-by: default avatarOleg Drokin <oleg.drokin@intel.com>
Reviewed-on: http://review.whamcloud.com/20354
Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-8019


Reviewed-by: default avatarAndreas Dilger <andreas.dilger@intel.com>
Reviewed-by: default avatarLi Xi <lixi@ddn.com>
Signed-off-by: default avatarOleg Drokin <green@linuxhacker.ru>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent c681528a
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -399,7 +399,19 @@ static int ll_intent_file_open(struct dentry *dentry, void *lmm,
	 * parameters. No need for the open lock
	 */
	if (!lmm && lmmsize == 0) {
		struct ll_dentry_data *ldd = ll_d2d(dentry);
		/*
		 * If we came via ll_iget_for_nfs, then we need to request
		 * struct ll_dentry_data *ldd = ll_d2d(file->f_dentry);
		 *
		 * NB: when ldd is NULL, it must have come via normal
		 * lookup path only, since ll_iget_for_nfs always calls
		 * ll_d_init().
		 */
		if (ldd && ldd->lld_nfs_dentry) {
			ldd->lld_nfs_dentry = 0;
			itp->it_flags |= MDS_OPEN_LOCK;
		}
		if (itp->it_flags & FMODE_WRITE)
			opc = LUSTRE_OPC_CREATE;
	}
+1 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ struct ll_dentry_data {
	struct lookup_intent		*lld_it;
	unsigned int			lld_sa_generation;
	unsigned int			lld_invalid:1;
	unsigned int			lld_nfs_dentry:1;
	struct rcu_head			lld_rcu_head;
};

+18 −0
Original line number Diff line number Diff line
@@ -168,6 +168,24 @@ ll_iget_for_nfs(struct super_block *sb, struct lu_fid *fid, struct lu_fid *paren

	/* N.B. d_obtain_alias() drops inode ref on error */
	result = d_obtain_alias(inode);
	if (!IS_ERR(result)) {
		int rc;

		rc = ll_d_init(result);
		if (rc < 0) {
			dput(result);
			result = ERR_PTR(rc);
		} else {
			struct ll_dentry_data *ldd = ll_d2d(result);

			/*
			 * Need to signal to the ll_intent_file_open that
			 * we came from NFS and so opencache needs to be
			 * enabled for this one
			 */
			ldd->lld_nfs_dentry = 1;
		}
	}

	return result;
}