Skip to content

Commit

Permalink
fuse: change interrupt requests allocation algorithm
Browse files Browse the repository at this point in the history
Using of two unconnected IDs req->in.h.unique and req->intr_unique does not
allow to link requests to a hash table. We need can't use none of them as a
key to calculate hash.

This patch changes the algorithm of allocation of IDs for a request. Plain
requests obtain even ID, while interrupt requests are encoded in the low
bit. So, in next patches we will be able to use the rest of ID bits to
calculate hash, and the hash will be the same for plain and interrupt
requests.

Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
  • Loading branch information
Kirill Tkhai authored and Miklos Szeredi committed Sep 28, 2018
1 parent 63825b4 commit c59fd85
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions fs/fuse/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
MODULE_ALIAS_MISCDEV(FUSE_MINOR);
MODULE_ALIAS("devname:fuse");

/* Ordinary requests have even IDs, while interrupts IDs are odd */
#define FUSE_INT_REQ_BIT (1ULL << 0)
#define FUSE_REQ_ID_STEP (1ULL << 1)

static struct kmem_cache *fuse_req_cachep;

static struct fuse_dev *fuse_get_dev(struct file *file)
Expand Down Expand Up @@ -319,7 +323,8 @@ static unsigned len_args(unsigned numargs, struct fuse_arg *args)

static u64 fuse_get_unique(struct fuse_iqueue *fiq)
{
return ++fiq->reqctr;
fiq->reqctr += FUSE_REQ_ID_STEP;
return fiq->reqctr;
}

static void queue_request(struct fuse_iqueue *fiq, struct fuse_req *req)
Expand Down Expand Up @@ -1090,7 +1095,7 @@ __releases(fiq->waitq.lock)
int err;

list_del_init(&req->intr_entry);
req->intr_unique = fuse_get_unique(fiq);
req->intr_unique = (req->in.h.unique | FUSE_INT_REQ_BIT);
memset(&ih, 0, sizeof(ih));
memset(&arg, 0, sizeof(arg));
ih.len = reqsize;
Expand Down

0 comments on commit c59fd85

Please sign in to comment.