forked from Minki/linux
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
|
||||
*/
|
||||
if (!lmm && lmmsize == 0) {
|
||||
itp->it_flags |= MDS_OPEN_LOCK;
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user