From 49e9344bddca3699c04f3da8c689d0f2b1a338b6 Mon Sep 17 00:00:00 2001 From: Arpad Horvath <secracon@gmail.com> Date: Tue, 18 Feb 2014 10:18:25 +0100 Subject: [PATCH] sdcard: direct I/O file access write buffer alignment It is not enough to align the read buffer only, because consequent writes might still fail with EINVAL. The write buffer should be also aligned according to the write(2) manual page. Change-Id: I7547dec5208732c56f4466c1b0c88f36dabacf5b --- sdcard/sdcard.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdcard/sdcard.c b/sdcard/sdcard.c index 3bc8cd3f7..cb03316f4 100644 --- a/sdcard/sdcard.c +++ b/sdcard/sdcard.c @@ -1244,6 +1244,12 @@ static int handle_write(struct fuse* fuse, struct fuse_handler* handler, struct fuse_write_out out; struct handle *h = id_to_ptr(req->fh); int res; + __u8 aligned_buffer[req->size] __attribute__((__aligned__(PAGESIZE))); + + if (req->flags & O_DIRECT) { + memcpy(aligned_buffer, buffer, req->size); + buffer = (const __u8*) aligned_buffer; + } TRACE("[%d] WRITE %p(%d) %u@%llu\n", handler->token, h, h->fd, req->size, req->offset);