diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-17 13:43:55 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-17 13:43:55 -0700 | 
| commit | 61f98b0fca802d7e0191072606519e2230a6226d (patch) | |
| tree | 2f6d5f85ea21042c0299e6204c9a99f3a7172279 /fs | |
| parent | c0d15cc7ee8c0d1970197d9eb1727503bcdd2471 (diff) | |
| parent | b2781e1021525649c0b33fffd005ef219da33926 (diff) | |
| download | linux-61f98b0fca802d7e0191072606519e2230a6226d.tar.bz2 | |
Merge branch 'for-3.11' of git://linux-nfs.org/~bfields/linux
Pull nfsd bugfixes from Bruce Fields:
 "Just three minor bugfixes"
* 'for-3.11' of git://linux-nfs.org/~bfields/linux:
  svcrdma: underflow issue in decode_write_list()
  nfsd4: fix minorversion support interface
  lockd: protect nlm_blocked access in nlmsvc_retry_blocked
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/lockd/svclock.c | 4 | ||||
| -rw-r--r-- | fs/nfsd/nfs4proc.c | 2 | ||||
| -rw-r--r-- | fs/nfsd/nfsd.h | 1 | ||||
| -rw-r--r-- | fs/nfsd/nfssvc.c | 13 | 
4 files changed, 12 insertions, 8 deletions
| diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index 067778b0ccc9..e066a3902973 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c @@ -951,6 +951,7 @@ nlmsvc_retry_blocked(void)  	unsigned long	timeout = MAX_SCHEDULE_TIMEOUT;  	struct nlm_block *block; +	spin_lock(&nlm_blocked_lock);  	while (!list_empty(&nlm_blocked) && !kthread_should_stop()) {  		block = list_entry(nlm_blocked.next, struct nlm_block, b_list); @@ -960,6 +961,7 @@ nlmsvc_retry_blocked(void)  			timeout = block->b_when - jiffies;  			break;  		} +		spin_unlock(&nlm_blocked_lock);  		dprintk("nlmsvc_retry_blocked(%p, when=%ld)\n",  			block, block->b_when); @@ -969,7 +971,9 @@ nlmsvc_retry_blocked(void)  			retry_deferred_block(block);  		} else  			nlmsvc_grant_blocked(block); +		spin_lock(&nlm_blocked_lock);  	} +	spin_unlock(&nlm_blocked_lock);  	return timeout;  } diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index a7cee864e7b2..0d4c410e4589 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -1293,7 +1293,7 @@ nfsd4_proc_compound(struct svc_rqst *rqstp,  	 * According to RFC3010, this takes precedence over all other errors.  	 */  	status = nfserr_minor_vers_mismatch; -	if (args->minorversion > nfsd_supported_minorversion) +	if (nfsd_minorversion(args->minorversion, NFSD_TEST) <= 0)  		goto out;  	status = nfs41_check_op_ordering(args); diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h index 2bbd94e51efc..30f34ab02137 100644 --- a/fs/nfsd/nfsd.h +++ b/fs/nfsd/nfsd.h @@ -53,7 +53,6 @@ struct readdir_cd {  extern struct svc_program	nfsd_program;  extern struct svc_version	nfsd_version2, nfsd_version3,  				nfsd_version4; -extern u32			nfsd_supported_minorversion;  extern struct mutex		nfsd_mutex;  extern spinlock_t		nfsd_drc_lock;  extern unsigned long		nfsd_drc_max_mem; diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c index 6b9f48ca4c25..760c85a6f534 100644 --- a/fs/nfsd/nfssvc.c +++ b/fs/nfsd/nfssvc.c @@ -116,7 +116,10 @@ struct svc_program		nfsd_program = {  }; -u32 nfsd_supported_minorversion = 1; +static bool nfsd_supported_minorversions[NFSD_SUPPORTED_MINOR_VERSION + 1] = { +	[0] = 1, +	[1] = 1, +};  int nfsd_vers(int vers, enum vers_op change)  { @@ -151,15 +154,13 @@ int nfsd_minorversion(u32 minorversion, enum vers_op change)  		return -1;  	switch(change) {  	case NFSD_SET: -		nfsd_supported_minorversion = minorversion; +		nfsd_supported_minorversions[minorversion] = true;  		break;  	case NFSD_CLEAR: -		if (minorversion == 0) -			return -1; -		nfsd_supported_minorversion = minorversion - 1; +		nfsd_supported_minorversions[minorversion] = false;  		break;  	case NFSD_TEST: -		return minorversion <= nfsd_supported_minorversion; +		return nfsd_supported_minorversions[minorversion];  	case NFSD_AVAIL:  		return minorversion <= NFSD_SUPPORTED_MINOR_VERSION;  	} |