mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
This request is late, apologies.
But it's also 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 is Jeff Layton's already-merged i_version patches. This series has a minor conflict with that one, and the resolution should be obvious. (Stephen Rothwell has been carrying it in linux-next for what it's worth.) -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJafNVvAAoJECebzXlCjuG+yZUP/2SctFtkW638z9frLcIVt5M6 x5hluw5jtFrVqq/KoMwi7rVaMzhdvcgwwfaLciqrPCOmcMKlOqiWslyCV0wZVCZS jabkOeinKVAyPTlESesNyArWKBWaB8QaYDwbkQ5Y76U9Ma5gwSghS1wc8vrNduZY 2StieESOiOs9LljXf5SqCC5nN9s7gs4qtCK7aZ3JIt4661Lh39LqyO5zxLnc78eL USnJKHjTSreY2Vd1/TdNWyZhiim43wdrB+jpy6IoocTqyhYalkCz1iYdJn1arqtP iIddPpczKxkHekFVj7/Kfa+ATFtdXIpivOBhhOT0oY8HukTd58bh/oUMrFt4BSuP MQst0R9h1sanBE18XBPlXuIK51sm3AjjOGaQycl/Mzes+dMRgIP/KspAcnwwXHqG gyZsF3VzliFTc9s0SyiAz2AxNTUnjd+LV3E0DUeivURa6V3pc+sFlQzi8PRxRaep 0gmhYcZsfwdDKZ/kbQyQdSWN48NxOLFke4fYjmoUtoyILa0NAHEqafeJkR5EiRTm tZsL9H/3THEGWygYlXGGBo/J4w5jE3uL/8KkfeuZefzSo0Ujqu0pBALMTnGFLKRx Mpw7JEqfUwqIVZ0Qh6q9yIcjr89qWv96UpBqRRIkFX5zOPN7B1BH8C89g8qy3Hyt gm/5BTw4FPE0uAM9Nhsd =icEX -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
f1517df870
14 changed files with 73 additions and 97 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
|
|
@ -261,7 +289,8 @@ void fill_post_wcc(struct svc_fh *fhp)
|
|||
printk("nfsd: inode locked twice during operation.\n");
|
||||
|
||||
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) {
|
||||
fhp->fh_post_saved = false;
|
||||
/* Grab the ctime anyway - set_change_info might use it */
|
||||
|
|
|
|||
|
|
@ -1363,14 +1363,14 @@ nfsd4_layoutget(struct svc_rqst *rqstp,
|
|||
const struct nfsd4_layout_ops *ops;
|
||||
struct nfs4_layout_stateid *ls;
|
||||
__be32 nfserr;
|
||||
int accmode;
|
||||
int accmode = NFSD_MAY_READ_IF_EXEC;
|
||||
|
||||
switch (lgp->lg_seg.iomode) {
|
||||
case IOMODE_READ:
|
||||
accmode = NFSD_MAY_READ;
|
||||
accmode |= NFSD_MAY_READ;
|
||||
break;
|
||||
case IOMODE_RW:
|
||||
accmode = NFSD_MAY_READ | NFSD_MAY_WRITE;
|
||||
accmode |= NFSD_MAY_READ | NFSD_MAY_WRITE;
|
||||
break;
|
||||
default:
|
||||
dprintk("%s: invalid iomode %d\n",
|
||||
|
|
@ -1703,6 +1703,9 @@ nfsd4_proc_compound(struct svc_rqst *rqstp)
|
|||
status = nfserr_minor_vers_mismatch;
|
||||
if (nfsd_minorversion(args->minorversion, NFSD_TEST) <= 0)
|
||||
goto out;
|
||||
status = nfserr_resource;
|
||||
if (args->opcnt > NFSD_MAX_OPS_PER_COMPOUND)
|
||||
goto out;
|
||||
|
||||
status = nfs41_check_op_ordering(args);
|
||||
if (status) {
|
||||
|
|
|
|||
|
|
@ -3590,6 +3590,7 @@ nfsd4_verify_open_stid(struct nfs4_stid *s)
|
|||
switch (s->sc_type) {
|
||||
default:
|
||||
break;
|
||||
case 0:
|
||||
case NFS4_CLOSED_STID:
|
||||
case NFS4_CLOSED_DELEG_STID:
|
||||
ret = nfserr_bad_stateid;
|
||||
|
|
@ -5182,7 +5183,6 @@ nfsd4_free_lock_stateid(stateid_t *stateid, struct nfs4_stid *s)
|
|||
lockowner(stp->st_stateowner)))
|
||||
goto out;
|
||||
|
||||
stp->st_stid.sc_type = NFS4_CLOSED_STID;
|
||||
release_lock_stateid(stp);
|
||||
ret = nfs_ok;
|
||||
|
||||
|
|
@ -6078,10 +6078,8 @@ out:
|
|||
* If this is a new, never-before-used stateid, and we are
|
||||
* returning an error, then just go ahead and release it.
|
||||
*/
|
||||
if (status && new) {
|
||||
lock_stp->st_stid.sc_type = NFS4_CLOSED_STID;
|
||||
if (status && new)
|
||||
release_lock_stateid(lock_stp);
|
||||
}
|
||||
|
||||
mutex_unlock(&lock_stp->st_mutex);
|
||||
|
||||
|
|
|
|||
|
|
@ -455,8 +455,8 @@ nfsd4_decode_fattr(struct nfsd4_compoundargs *argp, u32 *bmval,
|
|||
}
|
||||
|
||||
label->len = 0;
|
||||
#ifdef CONFIG_NFSD_V4_SECURITY_LABEL
|
||||
if (bmval[2] & FATTR4_WORD2_SECURITY_LABEL) {
|
||||
if (IS_ENABLED(CONFIG_NFSD_V4_SECURITY_LABEL) &&
|
||||
bmval[2] & FATTR4_WORD2_SECURITY_LABEL) {
|
||||
READ_BUF(4);
|
||||
len += 4;
|
||||
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)
|
||||
return nfserr_jukebox;
|
||||
}
|
||||
#endif
|
||||
if (bmval[2] & FATTR4_WORD2_MODE_UMASK) {
|
||||
if (!umask)
|
||||
goto xdr_error;
|
||||
|
|
@ -1918,8 +1917,13 @@ nfsd4_decode_compound(struct nfsd4_compoundargs *argp)
|
|||
|
||||
if (argp->taglen > NFSD4_MAX_TAGLEN)
|
||||
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)) {
|
||||
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++ = 0;
|
||||
} 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 {
|
||||
*p++ = cpu_to_be32(stat->ctime.tv_sec);
|
||||
*p++ = cpu_to_be32(stat->ctime.tv_nsec);
|
||||
|
|
|
|||
|
|
@ -253,36 +253,20 @@ fh_clear_wcc(struct svc_fh *fhp)
|
|||
* By using both ctime and the i_version counter we guarantee that as
|
||||
* long as time doesn't go backwards we never reuse an old value.
|
||||
*/
|
||||
static inline u64 nfsd4_change_attribute(struct inode *inode)
|
||||
static inline u64 nfsd4_change_attribute(struct kstat *stat,
|
||||
struct inode *inode)
|
||||
{
|
||||
u64 chattr;
|
||||
|
||||
chattr = inode->i_ctime.tv_sec;
|
||||
chattr = stat->ctime.tv_sec;
|
||||
chattr <<= 30;
|
||||
chattr += inode->i_ctime.tv_nsec;
|
||||
chattr += stat->ctime.tv_nsec;
|
||||
chattr += inode_query_iversion(inode);
|
||||
return chattr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill in the pre_op attr for the wcc data
|
||||
*/
|
||||
static inline void
|
||||
fill_pre_wcc(struct svc_fh *fhp)
|
||||
{
|
||||
struct inode *inode;
|
||||
|
||||
inode = d_inode(fhp->fh_dentry);
|
||||
if (!fhp->fh_pre_saved) {
|
||||
fhp->fh_pre_mtime = inode->i_mtime;
|
||||
fhp->fh_pre_ctime = inode->i_ctime;
|
||||
fhp->fh_pre_size = inode->i_size;
|
||||
fhp->fh_pre_change = nfsd4_change_attribute(inode);
|
||||
fhp->fh_pre_saved = true;
|
||||
}
|
||||
}
|
||||
|
||||
extern void fill_post_wcc(struct svc_fh *);
|
||||
extern void fill_pre_wcc(struct svc_fh *fhp);
|
||||
extern void fill_post_wcc(struct svc_fh *fhp);
|
||||
#else
|
||||
#define fh_clear_wcc(ignored)
|
||||
#define fill_pre_wcc(ignored)
|
||||
|
|
|
|||
|
|
@ -188,6 +188,7 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,
|
|||
*p++ = htonl((u32) stat->ino);
|
||||
*p++ = htonl((u32) stat->atime.tv_sec);
|
||||
*p++ = htonl(stat->atime.tv_nsec ? stat->atime.tv_nsec / 1000 : 0);
|
||||
time = stat->mtime;
|
||||
lease_get_mtime(d_inode(dentry), &time);
|
||||
*p++ = htonl((u32) time.tv_sec);
|
||||
*p++ = htonl(time.tv_nsec ? time.tv_nsec / 1000 : 0);
|
||||
|
|
|
|||
Loading…
Reference in a new issue