void afs_osi_SetTime(osi_timeval_t * tvp) { #if defined(AFS_LINUX24_ENV) struct timeval tv; tv.tv_sec = tvp->tv_sec; tv.tv_usec = tvp->tv_usec; AFS_STATCNT(osi_SetTime); do_settimeofday(&tv); #else extern int (*sys_settimeofdayp) (struct timeval * tv, struct timezone * tz); KERNEL_SPACE_DECL; AFS_STATCNT(osi_SetTime); TO_USER_SPACE(); if (sys_settimeofdayp) (void)(*sys_settimeofdayp) (tvp, NULL); TO_KERNEL_SPACE(); #endif }
/* osi_rdwr * seek, then read or write to an open inode. addrp points to data in * kernel space. */ int osi_rdwr(struct osi_file *osifile, uio_t * uiop, int rw) { struct file *filp = &osifile->file; KERNEL_SPACE_DECL; int code = 0; struct iovec *iov; afs_size_t count; unsigned long savelim; savelim = current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur; current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY; if (uiop->uio_seg == AFS_UIOSYS) TO_USER_SPACE(); /* seek to the desired position. Return -1 on error. */ if (filp->f_op->llseek) { if (filp->f_op->llseek(filp, (loff_t) uiop->uio_offset, 0) != uiop->uio_offset) return -1; } else filp->f_pos = uiop->uio_offset; while (code == 0 && uiop->uio_resid > 0 && uiop->uio_iovcnt > 0) { iov = uiop->uio_iov; count = iov->iov_len; if (count == 0) { uiop->uio_iov++; uiop->uio_iovcnt--; continue; } if (rw == UIO_READ) code = FOP_READ(filp, iov->iov_base, count); else code = FOP_WRITE(filp, iov->iov_base, count); if (code < 0) { code = -code; break; } else if (code == 0) { /* * This is bad -- we can't read any more data from the * file, but we have no good way of signaling a partial * read either. */ code = EIO; break; } iov->iov_base += code; iov->iov_len -= code; uiop->uio_resid -= code; uiop->uio_offset += code; code = 0; } if (uiop->uio_seg == AFS_UIOSYS) TO_KERNEL_SPACE(); current->TASK_STRUCT_RLIM[RLIMIT_FSIZE].rlim_cur = savelim; return code; }