From f6d6737529ea164fd2ea79f02cc78a46bb9260f5 Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 8 Jul 2014 14:38:26 -0700 Subject: [PATCH] Fix sdcard's FUSE_FSYNCDIR handling. For a file the FUSE fh is a struct handle containing an int fd; for a directory it's a struct dirhandle containing a DIR*. Fix handle_fsync to extract the file descriptor appropriately in both cases. Bug: 14613980 Change-Id: I45515cff6638e27a99b849e6fc639d355dbb4d27 --- sdcard/sdcard.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/sdcard/sdcard.c b/sdcard/sdcard.c index 566a66cc4..844ca656c 100644 --- a/sdcard/sdcard.c +++ b/sdcard/sdcard.c @@ -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;