From 0e0c836235b6917e8bd77e6f0049da2d9510406a Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Fri, 14 Jun 2013 21:09:47 +0200 Subject: [PATCH] --- yaml --- r: 377107 b: refs/heads/master c: e7b2c4069252732d52f1de6d1f7c82d99a156659 h: refs/heads/master i: 377105: b236d5c8dc015aec40c159993a786fde77afcd3e 377103: c0204702b714a2efdf272248417a9fa34f4ea371 v: v3 --- [refs] | 2 +- trunk/fs/file_table.c | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index 00d14810fcf3..9b9c96ab8f79 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 698b8223631472bf982ed570b0812faa61955683 +refs/heads/master: e7b2c4069252732d52f1de6d1f7c82d99a156659 diff --git a/trunk/fs/file_table.c b/trunk/fs/file_table.c index cd4d87a82951..485dc0eddd67 100644 --- a/trunk/fs/file_table.c +++ b/trunk/fs/file_table.c @@ -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); } }