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: Oleg 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: Andreas Dilger <andreas.dilger@intel.com> Reviewed-by: Li Xi <lixi@ddn.com> Signed-off-by: Oleg Drokin <green@linuxhacker.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
c681528a2b
commit
6dad4d8903
|
@ -399,7 +399,19 @@ static int ll_intent_file_open(struct dentry *dentry, void *lmm,
|
||||||
* parameters. No need for the open lock
|
* parameters. No need for the open lock
|
||||||
*/
|
*/
|
||||||
if (!lmm && lmmsize == 0) {
|
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;
|
itp->it_flags |= MDS_OPEN_LOCK;
|
||||||
|
}
|
||||||
if (itp->it_flags & FMODE_WRITE)
|
if (itp->it_flags & FMODE_WRITE)
|
||||||
opc = LUSTRE_OPC_CREATE;
|
opc = LUSTRE_OPC_CREATE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,6 +64,7 @@ struct ll_dentry_data {
|
||||||
struct lookup_intent *lld_it;
|
struct lookup_intent *lld_it;
|
||||||
unsigned int lld_sa_generation;
|
unsigned int lld_sa_generation;
|
||||||
unsigned int lld_invalid:1;
|
unsigned int lld_invalid:1;
|
||||||
|
unsigned int lld_nfs_dentry:1;
|
||||||
struct rcu_head lld_rcu_head;
|
struct rcu_head lld_rcu_head;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
/* N.B. d_obtain_alias() drops inode ref on error */
|
||||||
result = d_obtain_alias(inode);
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue