… | |
… | |
768 | } |
768 | } |
769 | |
769 | |
770 | /*****************************************************************************/ |
770 | /*****************************************************************************/ |
771 | |
771 | |
772 | #define ALLOC(len) \ |
772 | #define ALLOC(len) \ |
773 | X_LOCK (wrklock); \ |
|
|
774 | req->flags |= EIO_FLAG_PTR2_FREE; \ |
|
|
775 | X_UNLOCK (wrklock); \ |
|
|
776 | req->ptr2 = malloc (len); \ |
|
|
777 | if (!req->ptr2) \ |
773 | if (!req->ptr2) \ |
778 | { \ |
774 | { \ |
|
|
775 | X_LOCK (wrklock); \ |
|
|
776 | req->flags |= EIO_FLAG_PTR2_FREE; \ |
|
|
777 | X_UNLOCK (wrklock); \ |
|
|
778 | req->ptr2 = malloc (len); \ |
|
|
779 | if (!req->ptr2) \ |
|
|
780 | { \ |
779 | errno = ENOMEM; \ |
781 | errno = ENOMEM; \ |
780 | req->result = -1; \ |
782 | req->result = -1; \ |
781 | break; \ |
783 | break; \ |
|
|
784 | } \ |
782 | } |
785 | } |
783 | |
786 | |
784 | X_THREAD_PROC (eio_proc) |
787 | X_THREAD_PROC (eio_proc) |
785 | { |
788 | { |
786 | eio_req *req; |
789 | eio_req *req; |
… | |
… | |
832 | errno = 0; /* strictly unnecessary */ |
835 | errno = 0; /* strictly unnecessary */ |
833 | |
836 | |
834 | if (!EIO_CANCELLED (req)) |
837 | if (!EIO_CANCELLED (req)) |
835 | switch (req->type) |
838 | switch (req->type) |
836 | { |
839 | { |
|
|
840 | case EIO_READ: ALLOC (req->size); |
837 | case EIO_READ: req->result = req->offs >= 0 |
841 | req->result = req->offs >= 0 |
838 | ? pread (req->int1, req->ptr2, req->size, req->offs) |
842 | ? pread (req->int1, req->ptr2, req->size, req->offs) |
839 | : read (req->int1, req->ptr2, req->size); break; |
843 | : read (req->int1, req->ptr2, req->size); break; |
840 | case EIO_WRITE: req->result = req->offs >= 0 |
844 | case EIO_WRITE: req->result = req->offs >= 0 |
841 | ? pwrite (req->int1, req->ptr2, req->size, req->offs) |
845 | ? pwrite (req->int1, req->ptr2, req->size, req->offs) |
842 | : write (req->int1, req->ptr2, req->size); break; |
846 | : write (req->int1, req->ptr2, req->size); break; |
… | |
… | |
866 | case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; |
870 | case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; |
867 | case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; |
871 | case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; |
868 | case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; |
872 | case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; |
869 | case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; |
873 | case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; |
870 | case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; |
874 | case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; |
|
|
875 | |
871 | case EIO_READLINK: ALLOC (NAME_MAX); |
876 | case EIO_READLINK: ALLOC (NAME_MAX); |
872 | req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; |
877 | req->result = readlink (req->ptr1, req->ptr2, NAME_MAX); break; |
873 | |
878 | |
874 | case EIO_SYNC: req->result = 0; sync (); break; |
879 | case EIO_SYNC: req->result = 0; sync (); break; |
875 | case EIO_FSYNC: req->result = fsync (req->int1); break; |
880 | case EIO_FSYNC: req->result = fsync (req->int1); break; |