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
This commit is contained in:
Elliott Hughes 2014-07-08 14:38:26 -07:00
parent 75b7171fcb
commit f6d6737529

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;