diff options
author | Andy Adamson <andros@netapp.com> | 2013-08-14 19:59:16 +0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-09-03 23:25:09 +0400 |
commit | dc24826bfca8d788d05f625208f06d90be5560b3 (patch) | |
tree | cc6fa221202666ac694581061caf373b431ff9bd /fs/nfs/internal.h | |
parent | 4de6caa270afaa381dd3373e9e6d148b1090e0ec (diff) | |
download | linux-dc24826bfca8d788d05f625208f06d90be5560b3.tar.xz |
NFS avoid expired credential keys for buffered writes
We must avoid buffering a WRITE that is using a credential key (e.g. a GSS
context key) that is about to expire or has expired. We currently will
paint ourselves into a corner by returning success to the applciation
for such a buffered WRITE, only to discover that we do not have permission when
we attempt to flush the WRITE (and potentially associated COMMIT) to disk.
Use the RPC layer credential key timeout and expire routines which use a
a watermark, gss_key_expire_timeo. We test the key in nfs_file_write.
If a WRITE is using a credential with a key that will expire within
watermark seconds, flush the inode in nfs_write_end and send only
NFS_FILE_SYNC WRITEs by adding nfs_ctx_key_to_expire to nfs_need_sync_write.
Note that this results in single page NFS_FILE_SYNC WRITEs.
Signed-off-by: Andy Adamson <andros@netapp.com>
[Trond: removed a pr_warn_ratelimited() for now]
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/internal.h')
-rw-r--r-- | fs/nfs/internal.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 50f7068903b9..2415198d29ad 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -431,6 +431,8 @@ void nfs_request_remove_commit_list(struct nfs_page *req, void nfs_init_cinfo(struct nfs_commit_info *cinfo, struct inode *inode, struct nfs_direct_req *dreq); +int nfs_key_timeout_notify(struct file *filp, struct inode *inode); +bool nfs_ctx_key_to_expire(struct nfs_open_context *ctx); #ifdef CONFIG_MIGRATION extern int nfs_migrate_page(struct address_space *, |