Add major and minor version arguments to nfscl_reqstart().
This patch adds "vers" and "minorvers" arguments to nfscl_reqstart(). The patch always passes them in as "0" and that implies no change in semantics. These arguments will be used by a future commit that adds support for the Flexible File Layout.
This commit is contained in:
parent
800c3e80de
commit
a8462c582c
@ -303,7 +303,7 @@ struct ucred *nfsrv_getgrpscred(struct ucred *);
|
||||
void nfsm_uiombuf(struct nfsrv_descript *, struct uio *, int);
|
||||
struct mbuf *nfsm_uiombuflist(struct uio *, int, struct mbuf **, char **);
|
||||
void nfscl_reqstart(struct nfsrv_descript *, int, struct nfsmount *,
|
||||
u_int8_t *, int, u_int32_t **, struct nfsclsession *);
|
||||
u_int8_t *, int, u_int32_t **, struct nfsclsession *, int, int);
|
||||
nfsuint64 *nfscl_getcookie(struct nfsnode *, off_t off, int);
|
||||
void nfscl_fillsattr(struct nfsrv_descript *, struct vattr *,
|
||||
vnode_t, int, u_int32_t);
|
||||
|
@ -49,7 +49,8 @@ struct nfsv4node {
|
||||
*/
|
||||
#define NFSCL_REQSTART(n, p, v) \
|
||||
nfscl_reqstart((n), (p), VFSTONFS((v)->v_mount), \
|
||||
VTONFS(v)->n_fhp->nfh_fh, VTONFS(v)->n_fhp->nfh_len, NULL, NULL)
|
||||
VTONFS(v)->n_fhp->nfh_fh, VTONFS(v)->n_fhp->nfh_len, NULL, \
|
||||
NULL, 0, 0)
|
||||
|
||||
/*
|
||||
* These two macros convert between a lease duration and renew interval.
|
||||
|
@ -131,7 +131,8 @@ static int nfs_bigrequest[NFSV41_NPROCS] = {
|
||||
*/
|
||||
APPLESTATIC void
|
||||
nfscl_reqstart(struct nfsrv_descript *nd, int procnum, struct nfsmount *nmp,
|
||||
u_int8_t *nfhp, int fhlen, u_int32_t **opcntpp, struct nfsclsession *sep)
|
||||
u_int8_t *nfhp, int fhlen, u_int32_t **opcntpp, struct nfsclsession *sep,
|
||||
int vers, int minorvers)
|
||||
{
|
||||
struct mbuf *mb;
|
||||
u_int32_t *tl;
|
||||
@ -142,14 +143,22 @@ nfscl_reqstart(struct nfsrv_descript *nd, int procnum, struct nfsmount *nmp,
|
||||
* First, fill in some of the fields of nd.
|
||||
*/
|
||||
nd->nd_slotseq = NULL;
|
||||
if (NFSHASNFSV4(nmp)) {
|
||||
if (vers == NFS_VER4) {
|
||||
nd->nd_flag = ND_NFSV4 | ND_NFSCL;
|
||||
if (NFSHASNFSV4N(nmp))
|
||||
if (minorvers == NFSV41_MINORVERSION)
|
||||
nd->nd_flag |= ND_NFSV41;
|
||||
} else if (NFSHASNFSV3(nmp))
|
||||
} else if (vers == NFS_VER3)
|
||||
nd->nd_flag = ND_NFSV3 | ND_NFSCL;
|
||||
else
|
||||
nd->nd_flag = ND_NFSV2 | ND_NFSCL;
|
||||
else {
|
||||
if (NFSHASNFSV4(nmp)) {
|
||||
nd->nd_flag = ND_NFSV4 | ND_NFSCL;
|
||||
if (NFSHASNFSV4N(nmp))
|
||||
nd->nd_flag |= ND_NFSV41;
|
||||
} else if (NFSHASNFSV3(nmp))
|
||||
nd->nd_flag = ND_NFSV3 | ND_NFSCL;
|
||||
else
|
||||
nd->nd_flag = ND_NFSV2 | ND_NFSCL;
|
||||
}
|
||||
nd->nd_procnum = procnum;
|
||||
nd->nd_repstat = 0;
|
||||
|
||||
|
@ -429,7 +429,7 @@ nfsrpc_openrpc(struct nfsmount *nmp, vnode_t vp, u_int8_t *nfhp, int fhlen,
|
||||
|
||||
dp = *dpp;
|
||||
*dpp = NULL;
|
||||
nfscl_reqstart(nd, NFSPROC_OPEN, nmp, nfhp, fhlen, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_OPEN, nmp, nfhp, fhlen, NULL, NULL, 0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, 5 * NFSX_UNSIGNED);
|
||||
*tl++ = txdr_unsigned(op->nfso_own->nfsow_seqid);
|
||||
*tl++ = txdr_unsigned(mode & NFSV4OPEN_ACCESSBOTH);
|
||||
@ -785,7 +785,7 @@ nfsrpc_closerpc(struct nfsrv_descript *nd, struct nfsmount *nmp,
|
||||
int error;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_CLOSE, nmp, op->nfso_fh,
|
||||
op->nfso_fhlen, NULL, NULL);
|
||||
op->nfso_fhlen, NULL, NULL, 0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED + NFSX_STATEID);
|
||||
*tl++ = txdr_unsigned(op->nfso_own->nfsow_seqid);
|
||||
if (NFSHASNFSV4N(nmp))
|
||||
@ -827,7 +827,8 @@ nfsrpc_openconfirm(vnode_t vp, u_int8_t *nfhp, int fhlen,
|
||||
nmp = VFSTONFS(vnode_mount(vp));
|
||||
if (NFSHASNFSV4N(nmp))
|
||||
return (0); /* No confirmation for NFSv4.1. */
|
||||
nfscl_reqstart(nd, NFSPROC_OPENCONFIRM, nmp, nfhp, fhlen, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_OPENCONFIRM, nmp, nfhp, fhlen, NULL, NULL,
|
||||
0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, NFSX_UNSIGNED + NFSX_STATEID);
|
||||
*tl++ = op->nfso_stateid.seqid;
|
||||
*tl++ = op->nfso_stateid.other[0];
|
||||
@ -941,7 +942,7 @@ nfsrpc_setclient(struct nfsmount *nmp, struct nfsclclient *clp, int reclaim,
|
||||
tsep = NFSMNT_MDSSESSION(nmp);
|
||||
NFSUNLOCKMNT(nmp);
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_SETCLIENTID, nmp, NULL, 0, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_SETCLIENTID, nmp, NULL, 0, NULL, NULL, 0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
||||
*tl++ = txdr_unsigned(nfsboottime.tv_sec);
|
||||
*tl = txdr_unsigned(clp->nfsc_rev);
|
||||
@ -1011,7 +1012,7 @@ nfsrpc_setclient(struct nfsmount *nmp, struct nfsclclient *clp, int reclaim,
|
||||
* and confirm it.
|
||||
*/
|
||||
nfscl_reqstart(nd, NFSPROC_SETCLIENTIDCFRM, nmp, NULL, 0, NULL,
|
||||
NULL);
|
||||
NULL, 0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, 4 * NFSX_UNSIGNED);
|
||||
*tl++ = tsep->nfsess_clientid.lval[0];
|
||||
*tl++ = tsep->nfsess_clientid.lval[1];
|
||||
@ -1026,7 +1027,7 @@ nfsrpc_setclient(struct nfsmount *nmp, struct nfsclclient *clp, int reclaim,
|
||||
nd->nd_mrep = NULL;
|
||||
if (nd->nd_repstat == 0) {
|
||||
nfscl_reqstart(nd, NFSPROC_GETATTR, nmp, nmp->nm_fh,
|
||||
nmp->nm_fhsize, NULL, NULL);
|
||||
nmp->nm_fhsize, NULL, NULL, 0, 0);
|
||||
NFSZERO_ATTRBIT(&attrbits);
|
||||
NFSSETBIT_ATTRBIT(&attrbits, NFSATTRBIT_LEASETIME);
|
||||
(void) nfsrv_putattrbit(nd, &attrbits);
|
||||
@ -1093,7 +1094,7 @@ nfsrpc_getattrnovp(struct nfsmount *nmp, u_int8_t *fhp, int fhlen, int syscred,
|
||||
int error, vers = NFS_VER2;
|
||||
nfsattrbit_t attrbits;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_GETATTR, nmp, fhp, fhlen, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_GETATTR, nmp, fhp, fhlen, NULL, NULL, 0, 0);
|
||||
if (nd->nd_flag & ND_NFSV4) {
|
||||
vers = NFS_VER4;
|
||||
NFSGETATTR_ATTRBIT(&attrbits);
|
||||
@ -4009,7 +4010,7 @@ nfsrpc_locku(struct nfsrv_descript *nd, struct nfsmount *nmp,
|
||||
int error;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_LOCKU, nmp, lp->nfsl_open->nfso_fh,
|
||||
lp->nfsl_open->nfso_fhlen, NULL, NULL);
|
||||
lp->nfsl_open->nfso_fhlen, NULL, NULL, 0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID + 6 * NFSX_UNSIGNED);
|
||||
*tl++ = txdr_unsigned(type);
|
||||
*tl = txdr_unsigned(lp->nfsl_seqid);
|
||||
@ -4061,7 +4062,7 @@ nfsrpc_lock(struct nfsrv_descript *nd, struct nfsmount *nmp, vnode_t vp,
|
||||
uint8_t own[NFSV4CL_LOCKNAMELEN + NFSX_V4FHMAX];
|
||||
struct nfsclsession *tsep;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_LOCK, nmp, nfhp, fhlen, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_LOCK, nmp, nfhp, fhlen, NULL, NULL, 0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, 7 * NFSX_UNSIGNED);
|
||||
if (type == F_RDLCK)
|
||||
*tl++ = txdr_unsigned(NFSV4LOCKT_READ);
|
||||
@ -4334,10 +4335,11 @@ nfsrpc_renew(struct nfsclclient *clp, struct nfsclds *dsp, struct ucred *cred,
|
||||
if (nmp == NULL)
|
||||
return (0);
|
||||
if (dsp == NULL)
|
||||
nfscl_reqstart(nd, NFSPROC_RENEW, nmp, NULL, 0, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_RENEW, nmp, NULL, 0, NULL, NULL, 0,
|
||||
0);
|
||||
else
|
||||
nfscl_reqstart(nd, NFSPROC_RENEW, nmp, NULL, 0, NULL,
|
||||
&dsp->nfsclds_sess);
|
||||
&dsp->nfsclds_sess, 0, 0);
|
||||
if (!NFSHASNFSV4N(nmp)) {
|
||||
/* NFSv4.1 just uses a Sequence Op and not a Renew. */
|
||||
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
||||
@ -4381,11 +4383,11 @@ nfsrpc_rellockown(struct nfsmount *nmp, struct nfscllockowner *lp,
|
||||
if (NFSHASNFSV4N(nmp)) {
|
||||
/* For NFSv4.1, do a FreeStateID. */
|
||||
nfscl_reqstart(nd, NFSPROC_FREESTATEID, nmp, NULL, 0, NULL,
|
||||
NULL);
|
||||
NULL, 0, 0);
|
||||
nfsm_stateidtom(nd, &lp->nfsl_stateid, NFSSTATEID_PUTSTATEID);
|
||||
} else {
|
||||
nfscl_reqstart(nd, NFSPROC_RELEASELCKOWN, nmp, NULL, 0, NULL,
|
||||
NULL);
|
||||
NULL, 0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
|
||||
tsep = nfsmnt_mdssession(nmp);
|
||||
*tl++ = tsep->nfsess_clientid.lval[0];
|
||||
@ -4418,7 +4420,8 @@ nfsrpc_getdirpath(struct nfsmount *nmp, u_char *dirpath, struct ucred *cred,
|
||||
int error, cnt, len, setnil;
|
||||
u_int32_t *opcntp;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_PUTROOTFH, nmp, NULL, 0, &opcntp, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_PUTROOTFH, nmp, NULL, 0, &opcntp, NULL, 0,
|
||||
0);
|
||||
cp = dirpath;
|
||||
cnt = 0;
|
||||
do {
|
||||
@ -4485,7 +4488,7 @@ nfsrpc_delegreturn(struct nfscldeleg *dp, struct ucred *cred,
|
||||
int error;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_DELEGRETURN, nmp, dp->nfsdl_fh,
|
||||
dp->nfsdl_fhlen, NULL, NULL);
|
||||
dp->nfsdl_fhlen, NULL, NULL, 0, 0);
|
||||
NFSM_BUILD(tl, u_int32_t *, NFSX_STATEID);
|
||||
if (NFSHASNFSV4N(nmp))
|
||||
*tl++ = 0;
|
||||
@ -4595,7 +4598,7 @@ nfsrpc_exchangeid(struct nfsmount *nmp, struct nfsclclient *clp,
|
||||
int error, len;
|
||||
|
||||
*dspp = NULL;
|
||||
nfscl_reqstart(nd, NFSPROC_EXCHANGEID, nmp, NULL, 0, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_EXCHANGEID, nmp, NULL, 0, NULL, NULL, 0, 0);
|
||||
NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
|
||||
*tl++ = txdr_unsigned(nfsboottime.tv_sec); /* Client owner */
|
||||
*tl = txdr_unsigned(clp->nfsc_rev);
|
||||
@ -4682,7 +4685,8 @@ nfsrpc_createsession(struct nfsmount *nmp, struct nfsclsession *sep,
|
||||
nmp->nm_rsize = NFS_MAXBSIZE;
|
||||
if (nmp->nm_wsize > NFS_MAXBSIZE || nmp->nm_wsize == 0)
|
||||
nmp->nm_wsize = NFS_MAXBSIZE;
|
||||
nfscl_reqstart(nd, NFSPROC_CREATESESSION, nmp, NULL, 0, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_CREATESESSION, nmp, NULL, 0, NULL, NULL, 0,
|
||||
0);
|
||||
NFSM_BUILD(tl, uint32_t *, 4 * NFSX_UNSIGNED);
|
||||
*tl++ = sep->nfsess_clientid.lval[0];
|
||||
*tl++ = sep->nfsess_clientid.lval[1];
|
||||
@ -4796,7 +4800,8 @@ nfsrpc_destroysession(struct nfsmount *nmp, struct nfsclclient *clp,
|
||||
int error;
|
||||
struct nfsclsession *tsep;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_DESTROYSESSION, nmp, NULL, 0, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_DESTROYSESSION, nmp, NULL, 0, NULL, NULL, 0,
|
||||
0);
|
||||
NFSM_BUILD(tl, uint32_t *, NFSX_V4SESSIONID);
|
||||
tsep = nfsmnt_mdssession(nmp);
|
||||
bcopy(tsep->nfsess_sessionid, tl, NFSX_V4SESSIONID);
|
||||
@ -4823,7 +4828,8 @@ nfsrpc_destroyclient(struct nfsmount *nmp, struct nfsclclient *clp,
|
||||
int error;
|
||||
struct nfsclsession *tsep;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_DESTROYCLIENT, nmp, NULL, 0, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_DESTROYCLIENT, nmp, NULL, 0, NULL, NULL, 0,
|
||||
0);
|
||||
NFSM_BUILD(tl, uint32_t *, 2 * NFSX_UNSIGNED);
|
||||
tsep = nfsmnt_mdssession(nmp);
|
||||
*tl++ = tsep->nfsess_clientid.lval[0];
|
||||
@ -4850,7 +4856,8 @@ nfsrpc_layoutget(struct nfsmount *nmp, uint8_t *fhp, int fhlen, int iomode,
|
||||
struct nfsrv_descript nfsd, *nd = &nfsd;
|
||||
int error;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_LAYOUTGET, nmp, fhp, fhlen, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_LAYOUTGET, nmp, fhp, fhlen, NULL, NULL, 0,
|
||||
0);
|
||||
nfsrv_setuplayoutget(nd, iomode, offset, len, minlen, stateidp,
|
||||
layoutlen, 0);
|
||||
nd->nd_flag |= ND_USEGSSNAME;
|
||||
@ -4886,7 +4893,8 @@ nfsrpc_getdeviceinfo(struct nfsmount *nmp, uint8_t *deviceid, int layouttype,
|
||||
|
||||
*ndip = NULL;
|
||||
ndi = NULL;
|
||||
nfscl_reqstart(nd, NFSPROC_GETDEVICEINFO, nmp, NULL, 0, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_GETDEVICEINFO, nmp, NULL, 0, NULL, NULL, 0,
|
||||
0);
|
||||
NFSM_BUILD(tl, uint32_t *, NFSX_V4DEVICEID + 3 * NFSX_UNSIGNED);
|
||||
NFSBCOPY(deviceid, tl, NFSX_V4DEVICEID);
|
||||
tl += (NFSX_V4DEVICEID / NFSX_UNSIGNED);
|
||||
@ -5039,7 +5047,8 @@ nfsrpc_layoutcommit(struct nfsmount *nmp, uint8_t *fh, int fhlen, int reclaim,
|
||||
struct nfsrv_descript nfsd, *nd = &nfsd;
|
||||
int error;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_LAYOUTCOMMIT, nmp, fh, fhlen, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_LAYOUTCOMMIT, nmp, fh, fhlen, NULL, NULL,
|
||||
0, 0);
|
||||
NFSM_BUILD(tl, uint32_t *, 5 * NFSX_UNSIGNED + 3 * NFSX_HYPER +
|
||||
NFSX_STATEID);
|
||||
txdr_hyper(off, tl);
|
||||
@ -5088,7 +5097,8 @@ nfsrpc_layoutreturn(struct nfsmount *nmp, uint8_t *fh, int fhlen, int reclaim,
|
||||
struct nfsrv_descript nfsd, *nd = &nfsd;
|
||||
int error;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_LAYOUTRETURN, nmp, fh, fhlen, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_LAYOUTRETURN, nmp, fh, fhlen, NULL, NULL,
|
||||
0, 0);
|
||||
NFSM_BUILD(tl, uint32_t *, 4 * NFSX_UNSIGNED);
|
||||
if (reclaim != 0)
|
||||
*tl++ = newnfs_true;
|
||||
@ -5390,7 +5400,8 @@ nfsrpc_reclaimcomplete(struct nfsmount *nmp, struct ucred *cred, NFSPROC_T *p)
|
||||
struct nfsrv_descript *nd = &nfsd;
|
||||
int error;
|
||||
|
||||
nfscl_reqstart(nd, NFSPROC_RECLAIMCOMPL, nmp, NULL, 0, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_RECLAIMCOMPL, nmp, NULL, 0, NULL, NULL, 0,
|
||||
0);
|
||||
NFSM_BUILD(tl, uint32_t *, NFSX_UNSIGNED);
|
||||
*tl = newnfs_false;
|
||||
nd->nd_flag |= ND_USEGSSNAME;
|
||||
@ -5697,7 +5708,7 @@ nfsrpc_readds(vnode_t vp, struct uio *uiop, nfsv4stateid_t *stateidp, int *eofp,
|
||||
|
||||
nd->nd_mrep = NULL;
|
||||
nfscl_reqstart(nd, NFSPROC_READDS, nmp, fhp->nfh_fh, fhp->nfh_len,
|
||||
NULL, &dsp->nfsclds_sess);
|
||||
NULL, &dsp->nfsclds_sess, 0, 0);
|
||||
nfsm_stateidtom(nd, stateidp, NFSSTATEID_PUTSEQIDZERO);
|
||||
NFSM_BUILD(tl, uint32_t *, NFSX_UNSIGNED * 3);
|
||||
txdr_hyper(io_off, tl);
|
||||
@ -5743,7 +5754,7 @@ nfsrpc_writeds(vnode_t vp, struct uio *uiop, int *iomode, int *must_commit,
|
||||
KASSERT(uiop->uio_iovcnt == 1, ("nfs: writerpc iovcnt > 1"));
|
||||
nd->nd_mrep = NULL;
|
||||
nfscl_reqstart(nd, NFSPROC_WRITEDS, nmp, fhp->nfh_fh, fhp->nfh_len,
|
||||
NULL, &dsp->nfsclds_sess);
|
||||
NULL, &dsp->nfsclds_sess, 0, 0);
|
||||
nfsm_stateidtom(nd, stateidp, NFSSTATEID_PUTSEQIDZERO);
|
||||
NFSM_BUILD(tl, uint32_t *, NFSX_HYPER + 2 * NFSX_UNSIGNED);
|
||||
txdr_hyper(io_off, tl);
|
||||
@ -5908,7 +5919,7 @@ nfsrpc_commitds(vnode_t vp, uint64_t offset, int cnt, struct nfsclds *dsp,
|
||||
|
||||
nd->nd_mrep = NULL;
|
||||
nfscl_reqstart(nd, NFSPROC_COMMITDS, nmp, fhp->nfh_fh, fhp->nfh_len,
|
||||
NULL, &dsp->nfsclds_sess);
|
||||
NULL, &dsp->nfsclds_sess, 0, 0);
|
||||
NFSM_BUILD(tl, uint32_t *, NFSX_HYPER + NFSX_UNSIGNED);
|
||||
txdr_hyper(offset, tl);
|
||||
tl += 2;
|
||||
@ -6187,7 +6198,8 @@ nfsrpc_openlayoutrpc(struct nfsmount *nmp, vnode_t vp, u_int8_t *nfhp,
|
||||
|
||||
*dpp = NULL;
|
||||
*laystatp = ENXIO;
|
||||
nfscl_reqstart(nd, NFSPROC_OPENLAYGET, nmp, nfhp, fhlen, NULL, NULL);
|
||||
nfscl_reqstart(nd, NFSPROC_OPENLAYGET, nmp, nfhp, fhlen, NULL, NULL,
|
||||
0, 0);
|
||||
NFSM_BUILD(tl, uint32_t *, 5 * NFSX_UNSIGNED);
|
||||
*tl++ = txdr_unsigned(op->nfso_own->nfsow_seqid);
|
||||
*tl++ = txdr_unsigned(mode & NFSV4OPEN_ACCESSBOTH);
|
||||
|
Loading…
x
Reference in New Issue
Block a user