--- /dev/null
+Fixed "Operation not permitted" error on reading an empty file: FUSE read/write
+ops should return a number of bytes actually read/written or -errno on error.
+Picked from upstream svn r336.
+Index: fuse/main.c
+===================================================================
+--- fuse/main.c.orig 2013-01-25 22:09:08.293124286 +0100
++++ fuse/main.c 2013-01-25 22:10:19.745121679 +0100
+@@ -155,19 +155,25 @@
+ static int fuse_exfat_read(const char* path, char* buffer, size_t size,
+ off_t offset, struct fuse_file_info* fi)
+ {
++ ssize_t ret;
++
+ exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
+- if (exfat_generic_pread(&ef, get_node(fi), buffer, size, offset) != size)
+- return EOF;
+- return size;
++ ret = exfat_generic_pread(&ef, get_node(fi), buffer, size, offset);
++ if (ret < 0)
++ return -EIO;
++ return ret;
+ }
+
+ static int fuse_exfat_write(const char* path, const char* buffer, size_t size,
+ off_t offset, struct fuse_file_info* fi)
+ {
++ ssize_t ret;
++
+ exfat_debug("[%s] %s (%zu bytes)", __func__, path, size);
+- if (exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset) != size)
+- return EOF;
+- return size;
++ ret = exfat_generic_pwrite(&ef, get_node(fi), buffer, size, offset);
++ if (ret < 0)
++ return -EIO;
++ return ret;
+ }
+
+ static int fuse_exfat_unlink(const char* path)
+Index: libexfat/io.c
+===================================================================
+--- libexfat/io.c.orig 2013-01-25 22:09:08.293124286 +0100
++++ libexfat/io.c 2013-01-25 22:10:19.745121679 +0100
+@@ -341,7 +341,7 @@
+ }
+ if (!ef->ro && !ef->noatime)
+ exfat_update_atime(node);
+- return size - remainder;
++ return MIN(size, node->size - offset) - remainder;
+ }
+
+ ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node,