+ktrgenio(ip, fd, rw, iov, len)
+ struct inode *ip;
+ enum uio_rw rw;
+ register struct iovec *iov;
+{
+ struct ktr_header *kth = ktrgetheader(KTR_GENIO);
+ register struct ktr_genio *ktp;
+ register caddr_t cp;
+ register int resid = len, cnt;
+
+ if (kth == NULL || u.u_error)
+ return;
+ MALLOC(ktp, struct ktr_genio *, sizeof(struct ktr_genio) + len,
+ M_TEMP, M_WAITOK);
+ if (ktp == NULL) {
+ printf("lost ktr_genio data buffer\n");
+ FREE(kth, M_TEMP);
+ return;
+ }
+ ktp->ktr_fd = fd;
+ ktp->ktr_rw = rw;
+ cp = (caddr_t)((char *)ktp + sizeof (struct ktr_genio));
+ while (resid > 0) {
+ if ((cnt = iov->iov_len) > resid)
+ cnt = resid;
+ if (copyin(iov->iov_base, cp, cnt))
+ goto done;
+ cp += cnt;
+ resid -= cnt;
+ iov++;
+ }
+ kth->ktr_buf = (caddr_t)ktp;
+ kth->ktr_len = sizeof (struct ktr_genio) + len;
+
+ ktrwrite(ip, kth);
+done:
+ FREE(kth, M_TEMP);
+ FREE(ktp, M_TEMP);
+}
+