Merge branch 'for-2.6.40' of git://linux-nfs.org/~bfields/linux
* 'for-2.6.40' of git://linux-nfs.org/~bfields/linux: (22 commits) nfsd: make local functions static NFSD: Remove unused variable from nfsd4_decode_bind_conn_to_session() NFSD: Check status from nfsd4_map_bcts_dir() NFSD: Remove setting unused variable in nfsd_vfs_read() nfsd41: error out on repeated RECLAIM_COMPLETE nfsd41: compare request's opcnt with session's maxops at nfsd4_sequence nfsd v4.1 lOCKT clientid field must be ignored nfsd41: add flag checking for create_session nfsd41: make sure nfs server process OPEN with EXCLUSIVE4_1 correctly nfsd4: fix wrongsec handling for PUTFH + op cases nfsd4: make fh_verify responsibility of nfsd_lookup_dentry caller nfsd4: introduce OPDESC helper nfsd4: allow fh_verify caller to skip pseudoflavor checks nfsd: distinguish functions of NFSD_MAY_* flags svcrpc: complete svsk processing on cb receive failure svcrpc: take advantage of tcp autotuning SUNRPC: Don't wait for full record to receive tcp data svcrpc: copy cb reply instead of pages svcrpc: close connection if client sends short packet svcrpc: note network-order types in svc_process_calldir ...
This commit is contained in:
@@ -181,16 +181,10 @@ nfsd_lookup_dentry(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
struct svc_export *exp;
|
||||
struct dentry *dparent;
|
||||
struct dentry *dentry;
|
||||
__be32 err;
|
||||
int host_err;
|
||||
|
||||
dprintk("nfsd: nfsd_lookup(fh %s, %.*s)\n", SVCFH_fmt(fhp), len,name);
|
||||
|
||||
/* Obtain dentry and export. */
|
||||
err = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_EXEC);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
dparent = fhp->fh_dentry;
|
||||
exp = fhp->fh_export;
|
||||
exp_get(exp);
|
||||
@@ -254,6 +248,9 @@ nfsd_lookup(struct svc_rqst *rqstp, struct svc_fh *fhp, const char *name,
|
||||
struct dentry *dentry;
|
||||
__be32 err;
|
||||
|
||||
err = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_EXEC);
|
||||
if (err)
|
||||
return err;
|
||||
err = nfsd_lookup_dentry(rqstp, fhp, name, len, &exp, &dentry);
|
||||
if (err)
|
||||
return err;
|
||||
@@ -877,13 +874,11 @@ static __be32
|
||||
nfsd_vfs_read(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
|
||||
loff_t offset, struct kvec *vec, int vlen, unsigned long *count)
|
||||
{
|
||||
struct inode *inode;
|
||||
mm_segment_t oldfs;
|
||||
__be32 err;
|
||||
int host_err;
|
||||
|
||||
err = nfserr_perm;
|
||||
inode = file->f_path.dentry->d_inode;
|
||||
|
||||
if (file->f_op->splice_read && rqstp->rq_splice_ok) {
|
||||
struct splice_desc sd = {
|
||||
@@ -1340,11 +1335,18 @@ out_nfserr:
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
|
||||
static inline int nfsd_create_is_exclusive(int createmode)
|
||||
{
|
||||
return createmode == NFS3_CREATE_EXCLUSIVE
|
||||
|| createmode == NFS4_CREATE_EXCLUSIVE4_1;
|
||||
}
|
||||
|
||||
/*
|
||||
* NFSv3 version of nfsd_create
|
||||
* NFSv3 and NFSv4 version of nfsd_create
|
||||
*/
|
||||
__be32
|
||||
nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
char *fname, int flen, struct iattr *iap,
|
||||
struct svc_fh *resfhp, int createmode, u32 *verifier,
|
||||
int *truncp, int *created)
|
||||
@@ -1396,7 +1398,7 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
if (createmode == NFS3_CREATE_EXCLUSIVE) {
|
||||
if (nfsd_create_is_exclusive(createmode)) {
|
||||
/* solaris7 gets confused (bugid 4218508) if these have
|
||||
* the high bit set, so just clear the high bits. If this is
|
||||
* ever changed to use different attrs for storing the
|
||||
@@ -1437,6 +1439,11 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
&& dchild->d_inode->i_atime.tv_sec == v_atime
|
||||
&& dchild->d_inode->i_size == 0 )
|
||||
break;
|
||||
case NFS4_CREATE_EXCLUSIVE4_1:
|
||||
if ( dchild->d_inode->i_mtime.tv_sec == v_mtime
|
||||
&& dchild->d_inode->i_atime.tv_sec == v_atime
|
||||
&& dchild->d_inode->i_size == 0 )
|
||||
goto set_attr;
|
||||
/* fallthru */
|
||||
case NFS3_CREATE_GUARDED:
|
||||
err = nfserr_exist;
|
||||
@@ -1455,7 +1462,7 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
|
||||
nfsd_check_ignore_resizing(iap);
|
||||
|
||||
if (createmode == NFS3_CREATE_EXCLUSIVE) {
|
||||
if (nfsd_create_is_exclusive(createmode)) {
|
||||
/* Cram the verifier into atime/mtime */
|
||||
iap->ia_valid = ATTR_MTIME|ATTR_ATIME
|
||||
| ATTR_MTIME_SET|ATTR_ATIME_SET;
|
||||
@@ -2034,7 +2041,7 @@ nfsd_permission(struct svc_rqst *rqstp, struct svc_export *exp,
|
||||
struct inode *inode = dentry->d_inode;
|
||||
int err;
|
||||
|
||||
if (acc == NFSD_MAY_NOP)
|
||||
if ((acc & NFSD_MAY_MASK) == NFSD_MAY_NOP)
|
||||
return 0;
|
||||
#if 0
|
||||
dprintk("nfsd: permission 0x%x%s%s%s%s%s%s%s mode 0%o%s%s%s\n",
|
||||
|
Reference in New Issue
Block a user