From 875e2fcb060554941d94714ad48ebbc0cbbf8077 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 9 Oct 2014 09:42:08 +0800 Subject: [PATCH] client: register callback for fuse interrupt libfuse allows program to reigster a callback for interrupt. When a file system operation is interrupted, the fuse kernel driver sends interupt request to libfuse. libfuse calls the interrupt callback when receiving interrupt request. Signed-off-by: Yan, Zheng (cherry picked from commit 289e8b4a7efa1ae6427115af9bbe541c9e1f0e90) --- src/client/Client.cc | 15 +++++++++++++++ src/client/Client.h | 8 ++++++-- src/client/fuse_ll.cc | 16 ++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 3736d67c85197..91262cfc3e38d 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -149,6 +149,7 @@ Client::Client(Messenger *m, MonClient *mc) logger(NULL), m_command_hook(this), timer(m->cct, client_lock), + switch_interrupt_cb(NULL), ino_invalidate_cb(NULL), ino_invalidate_cb_handle(NULL), dentry_invalidate_cb(NULL), @@ -7140,6 +7141,15 @@ void Client::ll_register_dentry_invalidate_cb(client_dentry_callback_t cb, void async_dentry_invalidator.start(); } +void Client::ll_register_switch_interrupt_cb(client_switch_interrupt_callback_t cb) +{ + Mutex::Locker l(client_lock); + ldout(cct, 10) << "ll_register_switch_interrupt_cb cb " << (void*)cb << dendl; + if (cb == NULL) + return; + switch_interrupt_cb = cb; +} + void Client::ll_register_getgroups_cb(client_getgroups_callback_t cb, void *handle) { Mutex::Locker l(client_lock); @@ -9021,6 +9031,11 @@ int Client::ll_flock(Fh *fh, int cmd, uint64_t owner) return _flock(fh, cmd, owner); } + +void Client::ll_interrupt(void *d) +{ +} + // ========================================= // layout diff --git a/src/client/Client.h b/src/client/Client.h index 41f4f4ba311ba..6c3274e38cc73 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -128,6 +128,7 @@ typedef void (*client_dentry_callback_t)(void *handle, vinodeno_t dirino, vinodeno_t ino, string& name); typedef int (*client_getgroups_callback_t)(void *handle, uid_t uid, gid_t **sgids); +typedef void(*client_switch_interrupt_callback_t)(void *req, void *data); // ======================================================== // client interface @@ -215,6 +216,8 @@ class Client : public Dispatcher { SafeTimer timer; + client_switch_interrupt_callback_t switch_interrupt_cb; + client_ino_callback_t ino_invalidate_cb; void *ino_invalidate_cb_handle; @@ -830,6 +833,7 @@ public: int ll_getlk(Fh *fh, struct flock *fl, uint64_t owner); int ll_setlk(Fh *fh, struct flock *fl, uint64_t owner, int sleep); int ll_flock(Fh *fh, int cmd, uint64_t owner); + void ll_interrupt(void *d); int ll_get_stripe_osd(struct Inode *in, uint64_t blockno, ceph_file_layout* layout); uint64_t ll_get_internal_offset(struct Inode *in, uint64_t blockno); @@ -837,11 +841,11 @@ public: int ll_num_osds(void); int ll_osdaddr(int osd, uint32_t *addr); int ll_osdaddr(int osd, char* buf, size_t size); - void ll_register_ino_invalidate_cb(client_ino_callback_t cb, void *handle); + void ll_register_ino_invalidate_cb(client_ino_callback_t cb, void *handle); void ll_register_dentry_invalidate_cb(client_dentry_callback_t cb, void *handle); - void ll_register_getgroups_cb(client_getgroups_callback_t cb, void *handle); + void ll_register_switch_interrupt_cb(client_switch_interrupt_callback_t cb); }; #endif diff --git a/src/client/fuse_ll.cc b/src/client/fuse_ll.cc index ef6629232f10b..cccb64287e259 100644 --- a/src/client/fuse_ll.cc +++ b/src/client/fuse_ll.cc @@ -666,6 +666,20 @@ static void fuse_ll_setlk(fuse_req_t req, fuse_ino_t ino, fuse_reply_err(req, -r); } +static void fuse_ll_interrupt(fuse_req_t req, void* data) +{ + CephFuse::Handle *cfuse = (CephFuse::Handle *)fuse_req_userdata(req); + cfuse->client->ll_interrupt(data); +} + +static void switch_interrupt_cb(void *req, void* data) +{ + if (data) + fuse_req_interrupt_func((fuse_req_t)req, fuse_ll_interrupt, data); + else + fuse_req_interrupt_func((fuse_req_t)req, NULL, NULL); +} + #if FUSE_VERSION >= FUSE_MAKE_VERSION(2, 9) static void fuse_ll_flock(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi, int cmd) @@ -910,6 +924,8 @@ int CephFuse::Handle::init(int argc, const char *argv[]) fuse_session_add_chan(se, ch); + client->ll_register_switch_interrupt_cb(switch_interrupt_cb); + /* * this is broken: * -- 2.39.5