|
@@ -306,17 +306,18 @@ void fput(struct file *file)
|
|
|
{
|
|
|
if (atomic_long_dec_and_test(&file->f_count)) {
|
|
|
struct task_struct *task = current;
|
|
|
+ unsigned long flags;
|
|
|
+
|
|
|
file_sb_list_del(file);
|
|
|
- if (unlikely(in_interrupt() || task->flags & PF_KTHREAD)) {
|
|
|
- unsigned long flags;
|
|
|
- spin_lock_irqsave(&delayed_fput_lock, flags);
|
|
|
- list_add(&file->f_u.fu_list, &delayed_fput_list);
|
|
|
- schedule_work(&delayed_fput_work);
|
|
|
- spin_unlock_irqrestore(&delayed_fput_lock, flags);
|
|
|
- return;
|
|
|
+ if (likely(!in_interrupt() && !(task->flags & PF_KTHREAD))) {
|
|
|
+ init_task_work(&file->f_u.fu_rcuhead, ____fput);
|
|
|
+ if (!task_work_add(task, &file->f_u.fu_rcuhead, true))
|
|
|
+ return;
|
|
|
}
|
|
|
- init_task_work(&file->f_u.fu_rcuhead, ____fput);
|
|
|
- task_work_add(task, &file->f_u.fu_rcuhead, true);
|
|
|
+ spin_lock_irqsave(&delayed_fput_lock, flags);
|
|
|
+ list_add(&file->f_u.fu_list, &delayed_fput_list);
|
|
|
+ schedule_work(&delayed_fput_work);
|
|
|
+ spin_unlock_irqrestore(&delayed_fput_lock, flags);
|
|
|
}
|
|
|
}
|
|
|
|