… | |
… | |
57 | #include <sys/stat.h> |
57 | #include <sys/stat.h> |
58 | #include <sys/statvfs.h> |
58 | #include <sys/statvfs.h> |
59 | #include <limits.h> |
59 | #include <limits.h> |
60 | #include <fcntl.h> |
60 | #include <fcntl.h> |
61 | #include <assert.h> |
61 | #include <assert.h> |
|
|
62 | |
|
|
63 | /* intptr_t comes from unistd.h, says POSIX/UNIX/tradition */ |
|
|
64 | /* intptr_t only comes form stdint.h, says idiot openbsd coder */ |
|
|
65 | #if HAVE_STDINT_H |
|
|
66 | # include <stdint.h> |
|
|
67 | #endif |
62 | |
68 | |
63 | #ifndef EIO_FINISH |
69 | #ifndef EIO_FINISH |
64 | # define EIO_FINISH(req) ((req)->finish) && !EIO_CANCELLED (req) ? (req)->finish (req) : 0 |
70 | # define EIO_FINISH(req) ((req)->finish) && !EIO_CANCELLED (req) ? (req)->finish (req) : 0 |
65 | #endif |
71 | #endif |
66 | |
72 | |
… | |
… | |
1517 | } |
1523 | } |
1518 | |
1524 | |
1519 | #endif |
1525 | #endif |
1520 | |
1526 | |
1521 | int |
1527 | int |
1522 | eio__mtouch (void *mem, size_t len, int flags) |
1528 | eio__mtouch (eio_req *req) |
1523 | { |
1529 | { |
|
|
1530 | void *mem = req->ptr2; |
|
|
1531 | size_t len = req->size; |
|
|
1532 | int flags = req->int1; |
|
|
1533 | |
1524 | eio_page_align (&mem, &len); |
1534 | eio_page_align (&mem, &len); |
1525 | |
1535 | |
1526 | { |
1536 | { |
1527 | intptr_t addr = (intptr_t)mem; |
1537 | intptr_t addr = (intptr_t)mem; |
1528 | intptr_t end = addr + len; |
1538 | intptr_t end = addr + len; |
1529 | intptr_t page = eio_pagesize (); |
1539 | intptr_t page = eio_pagesize (); |
1530 | |
1540 | |
1531 | if (addr < end) |
1541 | if (addr < end) |
1532 | if (flags & EIO_MT_MODIFY) /* modify */ |
1542 | if (flags & EIO_MT_MODIFY) /* modify */ |
1533 | do { *((volatile sig_atomic_t *)addr) |= 0; } while ((addr += page) < len); |
1543 | do { *((volatile sig_atomic_t *)addr) |= 0; } while ((addr += page) < len && !EIO_CANCELLED (req)); |
1534 | else |
1544 | else |
1535 | do { *((volatile sig_atomic_t *)addr) ; } while ((addr += page) < len); |
1545 | do { *((volatile sig_atomic_t *)addr) ; } while ((addr += page) < len && !EIO_CANCELLED (req)); |
1536 | } |
1546 | } |
1537 | |
1547 | |
1538 | return 0; |
1548 | return 0; |
1539 | } |
1549 | } |
1540 | |
1550 | |
… | |
… | |
1714 | |
1724 | |
1715 | case EIO_SYNC: req->result = 0; sync (); break; |
1725 | case EIO_SYNC: req->result = 0; sync (); break; |
1716 | case EIO_FSYNC: req->result = fsync (req->int1); break; |
1726 | case EIO_FSYNC: req->result = fsync (req->int1); break; |
1717 | case EIO_FDATASYNC: req->result = fdatasync (req->int1); break; |
1727 | case EIO_FDATASYNC: req->result = fdatasync (req->int1); break; |
1718 | case EIO_MSYNC: req->result = eio__msync (req->ptr2, req->size, req->int1); break; |
1728 | case EIO_MSYNC: req->result = eio__msync (req->ptr2, req->size, req->int1); break; |
1719 | case EIO_MTOUCH: req->result = eio__mtouch (req->ptr2, req->size, req->int1); break; |
1729 | case EIO_MTOUCH: req->result = eio__mtouch (req); break; |
1720 | case EIO_MLOCK: req->result = eio__mlock (req->ptr2, req->size); break; |
1730 | case EIO_MLOCK: req->result = eio__mlock (req->ptr2, req->size); break; |
1721 | case EIO_MLOCKALL: req->result = eio__mlockall (req->int1); break; |
1731 | case EIO_MLOCKALL: req->result = eio__mlockall (req->int1); break; |
1722 | case EIO_SYNC_FILE_RANGE: req->result = eio__sync_file_range (req->int1, req->offs, req->size, req->int2); break; |
1732 | case EIO_SYNC_FILE_RANGE: req->result = eio__sync_file_range (req->int1, req->offs, req->size, req->int2); break; |
1723 | |
1733 | |
1724 | case EIO_READDIR: eio__scandir (req, self); break; |
1734 | case EIO_READDIR: eio__scandir (req, self); break; |