am 6e141aea: Merge "Fix sdcard\'s FUSE_FSYNCDIR handling."

* commit '6e141aea189769a428a7da6c2206df6d0ed2c69d':
  Fix sdcard's FUSE_FSYNCDIR handling.
This commit is contained in:
Elliott Hughes 2014-07-08 22:25:12 +00:00 committed by Android Git Automerger
commit 060b6ecb66

View file

@ -1309,14 +1309,23 @@ static int handle_release(struct fuse* fuse, struct fuse_handler* handler,
static int handle_fsync(struct fuse* fuse, struct fuse_handler* handler,
const struct fuse_in_header* hdr, const struct fuse_fsync_in* req)
{
int is_data_sync = req->fsync_flags & 1;
struct handle *h = id_to_ptr(req->fh);
int res;
bool is_dir = (hdr->opcode == FUSE_FSYNCDIR);
bool is_data_sync = req->fsync_flags & 1;
TRACE("[%d] FSYNC %p(%d) is_data_sync=%d\n", handler->token,
h, h->fd, is_data_sync);
res = is_data_sync ? fdatasync(h->fd) : fsync(h->fd);
if (res < 0) {
int fd = -1;
if (is_dir) {
struct dirhandle *dh = id_to_ptr(req->fh);
fd = dirfd(dh->d);
} else {
struct handle *h = id_to_ptr(req->fh);
fd = h->fd;
}
TRACE("[%d] %s %p(%d) is_data_sync=%d\n", handler->token,
is_dir ? "FSYNCDIR" : "FSYNC",
id_to_ptr(req->fh), fd, is_data_sync);
int res = is_data_sync ? fdatasync(fd) : fsync(fd);
if (res == -1) {
return -errno;
}
return 0;