diff options
| -rw-r--r-- | fs/lockd/svcsubs.c | 14 | ||||
| -rw-r--r-- | fs/nfsd/nfs4xdr.c | 9 | ||||
| -rw-r--r-- | fs/nfsd/nfsd.h | 3 | 
3 files changed, 18 insertions, 8 deletions
| diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c index 0a22a2faf552..e1c4617de771 100644 --- a/fs/lockd/svcsubs.c +++ b/fs/lockd/svcsubs.c @@ -176,7 +176,7 @@ nlm_delete_file(struct nlm_file *file)  	}  } -static int nlm_unlock_files(struct nlm_file *file) +static int nlm_unlock_files(struct nlm_file *file, fl_owner_t owner)  {  	struct file_lock lock; @@ -184,6 +184,7 @@ static int nlm_unlock_files(struct nlm_file *file)  	lock.fl_type  = F_UNLCK;  	lock.fl_start = 0;  	lock.fl_end   = OFFSET_MAX; +	lock.fl_owner = owner;  	if (file->f_file[O_RDONLY] &&  	    vfs_lock_file(file->f_file[O_RDONLY], F_SETLK, &lock, NULL))  		goto out_err; @@ -225,7 +226,7 @@ again:  		if (match(lockhost, host)) {  			spin_unlock(&flctx->flc_lock); -			if (nlm_unlock_files(file)) +			if (nlm_unlock_files(file, fl->fl_owner))  				return 1;  			goto again;  		} @@ -282,11 +283,10 @@ nlm_file_inuse(struct nlm_file *file)  static void nlm_close_files(struct nlm_file *file)  { -	struct file *f; - -	for (f = file->f_file[0]; f <= file->f_file[1]; f++) -		if (f) -			nlmsvc_ops->fclose(f); +	if (file->f_file[O_RDONLY]) +		nlmsvc_ops->fclose(file->f_file[O_RDONLY]); +	if (file->f_file[O_WRONLY]) +		nlmsvc_ops->fclose(file->f_file[O_WRONLY]);  }  /* diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 61b2aae81abb..2acea7792bb2 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -470,6 +470,15 @@ nfsd4_decode_fattr4(struct nfsd4_compoundargs *argp, u32 *bmval, u32 bmlen,  			return nfserr_bad_xdr;  		}  	} +	if (bmval[1] & FATTR4_WORD1_TIME_CREATE) { +		struct timespec64 ts; + +		/* No Linux filesystem supports setting this attribute. */ +		bmval[1] &= ~FATTR4_WORD1_TIME_CREATE; +		status = nfsd4_decode_nfstime4(argp, &ts); +		if (status) +			return status; +	}  	if (bmval[1] & FATTR4_WORD1_TIME_MODIFY_SET) {  		u32 set_it; diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h index 847b482155ae..9a8b09afc173 100644 --- a/fs/nfsd/nfsd.h +++ b/fs/nfsd/nfsd.h @@ -465,7 +465,8 @@ static inline bool nfsd_attrs_supported(u32 minorversion, const u32 *bmval)  	(FATTR4_WORD0_SIZE | FATTR4_WORD0_ACL)  #define NFSD_WRITEABLE_ATTRS_WORD1 \  	(FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP \ -	| FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET) +	| FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_CREATE \ +	| FATTR4_WORD1_TIME_MODIFY_SET)  #ifdef CONFIG_NFSD_V4_SECURITY_LABEL  #define MAYBE_FATTR4_WORD2_SECURITY_LABEL \  	FATTR4_WORD2_SECURITY_LABEL |