User: | Jiri Slaby |
Error type: | Leaving function in locked state |
Error type description: | Some lock is not unlocked on all paths of a function, so it is leaked |
File location: | fs/fuse/dev.c |
Line in file: | 1013 |
Project: | Linux Kernel |
Project version: | 2.6.28 |
Tools: |
Undetermined 1
|
Entered: | 2012-03-04 17:07:06 UTC |
983 * waiter is woken up. This will make request_wait_answer() wait 984 * until the request is unlocked and then return. 985 * 986 * If the request is asynchronous, then the end function needs to be 987 * called after waiting for the request to be unlocked (if it was 988 * locked). 989 */ 990static void end_io_requests(struct fuse_conn *fc) 991 __releases(fc->lock) __acquires(fc->lock) 992{ 993 while (!list_empty(&fc->io)) { 994 struct fuse_req *req = 995 list_entry(fc->io.next, struct fuse_req, list); 996 void (*end) (struct fuse_conn *, struct fuse_req *) = req->end; 997 998 req->aborted = 1; 999 req->out.h.error = -ECONNABORTED; 1000 req->state = FUSE_REQ_FINISHED; 1001 list_del_init(&req->list); 1002 wake_up(&req->waitq); 1003 if (end) { 1004 req->end = NULL; 1005 /* The end function will consume this reference */ 1006 __fuse_get_request(req); 1007 spin_unlock(&fc->lock); 1008 wait_event(req->waitq, !req->locked); 1009 end(fc, req); 1010 spin_lock(&fc->lock); 1011 } 1012 } 1013} 1014 1015/* 1016 * Abort all requests. 1017 * 1018 * Emergency exit in case of a malicious or accidental deadlock, or 1019 * just a hung filesystem. 1020 * 1021 * The same effect is usually achievable through killing the 1022 * filesystem daemon and all users of the filesystem. The exception 1023 * is the combination of an asynchronous request and the tricky