1/* 2 * Copyright (c) 2000-2003,2005 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 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. 8 * 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. 13 * 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 17 */ 18#include <xfs.h> 19 20/* Read from kernel buffer at src to user/kernel buffer defined 21 * by the uio structure. Advance the pointer in the uio struct 22 * as we go. 23 */ 24int 25xfs_uio_read(caddr_t src, size_t len, struct uio *uio) 26{ 27 size_t count; 28 29 if (!len || !uio->uio_resid) 30 return 0; 31 32 count = uio->uio_iov->iov_len; 33 if (!count) 34 return 0; 35 if (count > len) 36 count = len; 37 38 if (uio->uio_segflg == UIO_USERSPACE) { 39 if (copy_to_user(uio->uio_iov->iov_base, src, count)) 40 return EFAULT; 41 } else { 42 ASSERT(uio->uio_segflg == UIO_SYSSPACE); 43 memcpy(uio->uio_iov->iov_base, src, count); 44 } 45 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; 50 return 0; 51} 52