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),
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);
return _flock(fh, cmd, owner);
}
+
+void Client::ll_interrupt(void *d)
+{
+}
+
// =========================================
// layout
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
SafeTimer timer;
+ client_switch_interrupt_callback_t switch_interrupt_cb;
+
client_ino_callback_t ino_invalidate_cb;
void *ino_invalidate_cb_handle;
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);
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
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)
fuse_session_add_chan(se, ch);
+ client->ll_register_switch_interrupt_cb(switch_interrupt_cb);
+
/*
* this is broken:
*