diff options
author | J. Bruce Fields <bfields@redhat.com> | 2015-07-23 11:08:43 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2015-07-27 11:16:25 -0400 |
commit | bdcc2cd14e4e86f1fb19c78e191a1b8da3d6dea0 (patch) | |
tree | 8ef0e76cd25875e77a8618fd483a078eaa7b25a5 | |
parent | d4c30454db732d5a377abfc309c7a629f3bbaeb0 (diff) |
NFSv4.2: handle NFS-specific llseek errors
Handle NFS-specific llseek errors instead of letting them leak out to
userspace.
Reported-by: Benjamin Coddington <bcodding@redhat.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r-- | fs/nfs/nfs42proc.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index f486b80f927a..d731bbf974aa 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c | |||
@@ -135,7 +135,7 @@ int nfs42_proc_deallocate(struct file *filep, loff_t offset, loff_t len) | |||
135 | return err; | 135 | return err; |
136 | } | 136 | } |
137 | 137 | ||
138 | loff_t nfs42_proc_llseek(struct file *filep, loff_t offset, int whence) | 138 | static loff_t _nfs42_proc_llseek(struct file *filep, loff_t offset, int whence) |
139 | { | 139 | { |
140 | struct inode *inode = file_inode(filep); | 140 | struct inode *inode = file_inode(filep); |
141 | struct nfs42_seek_args args = { | 141 | struct nfs42_seek_args args = { |
@@ -171,6 +171,23 @@ loff_t nfs42_proc_llseek(struct file *filep, loff_t offset, int whence) | |||
171 | return vfs_setpos(filep, res.sr_offset, inode->i_sb->s_maxbytes); | 171 | return vfs_setpos(filep, res.sr_offset, inode->i_sb->s_maxbytes); |
172 | } | 172 | } |
173 | 173 | ||
174 | loff_t nfs42_proc_llseek(struct file *filep, loff_t offset, int whence) | ||
175 | { | ||
176 | struct nfs_server *server = NFS_SERVER(file_inode(filep)); | ||
177 | struct nfs4_exception exception = { }; | ||
178 | int err; | ||
179 | |||
180 | do { | ||
181 | err = _nfs42_proc_llseek(filep, offset, whence); | ||
182 | if (err == -ENOTSUPP) | ||
183 | return -EOPNOTSUPP; | ||
184 | err = nfs4_handle_exception(server, err, &exception); | ||
185 | } while (exception.retry); | ||
186 | |||
187 | return err; | ||
188 | } | ||
189 | |||
190 | |||
174 | static void | 191 | static void |
175 | nfs42_layoutstat_prepare(struct rpc_task *task, void *calldata) | 192 | nfs42_layoutstat_prepare(struct rpc_task *task, void *calldata) |
176 | { | 193 | { |