Commit e9bb09dd6c5b8ec6a971ed6251df5eba3a4c8d3c
Committed by
Miklos Szeredi
1 parent
193da60927
fuse: don't let fuse_req->end() put the base reference
fuse_req->end() was supposed to be put the base reference but there's no reason why it should. It only makes things more complex. Move it out of ->end() and make it the responsibility of request_end(). Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Showing 3 changed files with 4 additions and 7 deletions Side-by-side Diff
fs/fuse/dev.c
... | ... | @@ -293,8 +293,7 @@ |
293 | 293 | wake_up(&req->waitq); |
294 | 294 | if (end) |
295 | 295 | end(fc, req); |
296 | - else | |
297 | - fuse_put_request(fc, req); | |
296 | + fuse_put_request(fc, req); | |
298 | 297 | } |
299 | 298 | |
300 | 299 | static void wait_answer_interruptible(struct fuse_conn *fc, |
301 | 300 | |
... | ... | @@ -1006,11 +1005,11 @@ |
1006 | 1005 | wake_up(&req->waitq); |
1007 | 1006 | if (end) { |
1008 | 1007 | req->end = NULL; |
1009 | - /* The end function will consume this reference */ | |
1010 | 1008 | __fuse_get_request(req); |
1011 | 1009 | spin_unlock(&fc->lock); |
1012 | 1010 | wait_event(req->waitq, !req->locked); |
1013 | 1011 | end(fc, req); |
1012 | + fuse_put_request(fc, req); | |
1014 | 1013 | spin_lock(&fc->lock); |
1015 | 1014 | } |
1016 | 1015 | } |
fs/fuse/file.c
... | ... | @@ -79,7 +79,6 @@ |
79 | 79 | { |
80 | 80 | dput(req->misc.release.dentry); |
81 | 81 | mntput(req->misc.release.vfsmount); |
82 | - fuse_put_request(fc, req); | |
83 | 82 | } |
84 | 83 | |
85 | 84 | static void fuse_file_put(struct fuse_file *ff) |
... | ... | @@ -493,7 +492,6 @@ |
493 | 492 | } |
494 | 493 | if (req->ff) |
495 | 494 | fuse_file_put(req->ff); |
496 | - fuse_put_request(fc, req); | |
497 | 495 | } |
498 | 496 | |
499 | 497 | static void fuse_send_readpages(struct fuse_req *req, struct file *file, |
... | ... | @@ -513,6 +511,7 @@ |
513 | 511 | } else { |
514 | 512 | request_send(fc, req); |
515 | 513 | fuse_readpages_end(fc, req); |
514 | + fuse_put_request(fc, req); | |
516 | 515 | } |
517 | 516 | } |
518 | 517 | |
... | ... | @@ -1042,7 +1041,6 @@ |
1042 | 1041 | { |
1043 | 1042 | __free_page(req->pages[0]); |
1044 | 1043 | fuse_file_put(req->ff); |
1045 | - fuse_put_request(fc, req); | |
1046 | 1044 | } |
1047 | 1045 | |
1048 | 1046 | static void fuse_writepage_finish(struct fuse_conn *fc, struct fuse_req *req) |
... | ... | @@ -1086,6 +1084,7 @@ |
1086 | 1084 | fuse_writepage_finish(fc, req); |
1087 | 1085 | spin_unlock(&fc->lock); |
1088 | 1086 | fuse_writepage_free(fc, req); |
1087 | + fuse_put_request(fc, req); | |
1089 | 1088 | spin_lock(&fc->lock); |
1090 | 1089 | } |
1091 | 1090 |