2  * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc.
 
   5  * This program is free software; you can redistribute it and/or
 
   6  * modify it under the terms of the GNU General Public License as
 
   7  * published by the Free Software Foundation.
 
   9  * This program is distributed in the hope that it would be useful,
 
  10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  12  * GNU General Public License for more details.
 
  14  * You should have received a copy of the GNU General Public License
 
  15  * along with this program; if not, write the Free Software Foundation,
 
  16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
  20 /* Read from kernel buffer at src to user/kernel buffer defined
 
  21  * by the uio structure. Advance the pointer in the uio struct
 
  25 uio_read(caddr_t src, size_t len, struct uio *uio)
 
  29         if (!len || !uio->uio_resid)
 
  32         count = uio->uio_iov->iov_len;
 
  38         if (uio->uio_segflg == UIO_USERSPACE) {
 
  39                 if (copy_to_user(uio->uio_iov->iov_base, src, count))
 
  42                 ASSERT(uio->uio_segflg == UIO_SYSSPACE);
 
  43                 memcpy(uio->uio_iov->iov_base, src, count);
 
  46         uio->uio_iov->iov_base = (void*)((char*)uio->uio_iov->iov_base + count);
 
  47         uio->uio_iov->iov_len -= count;
 
  48         uio->uio_offset += count;
 
  49         uio->uio_resid -= count;