826 bslabel_t *clabel = req->rq_label;
827
828 ASSERT(clabel != NULL);
829 DTRACE_PROBE2(tx__rfs3__log__info__opreadlink__clabel, char *,
830 "got client label from request(1)", struct svc_req *, req);
831
832 if (!blequal(&l_admin_low->tsl_label, clabel)) {
833 if (!do_rfs_label_check(clabel, vp, DOMINANCE_CHECK,
834 exi)) {
835 resp->status = NFS3ERR_ACCES;
836 goto out1;
837 }
838 }
839 }
840
841 data = kmem_alloc(MAXPATHLEN + 1, KM_SLEEP);
842
843 if (is_referral) {
844 char *s;
845 size_t strsz;
846
847 /* Get an artificial symlink based on a referral */
848 s = build_symlink(vp, cr, &strsz);
849 global_svstat_ptr[3][NFS_REFERLINKS].value.ui64++;
850 DTRACE_PROBE2(nfs3serv__func__referral__reflink,
851 vnode_t *, vp, char *, s);
852 if (s == NULL)
853 error = EINVAL;
854 else {
855 error = 0;
856 (void) strlcpy(data, s, MAXPATHLEN + 1);
857 kmem_free(s, strsz);
858 }
859
860 } else {
861
862 iov.iov_base = data;
863 iov.iov_len = MAXPATHLEN;
864 uio.uio_iov = &iov;
865 uio.uio_iovcnt = 1;
866 uio.uio_segflg = UIO_SYSSPACE;
867 uio.uio_extflg = UIO_COPY_CACHED;
868 uio.uio_loffset = 0;
869 uio.uio_resid = MAXPATHLEN;
|
826 bslabel_t *clabel = req->rq_label;
827
828 ASSERT(clabel != NULL);
829 DTRACE_PROBE2(tx__rfs3__log__info__opreadlink__clabel, char *,
830 "got client label from request(1)", struct svc_req *, req);
831
832 if (!blequal(&l_admin_low->tsl_label, clabel)) {
833 if (!do_rfs_label_check(clabel, vp, DOMINANCE_CHECK,
834 exi)) {
835 resp->status = NFS3ERR_ACCES;
836 goto out1;
837 }
838 }
839 }
840
841 data = kmem_alloc(MAXPATHLEN + 1, KM_SLEEP);
842
843 if (is_referral) {
844 char *s;
845 size_t strsz;
846 kstat_named_t *stat = exi->exi_ne->ne_globals->svstat[NFS_V3];
847
848 /* Get an artificial symlink based on a referral */
849 s = build_symlink(vp, cr, &strsz);
850 stat[NFS_REFERLINKS].value.ui64++;
851 DTRACE_PROBE2(nfs3serv__func__referral__reflink,
852 vnode_t *, vp, char *, s);
853 if (s == NULL)
854 error = EINVAL;
855 else {
856 error = 0;
857 (void) strlcpy(data, s, MAXPATHLEN + 1);
858 kmem_free(s, strsz);
859 }
860
861 } else {
862
863 iov.iov_base = data;
864 iov.iov_len = MAXPATHLEN;
865 uio.uio_iov = &iov;
866 uio.uio_iovcnt = 1;
867 uio.uio_segflg = UIO_SYSSPACE;
868 uio.uio_extflg = UIO_COPY_CACHED;
869 uio.uio_loffset = 0;
870 uio.uio_resid = MAXPATHLEN;
|