diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2010-03-09 17:22:08 -0500 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2010-03-09 17:22:08 -0500 |
commit | e739cf1da48e841bc5d744a99764c1a668b4bdd2 (patch) | |
tree | 1d39318bbbcdd66ad8cd34823ad9befb7af08b1f /fs/nfsd | |
parent | e7b184f199fd3c80b618ec8244cbda70857d2779 (diff) | |
parent | 57d54889cd00db2752994b389ba714138652e60c (diff) |
Merge commit 'v2.6.34-rc1' into for-2.6.35-incoming
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfs4state.c | 2 | ||||
-rw-r--r-- | fs/nfsd/nfs4xdr.c | 12 | ||||
-rw-r--r-- | fs/nfsd/vfs.c | 8 |
3 files changed, 13 insertions, 9 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 6edfe23694e6..efef7f2442d5 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -1998,7 +1998,9 @@ nfs4_file_downgrade(struct file *filp, unsigned int share_access) | |||
1998 | { | 1998 | { |
1999 | if (share_access & NFS4_SHARE_ACCESS_WRITE) { | 1999 | if (share_access & NFS4_SHARE_ACCESS_WRITE) { |
2000 | drop_file_write_access(filp); | 2000 | drop_file_write_access(filp); |
2001 | spin_lock(&filp->f_lock); | ||
2001 | filp->f_mode = (filp->f_mode | FMODE_READ) & ~FMODE_WRITE; | 2002 | filp->f_mode = (filp->f_mode | FMODE_READ) & ~FMODE_WRITE; |
2003 | spin_unlock(&filp->f_lock); | ||
2002 | } | 2004 | } |
2003 | } | 2005 | } |
2004 | 2006 | ||
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index f61bd736152b..fb27b1db007b 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c | |||
@@ -2121,9 +2121,15 @@ out_acl: | |||
2121 | * and this is the root of a cross-mounted filesystem. | 2121 | * and this is the root of a cross-mounted filesystem. |
2122 | */ | 2122 | */ |
2123 | if (ignore_crossmnt == 0 && | 2123 | if (ignore_crossmnt == 0 && |
2124 | exp->ex_path.mnt->mnt_root->d_inode == dentry->d_inode) { | 2124 | dentry == exp->ex_path.mnt->mnt_root) { |
2125 | err = vfs_getattr(exp->ex_path.mnt->mnt_parent, | 2125 | struct path path = exp->ex_path; |
2126 | exp->ex_path.mnt->mnt_mountpoint, &stat); | 2126 | path_get(&path); |
2127 | while (follow_up(&path)) { | ||
2128 | if (path.dentry != path.mnt->mnt_root) | ||
2129 | break; | ||
2130 | } | ||
2131 | err = vfs_getattr(path.mnt, path.dentry, &stat); | ||
2132 | path_put(&path); | ||
2127 | if (err) | 2133 | if (err) |
2128 | goto out_nfserr; | 2134 | goto out_nfserr; |
2129 | } | 2135 | } |
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 43bd776c4882..a11b0e8678ee 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/fcntl.h> | 20 | #include <linux/fcntl.h> |
21 | #include <linux/namei.h> | 21 | #include <linux/namei.h> |
22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
23 | #include <linux/quotaops.h> | ||
24 | #include <linux/fsnotify.h> | 23 | #include <linux/fsnotify.h> |
25 | #include <linux/posix_acl_xattr.h> | 24 | #include <linux/posix_acl_xattr.h> |
26 | #include <linux/xattr.h> | 25 | #include <linux/xattr.h> |
@@ -389,7 +388,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | |||
389 | * If we are changing the size of the file, then | 388 | * If we are changing the size of the file, then |
390 | * we need to break all leases. | 389 | * we need to break all leases. |
391 | */ | 390 | */ |
392 | host_err = break_lease(inode, FMODE_WRITE | O_NONBLOCK); | 391 | host_err = break_lease(inode, O_WRONLY | O_NONBLOCK); |
393 | if (host_err == -EWOULDBLOCK) | 392 | if (host_err == -EWOULDBLOCK) |
394 | host_err = -ETIMEDOUT; | 393 | host_err = -ETIMEDOUT; |
395 | if (host_err) /* ENOMEM or EWOULDBLOCK */ | 394 | if (host_err) /* ENOMEM or EWOULDBLOCK */ |
@@ -405,7 +404,6 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap, | |||
405 | put_write_access(inode); | 404 | put_write_access(inode); |
406 | goto out_nfserr; | 405 | goto out_nfserr; |
407 | } | 406 | } |
408 | vfs_dq_init(inode); | ||
409 | } | 407 | } |
410 | 408 | ||
411 | /* sanitize the mode change */ | 409 | /* sanitize the mode change */ |
@@ -762,7 +760,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, | |||
762 | * Check to see if there are any leases on this file. | 760 | * Check to see if there are any leases on this file. |
763 | * This may block while leases are broken. | 761 | * This may block while leases are broken. |
764 | */ | 762 | */ |
765 | host_err = break_lease(inode, O_NONBLOCK | ((access & NFSD_MAY_WRITE) ? FMODE_WRITE : 0)); | 763 | host_err = break_lease(inode, O_NONBLOCK | ((access & NFSD_MAY_WRITE) ? O_WRONLY : 0)); |
766 | if (host_err == -EWOULDBLOCK) | 764 | if (host_err == -EWOULDBLOCK) |
767 | host_err = -ETIMEDOUT; | 765 | host_err = -ETIMEDOUT; |
768 | if (host_err) /* NOMEM or WOULDBLOCK */ | 766 | if (host_err) /* NOMEM or WOULDBLOCK */ |
@@ -773,8 +771,6 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type, | |||
773 | flags = O_RDWR|O_LARGEFILE; | 771 | flags = O_RDWR|O_LARGEFILE; |
774 | else | 772 | else |
775 | flags = O_WRONLY|O_LARGEFILE; | 773 | flags = O_WRONLY|O_LARGEFILE; |
776 | |||
777 | vfs_dq_init(inode); | ||
778 | } | 774 | } |
779 | *filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_path.mnt), | 775 | *filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_path.mnt), |
780 | flags, current_cred()); | 776 | flags, current_cred()); |