653
654 /*
655 * XNFS and RFC1094 require us to return ENXIO if argument
656 * is not a link. BUGID 1138002.
657 */
658 if (vp->v_type != VLNK && !is_referral) {
659 VN_RELE(vp);
660 rl->rl_data = NULL;
661 rl->rl_status = NFSERR_NXIO;
662 return;
663 }
664
665 /*
666 * Allocate data for pathname. This will be freed by rfs_rlfree.
667 */
668 rl->rl_data = kmem_alloc(NFS_MAXPATHLEN, KM_SLEEP);
669
670 if (is_referral) {
671 char *s;
672 size_t strsz;
673
674 /* Get an artificial symlink based on a referral */
675 s = build_symlink(vp, cr, &strsz);
676 global_svstat_ptr[2][NFS_REFERLINKS].value.ui64++;
677 DTRACE_PROBE2(nfs2serv__func__referral__reflink,
678 vnode_t *, vp, char *, s);
679 if (s == NULL)
680 error = EINVAL;
681 else {
682 error = 0;
683 (void) strlcpy(rl->rl_data, s, NFS_MAXPATHLEN);
684 rl->rl_count = (uint32_t)MIN(strsz, NFS_MAXPATHLEN);
685 kmem_free(s, strsz);
686 }
687
688 } else {
689
690 /*
691 * Set up io vector to read sym link data
692 */
693 iov.iov_base = rl->rl_data;
694 iov.iov_len = NFS_MAXPATHLEN;
695 uio.uio_iov = &iov;
696 uio.uio_iovcnt = 1;
|
653
654 /*
655 * XNFS and RFC1094 require us to return ENXIO if argument
656 * is not a link. BUGID 1138002.
657 */
658 if (vp->v_type != VLNK && !is_referral) {
659 VN_RELE(vp);
660 rl->rl_data = NULL;
661 rl->rl_status = NFSERR_NXIO;
662 return;
663 }
664
665 /*
666 * Allocate data for pathname. This will be freed by rfs_rlfree.
667 */
668 rl->rl_data = kmem_alloc(NFS_MAXPATHLEN, KM_SLEEP);
669
670 if (is_referral) {
671 char *s;
672 size_t strsz;
673 kstat_named_t *stat =
674 exi->exi_ne->ne_globals->svstat[NFS_VERSION];
675
676 /* Get an artificial symlink based on a referral */
677 s = build_symlink(vp, cr, &strsz);
678 stat[NFS_REFERLINKS].value.ui64++;
679 DTRACE_PROBE2(nfs2serv__func__referral__reflink,
680 vnode_t *, vp, char *, s);
681 if (s == NULL)
682 error = EINVAL;
683 else {
684 error = 0;
685 (void) strlcpy(rl->rl_data, s, NFS_MAXPATHLEN);
686 rl->rl_count = (uint32_t)MIN(strsz, NFS_MAXPATHLEN);
687 kmem_free(s, strsz);
688 }
689
690 } else {
691
692 /*
693 * Set up io vector to read sym link data
694 */
695 iov.iov_base = rl->rl_data;
696 iov.iov_len = NFS_MAXPATHLEN;
697 uio.uio_iov = &iov;
698 uio.uio_iovcnt = 1;
|