Commit e9bb09dd6c5b8ec6a971ed6251df5eba3a4c8d3c

Authored by Tejun Heo
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

... ... @@ -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 }
... ... @@ -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  
... ... @@ -760,7 +760,6 @@
760 760 fc->max_write = max_t(unsigned, 4096, fc->max_write);
761 761 fc->conn_init = 1;
762 762 }
763   - fuse_put_request(fc, req);
764 763 fc->blocked = 0;
765 764 wake_up_all(&fc->blocked_waitq);
766 765 }