Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 #include <unistd.h>
0003 #include <stdbool.h>
0004 #include <errno.h>
0005 #include <linux/kernel.h>
0006 #include <internal/lib.h>
0007 
0008 unsigned int page_size;
0009 
0010 static ssize_t ion(bool is_read, int fd, void *buf, size_t n)
0011 {
0012     void *buf_start = buf;
0013     size_t left = n;
0014 
0015     while (left) {
0016         /* buf must be treated as const if !is_read. */
0017         ssize_t ret = is_read ? read(fd, buf, left) :
0018                     write(fd, buf, left);
0019 
0020         if (ret < 0 && errno == EINTR)
0021             continue;
0022         if (ret <= 0)
0023             return ret;
0024 
0025         left -= ret;
0026         buf  += ret;
0027     }
0028 
0029     BUG_ON((size_t)(buf - buf_start) != n);
0030     return n;
0031 }
0032 
0033 /*
0034  * Read exactly 'n' bytes or return an error.
0035  */
0036 ssize_t readn(int fd, void *buf, size_t n)
0037 {
0038     return ion(true, fd, buf, n);
0039 }
0040 
0041 ssize_t preadn(int fd, void *buf, size_t n, off_t offs)
0042 {
0043     size_t left = n;
0044 
0045     while (left) {
0046         ssize_t ret = pread(fd, buf, left, offs);
0047 
0048         if (ret < 0 && errno == EINTR)
0049             continue;
0050         if (ret <= 0)
0051             return ret;
0052 
0053         left -= ret;
0054         buf  += ret;
0055         offs += ret;
0056     }
0057 
0058     return n;
0059 }
0060 
0061 /*
0062  * Write exactly 'n' bytes or return an error.
0063  */
0064 ssize_t writen(int fd, const void *buf, size_t n)
0065 {
0066     /* ion does not modify buf. */
0067     return ion(false, fd, (void *)buf, n);
0068 }