mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-08 14:13:53 +00:00
nfsd: Set PF_LOCAL_THROTTLE on local filesystems only
Don't set PF_LOCAL_THROTTLE on remote filesystems like NFS, since they aren't expected to ever be subject to double buffering. Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
2e19d10c14
commit
01cbf38539
@ -171,5 +171,6 @@ const struct export_operations nfs_export_ops = {
|
|||||||
.encode_fh = nfs_encode_fh,
|
.encode_fh = nfs_encode_fh,
|
||||||
.fh_to_dentry = nfs_fh_to_dentry,
|
.fh_to_dentry = nfs_fh_to_dentry,
|
||||||
.get_parent = nfs_get_parent,
|
.get_parent = nfs_get_parent,
|
||||||
.flags = EXPORT_OP_NOWCC|EXPORT_OP_NOSUBTREECHK|EXPORT_OP_CLOSE_BEFORE_UNLINK,
|
.flags = EXPORT_OP_NOWCC|EXPORT_OP_NOSUBTREECHK|
|
||||||
|
EXPORT_OP_CLOSE_BEFORE_UNLINK|EXPORT_OP_REMOTE_FS,
|
||||||
};
|
};
|
||||||
|
@ -978,18 +978,25 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
|
|||||||
__be32 *verf)
|
__be32 *verf)
|
||||||
{
|
{
|
||||||
struct file *file = nf->nf_file;
|
struct file *file = nf->nf_file;
|
||||||
|
struct super_block *sb = file_inode(file)->i_sb;
|
||||||
struct svc_export *exp;
|
struct svc_export *exp;
|
||||||
struct iov_iter iter;
|
struct iov_iter iter;
|
||||||
__be32 nfserr;
|
__be32 nfserr;
|
||||||
int host_err;
|
int host_err;
|
||||||
int use_wgather;
|
int use_wgather;
|
||||||
loff_t pos = offset;
|
loff_t pos = offset;
|
||||||
|
unsigned long exp_op_flags = 0;
|
||||||
unsigned int pflags = current->flags;
|
unsigned int pflags = current->flags;
|
||||||
rwf_t flags = 0;
|
rwf_t flags = 0;
|
||||||
|
bool restore_flags = false;
|
||||||
|
|
||||||
trace_nfsd_write_opened(rqstp, fhp, offset, *cnt);
|
trace_nfsd_write_opened(rqstp, fhp, offset, *cnt);
|
||||||
|
|
||||||
if (test_bit(RQ_LOCAL, &rqstp->rq_flags))
|
if (sb->s_export_op)
|
||||||
|
exp_op_flags = sb->s_export_op->flags;
|
||||||
|
|
||||||
|
if (test_bit(RQ_LOCAL, &rqstp->rq_flags) &&
|
||||||
|
!(exp_op_flags & EXPORT_OP_REMOTE_FS)) {
|
||||||
/*
|
/*
|
||||||
* We want throttling in balance_dirty_pages()
|
* We want throttling in balance_dirty_pages()
|
||||||
* and shrink_inactive_list() to only consider
|
* and shrink_inactive_list() to only consider
|
||||||
@ -998,6 +1005,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
|
|||||||
* the client's dirty pages or its congested queue.
|
* the client's dirty pages or its congested queue.
|
||||||
*/
|
*/
|
||||||
current->flags |= PF_LOCAL_THROTTLE;
|
current->flags |= PF_LOCAL_THROTTLE;
|
||||||
|
restore_flags = true;
|
||||||
|
}
|
||||||
|
|
||||||
exp = fhp->fh_export;
|
exp = fhp->fh_export;
|
||||||
use_wgather = (rqstp->rq_vers == 2) && EX_WGATHER(exp);
|
use_wgather = (rqstp->rq_vers == 2) && EX_WGATHER(exp);
|
||||||
@ -1049,7 +1058,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct nfsd_file *nf,
|
|||||||
trace_nfsd_write_err(rqstp, fhp, offset, host_err);
|
trace_nfsd_write_err(rqstp, fhp, offset, host_err);
|
||||||
nfserr = nfserrno(host_err);
|
nfserr = nfserrno(host_err);
|
||||||
}
|
}
|
||||||
if (test_bit(RQ_LOCAL, &rqstp->rq_flags))
|
if (restore_flags)
|
||||||
current_restore_flags(pflags, PF_LOCAL_THROTTLE);
|
current_restore_flags(pflags, PF_LOCAL_THROTTLE);
|
||||||
return nfserr;
|
return nfserr;
|
||||||
}
|
}
|
||||||
|
@ -216,6 +216,7 @@ struct export_operations {
|
|||||||
#define EXPORT_OP_NOWCC (0x1) /* don't collect v3 wcc data */
|
#define EXPORT_OP_NOWCC (0x1) /* don't collect v3 wcc data */
|
||||||
#define EXPORT_OP_NOSUBTREECHK (0x2) /* no subtree checking */
|
#define EXPORT_OP_NOSUBTREECHK (0x2) /* no subtree checking */
|
||||||
#define EXPORT_OP_CLOSE_BEFORE_UNLINK (0x4) /* close files before unlink */
|
#define EXPORT_OP_CLOSE_BEFORE_UNLINK (0x4) /* close files before unlink */
|
||||||
|
#define EXPORT_OP_REMOTE_FS (0x8) /* Filesystem is remote */
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user