Added kernel private vfs_vnode_io() which performs an io_request on a
vnode (falling back to synchronous I/O if the io() is not supported). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26672 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -97,6 +97,7 @@ status_t vfs_read_pages(struct vnode *vnode, void *cookie, off_t pos,
|
|||||||
const iovec *vecs, size_t count, size_t *_numBytes);
|
const iovec *vecs, size_t count, size_t *_numBytes);
|
||||||
status_t vfs_write_pages(struct vnode *vnode, void *cookie, off_t pos,
|
status_t vfs_write_pages(struct vnode *vnode, void *cookie, off_t pos,
|
||||||
const iovec *vecs, size_t count, size_t *_numBytes);
|
const iovec *vecs, size_t count, size_t *_numBytes);
|
||||||
|
status_t vfs_vnode_io(struct vnode* vnode, void* cookie, io_request* request);
|
||||||
status_t vfs_synchronous_io(io_request* request,
|
status_t vfs_synchronous_io(io_request* request,
|
||||||
status_t (*doIO)(void* cookie, off_t offset, void* buffer,
|
status_t (*doIO)(void* cookie, off_t offset, void* buffer,
|
||||||
size_t length),
|
size_t length),
|
||||||
|
|||||||
@@ -310,7 +310,21 @@ synchronous_io(io_request* request, DoIO& io)
|
|||||||
// #pragma mark - kernel private API
|
// #pragma mark - kernel private API
|
||||||
|
|
||||||
|
|
||||||
extern "C" status_t
|
status_t
|
||||||
|
vfs_vnode_io(struct vnode* vnode, void* cookie, io_request* request)
|
||||||
|
{
|
||||||
|
if (!HAS_FS_CALL(vnode, io)) {
|
||||||
|
// no io() call -- fall back to synchronous I/O
|
||||||
|
IOBuffer* buffer = request->Buffer();
|
||||||
|
VnodeIO io(request->IsWrite(), buffer->IsPhysical(), vnode, cookie);
|
||||||
|
return synchronous_io(request, io);
|
||||||
|
}
|
||||||
|
|
||||||
|
return FS_CALL(vnode, io, cookie, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
vfs_synchronous_io(io_request* request,
|
vfs_synchronous_io(io_request* request,
|
||||||
status_t (*doIO)(void* cookie, off_t offset, void* buffer, size_t length),
|
status_t (*doIO)(void* cookie, off_t offset, void* buffer, size_t length),
|
||||||
void* cookie)
|
void* cookie)
|
||||||
@@ -325,7 +339,7 @@ vfs_synchronous_io(io_request* request,
|
|||||||
// #pragma mark - public API
|
// #pragma mark - public API
|
||||||
|
|
||||||
|
|
||||||
extern "C" status_t
|
status_t
|
||||||
do_fd_io(int fd, io_request* request)
|
do_fd_io(int fd, io_request* request)
|
||||||
{
|
{
|
||||||
struct vnode* vnode;
|
struct vnode* vnode;
|
||||||
@@ -337,19 +351,11 @@ do_fd_io(int fd, io_request* request)
|
|||||||
|
|
||||||
CObjectDeleter<file_descriptor> descriptorPutter(descriptor, put_fd);
|
CObjectDeleter<file_descriptor> descriptorPutter(descriptor, put_fd);
|
||||||
|
|
||||||
if (!HAS_FS_CALL(vnode, io)) {
|
return vfs_vnode_io(vnode, descriptor->cookie, request);
|
||||||
// no io() call -- fall back to synchronous I/O
|
|
||||||
IOBuffer* buffer = request->Buffer();
|
|
||||||
VnodeIO io(request->IsWrite(), buffer->IsPhysical(), vnode,
|
|
||||||
descriptor->cookie);
|
|
||||||
return synchronous_io(request, io);
|
|
||||||
}
|
|
||||||
|
|
||||||
return FS_CALL(vnode, io, descriptor->cookie, request);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern "C" status_t
|
status_t
|
||||||
do_iterative_fd_io(int fd, io_request* request, iterative_io_get_vecs getVecs,
|
do_iterative_fd_io(int fd, io_request* request, iterative_io_get_vecs getVecs,
|
||||||
iterative_io_finished finished, void* cookie)
|
iterative_io_finished finished, void* cookie)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user