diff options
| author | J. Bruce Fields <bfields@citi.umich.edu> | 2007-06-08 15:23:34 -0400 |
|---|---|---|
| committer | J. Bruce Fields <bfields@citi.umich.edu> | 2007-07-18 19:17:19 -0400 |
| commit | 370f6599e8bc03fd9fc6d1a1be00ae0c6373ca59 (patch) | |
| tree | a68ac809ec45dd09d9a24250f8ebcf3825ccea23 | |
| parent | 60446067ba7a8e890a91db3b4a7436fe0ebd2dee (diff) | |
nfs: disable leases over NFS
As Peter Staubach says elsewhere
(http://marc.info/?l=linux-kernel&m=118113649526444&w=2):
> The problem is that some file system such as NFSv2 and NFSv3 do
> not have sufficient support to be able to support leases correctly.
> In particular for these two file systems, there is no over the wire
> protocol support.
>
> Currently, these two file systems fail the fcntl(F_SETLEASE) call
> accidentally, due to a reference counting difference. These file
> systems should fail more consciously, with a proper error to
> indicate that the call is invalid for them.
Define an nfs setlease method that just returns -EINVAL.
If someone can demonstrate a real need, perhaps we could reenable
them in the presence of the "nolock" mount option.
Signed-off-by: "J. Bruce Fields" <bfields@citi.umich.edu>
Cc: Peter Staubach <staubach@redhat.com>
Cc: Trond Myklebust <Trond.Myklebust@netapp.com>
| -rw-r--r-- | fs/nfs/file.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 8689b736fdd9..13ac6fa2b62b 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -53,6 +53,7 @@ static int nfs_fsync(struct file *, struct dentry *dentry, int datasync); | |||
| 53 | static int nfs_check_flags(int flags); | 53 | static int nfs_check_flags(int flags); |
| 54 | static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl); | 54 | static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl); |
| 55 | static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl); | 55 | static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl); |
| 56 | static int nfs_setlease(struct file *file, long arg, struct file_lock **fl); | ||
| 56 | 57 | ||
| 57 | const struct file_operations nfs_file_operations = { | 58 | const struct file_operations nfs_file_operations = { |
| 58 | .llseek = nfs_file_llseek, | 59 | .llseek = nfs_file_llseek, |
| @@ -69,6 +70,7 @@ const struct file_operations nfs_file_operations = { | |||
| 69 | .flock = nfs_flock, | 70 | .flock = nfs_flock, |
| 70 | .splice_read = nfs_file_splice_read, | 71 | .splice_read = nfs_file_splice_read, |
| 71 | .check_flags = nfs_check_flags, | 72 | .check_flags = nfs_check_flags, |
| 73 | .setlease = nfs_setlease, | ||
| 72 | }; | 74 | }; |
| 73 | 75 | ||
| 74 | const struct inode_operations nfs_file_inode_operations = { | 76 | const struct inode_operations nfs_file_inode_operations = { |
| @@ -558,3 +560,13 @@ static int nfs_flock(struct file *filp, int cmd, struct file_lock *fl) | |||
| 558 | return do_unlk(filp, cmd, fl); | 560 | return do_unlk(filp, cmd, fl); |
| 559 | return do_setlk(filp, cmd, fl); | 561 | return do_setlk(filp, cmd, fl); |
| 560 | } | 562 | } |
| 563 | |||
| 564 | static int nfs_setlease(struct file *file, long arg, struct file_lock **fl) | ||
| 565 | { | ||
| 566 | /* | ||
| 567 | * There is no protocol support for leases, so we have no way | ||
| 568 | * to implement them correctly in the face of opens by other | ||
| 569 | * clients. | ||
| 570 | */ | ||
| 571 | return -EINVAL; | ||
| 572 | } | ||
