]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: register callback for fuse interrupt
authorYan, Zheng <zyan@redhat.com>
Thu, 9 Oct 2014 01:42:08 +0000 (09:42 +0800)
committerGreg Farnum <gfarnum@redhat.com>
Fri, 13 Feb 2015 22:41:09 +0000 (14:41 -0800)
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 <zyan@redhat.com>
(cherry picked from commit 289e8b4a7efa1ae6427115af9bbe541c9e1f0e90)

src/client/Client.cc
src/client/Client.h
src/client/fuse_ll.cc

index 3736d67c85197575a098f4b5a30d96d9d2fd5ce2..91262cfc3e38d04a17202e79ef431ac57b36ed5b 100644 (file)
@@ -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
 
index 41f4f4ba311bafab2ee0e02f17fdfc8bcf5c1c92..6c3274e38cc73368ed191ec600fa2d3271578d2f 100644 (file)
@@ -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
index ef6629232f10bf8052e7d6d2deab6b8d37af300d..cccb64287e259e09f09d3811cce7825fb8668995 100644 (file)
@@ -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:
    *