am f7cf1a06: Merge "sdcard: direct I/O file access fix"
* commit 'f7cf1a062ef27b6579b9afb876d635a307b3d5d3': sdcard: direct I/O file access fix
This commit is contained in:
commit
6e6140e0ad
1 changed files with 5 additions and 4 deletions
|
|
@ -232,7 +232,7 @@ struct fuse_handler {
|
||||||
* buffer at the same time. This allows us to share the underlying storage. */
|
* buffer at the same time. This allows us to share the underlying storage. */
|
||||||
union {
|
union {
|
||||||
__u8 request_buffer[MAX_REQUEST_SIZE];
|
__u8 request_buffer[MAX_REQUEST_SIZE];
|
||||||
__u8 read_buffer[MAX_READ];
|
__u8 read_buffer[MAX_READ + PAGESIZE];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1218,6 +1218,7 @@ static int handle_read(struct fuse* fuse, struct fuse_handler* handler,
|
||||||
__u32 size = req->size;
|
__u32 size = req->size;
|
||||||
__u64 offset = req->offset;
|
__u64 offset = req->offset;
|
||||||
int res;
|
int res;
|
||||||
|
__u8 *read_buffer = (__u8 *) ((uintptr_t)(handler->read_buffer + PAGESIZE) & ~((uintptr_t)PAGESIZE-1));
|
||||||
|
|
||||||
/* Don't access any other fields of hdr or req beyond this point, the read buffer
|
/* Don't access any other fields of hdr or req beyond this point, the read buffer
|
||||||
* overlaps the request buffer and will clobber data in the request. This
|
* overlaps the request buffer and will clobber data in the request. This
|
||||||
|
|
@ -1225,14 +1226,14 @@ static int handle_read(struct fuse* fuse, struct fuse_handler* handler,
|
||||||
|
|
||||||
TRACE("[%d] READ %p(%d) %u@%llu\n", handler->token,
|
TRACE("[%d] READ %p(%d) %u@%llu\n", handler->token,
|
||||||
h, h->fd, size, offset);
|
h, h->fd, size, offset);
|
||||||
if (size > sizeof(handler->read_buffer)) {
|
if (size > MAX_READ) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
res = pread64(h->fd, handler->read_buffer, size, offset);
|
res = pread64(h->fd, read_buffer, size, offset);
|
||||||
if (res < 0) {
|
if (res < 0) {
|
||||||
return -errno;
|
return -errno;
|
||||||
}
|
}
|
||||||
fuse_reply(fuse, unique, handler->read_buffer, res);
|
fuse_reply(fuse, unique, read_buffer, res);
|
||||||
return NO_STATUS;
|
return NO_STATUS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue