From: Csaba Henk Date: Thu, 10 May 2007 22:56:46 +0000 (+0000) Subject: various flush related fixes in hi-lib X-Git-Tag: fuse_2_7_0~16 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=79b9e9f2d702d2874f4d8f7dec0af4eaf980327c;p=qemu-gpiodev%2Flibfuse.git various flush related fixes in hi-lib --- diff --git a/ChangeLog b/ChangeLog index 5c536e7..c2baf37 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,9 @@ 2007-05-11 Csaba Henk - * Fix return value of fuse_loop()/fuse_loop_mt(). - Error reported by Csaba Henk, fix by Miklos Szeredi. + * libfuse: fix return value of fuse_loop()/fuse_loop_mt(). + Error reported by Csaba Henk, fix by Miklos Szeredi + + * libfuse: various flush related fixes 2007-05-03 Miklos Szeredi diff --git a/lib/fuse.c b/lib/fuse.c index ce5d9af..817b16f 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -2025,37 +2025,6 @@ static void fuse_lib_write(fuse_req_t req, fuse_ino_t ino, const char *buf, reply_err(req, res); } -static void fuse_lib_release(fuse_req_t req, fuse_ino_t ino, - struct fuse_file_info *fi) -{ - struct fuse *f = req_fuse_prepare(req); - struct fuse_intr_data d; - char *path; - int err = 0; - - pthread_rwlock_rdlock(&f->tree_lock); - path = get_path(f, ino); - if (f->conf.debug) { - printf("RELEASE%s[%llu] flags: 0x%x\n", fi->flush ? "+FLUSH" : "", - (unsigned long long) fi->fh, fi->flags); - fflush(stdout); - } - fuse_prepare_interrupt(f, req, &d); - if (fi->flush && path) { - err = fuse_fs_flush(f->fs, path, fi); - if (err == -ENOSYS) - err = 0; - } - fuse_do_release(f, ino, path, fi); - fuse_finish_interrupt(f, req, &d); - - if (path) - free(path); - pthread_rwlock_unlock(&f->tree_lock); - - reply_err(req, err); -} - static void fuse_lib_fsync(fuse_req_t req, fuse_ino_t ino, int datasync, struct fuse_file_info *fi) { @@ -2610,6 +2579,63 @@ static void lock_to_flock(struct lock *lock, struct flock *flock) flock->l_pid = lock->pid; } +static void fuse_flush_common(struct fuse_fs *fs, const char *path, + struct fuse_file_info *fi, + struct flock *lock, int *err, int *errlock) +{ + *err = fuse_fs_flush(fs, path, fi); + + memset(lock, 0, sizeof(*lock)); + lock->l_type = F_UNLCK; + lock->l_whence = SEEK_SET; + *errlock = fuse_fs_lock(fs, path, fi, F_SETLK, lock); +} + +static void fuse_lib_release(fuse_req_t req, fuse_ino_t ino, + struct fuse_file_info *fi) +{ + struct fuse *f = req_fuse_prepare(req); + struct fuse_intr_data d; + struct flock lock; + struct lock l; + char *path; + int err = 0; + int errlock = -ENOSYS; + + pthread_rwlock_rdlock(&f->tree_lock); + path = get_path(f, ino); + if (!path) + path = "-"; + if (f->conf.debug) { + printf("RELEASE%s[%llu] flags: 0x%x\n", fi->flush ? "+FLUSH" : "", + (unsigned long long) fi->fh, fi->flags); + fflush(stdout); + } + fuse_prepare_interrupt(f, req, &d); + if (fi->flush) { + fuse_flush_common(f->fs, path, fi, &lock, &err, &errlock); + if (err == -ENOSYS && errlock == -ENOSYS) + err = 0; + else if (err == -ENOSYS || !err) + err = errlock; + } + fuse_do_release(f, ino, path, fi); + fuse_finish_interrupt(f, req, &d); + if (errlock != -ENOSYS) { + flock_to_lock(&lock, &l); + l.owner = fi->lock_owner; + pthread_mutex_lock(&f->lock); + locks_insert(get_node(f, ino), &l); + pthread_mutex_unlock(&f->lock); + } + + if (path) + free(path); + pthread_rwlock_unlock(&f->tree_lock); + + reply_err(req, err); +} + static void fuse_lib_flush(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi) { @@ -2629,15 +2655,9 @@ static void fuse_lib_flush(fuse_req_t req, fuse_ino_t ino, fflush(stdout); } fuse_prepare_interrupt(f, req, &d); - if (path) - err = fuse_fs_flush(f->fs, path, fi); - - memset(&lock, 0, sizeof(lock)); - lock.l_type = F_UNLCK; - lock.l_whence = SEEK_SET; - errlock = fuse_fs_lock(f->fs, path, fi, F_SETLK, &lock); + fuse_flush_common(f->fs, path ? path : "-" , fi, &lock, &err, &errlock); fuse_finish_interrupt(f, req, &d); - if (errlock != ENOSYS) { + if (errlock != -ENOSYS) { flock_to_lock(&lock, &l); l.owner = fi->lock_owner; pthread_mutex_lock(&f->lock);