Merge master.kernel.org:/home/rmk/linux-2.6-arm
[linux-2.6] / fs / xfs / support / move.c
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  */
24 int
25 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 }