Browse Source

initialize mutex to fix lockup

pull/662/head
Antonio SJ Musumeci 5 years ago
parent
commit
50ad648ce4
  1. 6
      libfuse/lib/buffer.c
  2. 4
      libfuse/lib/fuse.c
  3. 7
      src/policy_cache.cpp

6
libfuse/lib/buffer.c

@ -19,7 +19,7 @@
size_t fuse_buf_size(const struct fuse_bufvec *bufv) size_t fuse_buf_size(const struct fuse_bufvec *bufv)
{ {
size_t i; size_t i;
size_t size = 0;
size_t size = 0;
for (i = 0; i < bufv->count; i++) { for (i = 0; i < bufv->count; i++) {
if (bufv->buf[i].size == SIZE_MAX) if (bufv->buf[i].size == SIZE_MAX)
@ -229,8 +229,8 @@ static ssize_t fuse_buf_copy_one(const struct fuse_buf *dst, size_t dst_off,
int dst_is_fd = dst->flags & FUSE_BUF_IS_FD; int dst_is_fd = dst->flags & FUSE_BUF_IS_FD;
if (!src_is_fd && !dst_is_fd) { if (!src_is_fd && !dst_is_fd) {
void *dstmem = dst->mem + dst_off;
void *srcmem = src->mem + src_off;
char *dstmem = dst->mem + dst_off;
char *srcmem = src->mem + src_off;
if (dstmem != srcmem) { if (dstmem != srcmem) {
if (dstmem + len <= srcmem || srcmem + len <= dstmem) if (dstmem + len <= srcmem || srcmem + len <= dstmem)

4
libfuse/lib/fuse.c

@ -2638,6 +2638,7 @@ static void fuse_lib_getattr(fuse_req_t req, fuse_ino_t ino,
memset(&buf, 0, sizeof(buf)); memset(&buf, 0, sizeof(buf));
path = NULL;
err = (((fi == NULL) || (f->fs->op.fgetattr == NULL)) ? err = (((fi == NULL) || (f->fs->op.fgetattr == NULL)) ?
get_path(f,ino,&path) : get_path(f,ino,&path) :
get_path_nullok(f,ino,&path)); get_path_nullok(f,ino,&path));
@ -2711,9 +2712,10 @@ static void fuse_lib_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr,
memset(&buf, 0, sizeof(buf)); memset(&buf, 0, sizeof(buf));
path = NULL;
err = ((fi == NULL) ? err = ((fi == NULL) ?
get_path(f,ino,&path) : get_path(f,ino,&path) :
get_path_nullok(f, ino, &path));
get_path_nullok(f,ino,&path));
if (!err) { if (!err) {
struct fuse_intr_data d; struct fuse_intr_data d;

7
src/policy_cache.cpp

@ -38,11 +38,15 @@ PolicyCache::Value::Value()
PolicyCache::PolicyCache(void) PolicyCache::PolicyCache(void)
: timeout(DEFAULT_TIMEOUT) : timeout(DEFAULT_TIMEOUT)
{ {
pthread_mutex_init(&_lock,NULL);
} }
void void
PolicyCache::erase(const char *fusepath_) PolicyCache::erase(const char *fusepath_)
{ {
if(timeout == 0)
return;
pthread_mutex_lock(&_lock); pthread_mutex_lock(&_lock);
_cache.erase(fusepath_); _cache.erase(fusepath_);
@ -56,6 +60,9 @@ PolicyCache::cleanup(const int prob_)
uint64_t now; uint64_t now;
map<string,Value>::iterator i; map<string,Value>::iterator i;
if(timeout == 0)
return;
if(rand() % prob_) if(rand() % prob_)
return; return;

Loading…
Cancel
Save