diff options
Diffstat (limited to 'net/core/scm.c')
| -rw-r--r-- | net/core/scm.c | 22 | 
1 files changed, 19 insertions, 3 deletions
diff --git a/net/core/scm.c b/net/core/scm.c index 10f5c65f6a4..b12303dd39d 100644 --- a/net/core/scm.c +++ b/net/core/scm.c @@ -106,9 +106,25 @@ void __scm_destroy(struct scm_cookie *scm)  	if (fpl) {  		scm->fp = NULL; -		for (i=fpl->count-1; i>=0; i--) -			fput(fpl->fp[i]); -		kfree(fpl); +		if (current->scm_work_list) { +			list_add_tail(&fpl->list, current->scm_work_list); +		} else { +			LIST_HEAD(work_list); + +			current->scm_work_list = &work_list; + +			list_add(&fpl->list, &work_list); +			while (!list_empty(&work_list)) { +				fpl = list_first_entry(&work_list, struct scm_fp_list, list); + +				list_del(&fpl->list); +				for (i=fpl->count-1; i>=0; i--) +					fput(fpl->fp[i]); +				kfree(fpl); +			} + +			current->scm_work_list = NULL; +		}  	}  }  | 
