Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f1517df8 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'nfsd-4.16' of git://linux-nfs.org/~bfields/linux

Pull nfsd update from Bruce Fields:
 "A fairly small update this time around. Some cleanup, RDMA fixes,
  overlayfs fixes, and a fix for an NFSv4 state bug.

  The bigger deal for nfsd this time around was Jeff Layton's
  already-merged i_version patches"

* tag 'nfsd-4.16' of git://linux-nfs.org/~bfields/linux:
  svcrdma: Fix Read chunk round-up
  NFSD: hide unused svcxdr_dupstr()
  nfsd: store stat times in fill_pre_wcc() instead of inode times
  nfsd: encode stat->mtime for getattr instead of inode->i_mtime
  nfsd: return RESOURCE not GARBAGE_ARGS on too many ops
  nfsd4: don't set lock stateid's sc_type to CLOSED
  nfsd: Detect unhashed stids in nfsd4_verify_open_stid()
  sunrpc: remove dead code in svc_sock_setbufsize
  svcrdma: Post Receives in the Receive completion handler
  nfsd4: permit layoutget of executable-only files
  lockd: convert nlm_rqst.a_count from atomic_t to refcount_t
  lockd: convert nlm_lockowner.count from atomic_t to refcount_t
  lockd: convert nsm_handle.sm_count from atomic_t to refcount_t
parents 9d21874d 175e0310
Loading
Loading
Loading
Loading
+2 −4
Original line number Original line Diff line number Diff line
@@ -1554,9 +1554,9 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type)
EXPORT_SYMBOL(__break_lease);
EXPORT_SYMBOL(__break_lease);


/**
/**
 *	lease_get_mtime - get the last modified time of an inode
 *	lease_get_mtime - update modified time of an inode with exclusive lease
 *	@inode: the inode
 *	@inode: the inode
 *      @time:  pointer to a timespec which will contain the last modified time
 *      @time:  pointer to a timespec which contains the last modified time
 *
 *
 * This is to force NFS clients to flush their caches for files with
 * This is to force NFS clients to flush their caches for files with
 * exclusive leases.  The justification is that if someone has an
 * exclusive leases.  The justification is that if someone has an
@@ -1580,8 +1580,6 @@ void lease_get_mtime(struct inode *inode, struct timespec *time)


	if (has_lease)
	if (has_lease)
		*time = current_time(inode);
		*time = current_time(inode);
	else
		*time = inode->i_mtime;
}
}


EXPORT_SYMBOL(lease_get_mtime);
EXPORT_SYMBOL(lease_get_mtime);
+30 −1
Original line number Original line Diff line number Diff line
@@ -250,6 +250,34 @@ encode_wcc_data(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)
	return encode_post_op_attr(rqstp, p, fhp);
	return encode_post_op_attr(rqstp, p, fhp);
}
}


/*
 * Fill in the pre_op attr for the wcc data
 */
void fill_pre_wcc(struct svc_fh *fhp)
{
	struct inode    *inode;
	struct kstat	stat;
	__be32 err;

	if (fhp->fh_pre_saved)
		return;

	inode = d_inode(fhp->fh_dentry);
	err = fh_getattr(fhp, &stat);
	if (err) {
		/* Grab the times from inode anyway */
		stat.mtime = inode->i_mtime;
		stat.ctime = inode->i_ctime;
		stat.size  = inode->i_size;
	}

	fhp->fh_pre_mtime = stat.mtime;
	fhp->fh_pre_ctime = stat.ctime;
	fhp->fh_pre_size  = stat.size;
	fhp->fh_pre_change = nfsd4_change_attribute(&stat, inode);
	fhp->fh_pre_saved = true;
}

/*
/*
 * Fill in the post_op attr for the wcc data
 * Fill in the post_op attr for the wcc data
 */
 */
@@ -261,7 +289,8 @@ void fill_post_wcc(struct svc_fh *fhp)
		printk("nfsd: inode locked twice during operation.\n");
		printk("nfsd: inode locked twice during operation.\n");


	err = fh_getattr(fhp, &fhp->fh_post_attr);
	err = fh_getattr(fhp, &fhp->fh_post_attr);
	fhp->fh_post_change = nfsd4_change_attribute(d_inode(fhp->fh_dentry));
	fhp->fh_post_change = nfsd4_change_attribute(&fhp->fh_post_attr,
						     d_inode(fhp->fh_dentry));
	if (err) {
	if (err) {
		fhp->fh_post_saved = false;
		fhp->fh_post_saved = false;
		/* Grab the ctime anyway - set_change_info might use it */
		/* Grab the ctime anyway - set_change_info might use it */
+6 −3
Original line number Original line Diff line number Diff line
@@ -1363,14 +1363,14 @@ nfsd4_layoutget(struct svc_rqst *rqstp,
	const struct nfsd4_layout_ops *ops;
	const struct nfsd4_layout_ops *ops;
	struct nfs4_layout_stateid *ls;
	struct nfs4_layout_stateid *ls;
	__be32 nfserr;
	__be32 nfserr;
	int accmode;
	int accmode = NFSD_MAY_READ_IF_EXEC;


	switch (lgp->lg_seg.iomode) {
	switch (lgp->lg_seg.iomode) {
	case IOMODE_READ:
	case IOMODE_READ:
		accmode = NFSD_MAY_READ;
		accmode |= NFSD_MAY_READ;
		break;
		break;
	case IOMODE_RW:
	case IOMODE_RW:
		accmode = NFSD_MAY_READ | NFSD_MAY_WRITE;
		accmode |= NFSD_MAY_READ | NFSD_MAY_WRITE;
		break;
		break;
	default:
	default:
		dprintk("%s: invalid iomode %d\n",
		dprintk("%s: invalid iomode %d\n",
@@ -1703,6 +1703,9 @@ nfsd4_proc_compound(struct svc_rqst *rqstp)
	status = nfserr_minor_vers_mismatch;
	status = nfserr_minor_vers_mismatch;
	if (nfsd_minorversion(args->minorversion, NFSD_TEST) <= 0)
	if (nfsd_minorversion(args->minorversion, NFSD_TEST) <= 0)
		goto out;
		goto out;
	status = nfserr_resource;
	if (args->opcnt > NFSD_MAX_OPS_PER_COMPOUND)
		goto out;


	status = nfs41_check_op_ordering(args);
	status = nfs41_check_op_ordering(args);
	if (status) {
	if (status) {
+2 −4
Original line number Original line Diff line number Diff line
@@ -3590,6 +3590,7 @@ nfsd4_verify_open_stid(struct nfs4_stid *s)
	switch (s->sc_type) {
	switch (s->sc_type) {
	default:
	default:
		break;
		break;
	case 0:
	case NFS4_CLOSED_STID:
	case NFS4_CLOSED_STID:
	case NFS4_CLOSED_DELEG_STID:
	case NFS4_CLOSED_DELEG_STID:
		ret = nfserr_bad_stateid;
		ret = nfserr_bad_stateid;
@@ -5182,7 +5183,6 @@ nfsd4_free_lock_stateid(stateid_t *stateid, struct nfs4_stid *s)
			    lockowner(stp->st_stateowner)))
			    lockowner(stp->st_stateowner)))
		goto out;
		goto out;


	stp->st_stid.sc_type = NFS4_CLOSED_STID;
	release_lock_stateid(stp);
	release_lock_stateid(stp);
	ret = nfs_ok;
	ret = nfs_ok;


@@ -6078,10 +6078,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
		 * If this is a new, never-before-used stateid, and we are
		 * If this is a new, never-before-used stateid, and we are
		 * returning an error, then just go ahead and release it.
		 * returning an error, then just go ahead and release it.
		 */
		 */
		if (status && new) {
		if (status && new)
			lock_stp->st_stid.sc_type = NFS4_CLOSED_STID;
			release_lock_stateid(lock_stp);
			release_lock_stateid(lock_stp);
		}


		mutex_unlock(&lock_stp->st_mutex);
		mutex_unlock(&lock_stp->st_mutex);


+10 −6
Original line number Original line Diff line number Diff line
@@ -455,8 +455,8 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
	}
	}


	label->len = 0;
	label->len = 0;
#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
	if (IS_ENABLED(CONFIG_NFSD_V4_SECURITY_LABEL) &&
	if (bmval[2] & FATTR4_WORD2_SECURITY_LABEL) {
	    bmval[2] & FATTR4_WORD2_SECURITY_LABEL) {
		READ_BUF(4);
		READ_BUF(4);
		len += 4;
		len += 4;
		dummy32 = be32_to_cpup(p++); /* lfs: we don't use it */
		dummy32 = be32_to_cpup(p++); /* lfs: we don't use it */
@@ -476,7 +476,6 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
		if (!label->data)
		if (!label->data)
			return nfserr_jukebox;
			return nfserr_jukebox;
	}
	}
#endif
	if (bmval[2] & FATTR4_WORD2_MODE_UMASK) {
	if (bmval[2] & FATTR4_WORD2_MODE_UMASK) {
		if (!umask)
		if (!umask)
			goto xdr_error;
			goto xdr_error;
@@ -1918,8 +1917,13 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)


	if (argp->taglen > NFSD4_MAX_TAGLEN)
	if (argp->taglen > NFSD4_MAX_TAGLEN)
		goto xdr_error;
		goto xdr_error;
	if (argp->opcnt > 100)
	/*
		goto xdr_error;
	 * NFS4ERR_RESOURCE is a more helpful error than GARBAGE_ARGS
	 * here, so we return success at the xdr level so that
	 * nfsd4_proc can handle this is an NFS-level error.
	 */
	if (argp->opcnt > NFSD_MAX_OPS_PER_COMPOUND)
		return 0;


	if (argp->opcnt > ARRAY_SIZE(argp->iops)) {
	if (argp->opcnt > ARRAY_SIZE(argp->iops)) {
		argp->ops = kzalloc(argp->opcnt * sizeof(*argp->ops), GFP_KERNEL);
		argp->ops = kzalloc(argp->opcnt * sizeof(*argp->ops), GFP_KERNEL);
@@ -1991,7 +1995,7 @@ static __be32 *encode_change(__be32 *p, struct kstat *stat, struct inode *inode,
		*p++ = cpu_to_be32(convert_to_wallclock(exp->cd->flush_time));
		*p++ = cpu_to_be32(convert_to_wallclock(exp->cd->flush_time));
		*p++ = 0;
		*p++ = 0;
	} else if (IS_I_VERSION(inode)) {
	} else if (IS_I_VERSION(inode)) {
		p = xdr_encode_hyper(p, nfsd4_change_attribute(inode));
		p = xdr_encode_hyper(p, nfsd4_change_attribute(stat, inode));
	} else {
	} else {
		*p++ = cpu_to_be32(stat->ctime.tv_sec);
		*p++ = cpu_to_be32(stat->ctime.tv_sec);
		*p++ = cpu_to_be32(stat->ctime.tv_nsec);
		*p++ = cpu_to_be32(stat->ctime.tv_nsec);
Loading