From patchwork Wed Nov 9 16:11:39 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris J Arges X-Patchwork-Id: 124580 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from chlorine.canonical.com (chlorine.canonical.com [91.189.94.204]) by ozlabs.org (Postfix) with ESMTP id B76DBB6F8F for ; Thu, 10 Nov 2011 03:11:58 +1100 (EST) Received: from localhost ([127.0.0.1] helo=chlorine.canonical.com) by chlorine.canonical.com with esmtp (Exim 4.71) (envelope-from ) id 1ROAkc-0006jN-UN; Wed, 09 Nov 2011 16:11:46 +0000 Received: from youngberry.canonical.com ([91.189.89.112]) by chlorine.canonical.com with esmtp (Exim 4.71) (envelope-from ) id 1ROAkW-0006jD-Nh for kernel-team@lists.ubuntu.com; Wed, 09 Nov 2011 16:11:40 +0000 Received: from user-0ccsr2v.cable.mindspring.com ([24.206.108.95] helo=[192.168.1.102]) by youngberry.canonical.com with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ROAkW-00084A-IS for kernel-team@lists.ubuntu.com; Wed, 09 Nov 2011 16:11:40 +0000 Message-ID: <4EBAA63B.4040902@canonical.com> Date: Wed, 09 Nov 2011 10:11:39 -0600 From: Chris J Arges User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1 MIME-Version: 1.0 To: kernel-team@lists.ubuntu.com Subject: [Natty] SRU: CIFS mount blocks suspend/hibernate X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.13 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: kernel-team-bounces@lists.ubuntu.com Errors-To: kernel-team-bounces@lists.ubuntu.com SRU Justification: Impact: If a cifs share is mounted in ubuntu-natty and we try to suspend cifsd prevents the laptop from suspending. Fix: Apply f06ac72e929115f2772c29727152ba0832d641e4 cherry picked from upstream commit (this is already in ubuntu-oneric) to ubuntu-natty linux kernel. This small patch allows the laptop to suspend even if a cifs share is mounted. Testcase: Boot ubuntu-natty. Mount cifs share. Suspend or Hibernate. (This will not work.) Boot ubuntu-natty with cifs patch applied. Mount cifs share. Suspend or Hibernate. (This works.) From 7d58ea603394ba00dece56514baca9ffc94b0c64 Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Wed, 19 Oct 2011 15:30:40 -0400 Subject: [PATCH] cifs, freezer: add wait_event_freezekillable and have cifs use it Buglink: https://bugs.launchpad.net/bugs/24330 CIFS currently uses wait_event_killable to put tasks to sleep while they await replies from the server. That function though does not allow the freezer to run. In many cases, the network interface may be going down anyway, in which case the reply will never come. The client then ends up blocking the computer from suspending. Fix this by adding a new wait_event_freezable variant -- wait_event_freezekillable. The idea is to combine the behavior of wait_event_killable and wait_event_freezable -- put the task to sleep and only allow it to be awoken by fatal signals, but also allow the freezer to do its job. Signed-off-by: Jeff Layton (cherry picked from commit f06ac72e929115f2772c29727152ba0832d641e4) Signed-off-by: Chris J Arges --- fs/cifs/transport.c | 3 ++- include/linux/freezer.h | 19 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index c1b9c4b..23a33ef 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -328,7 +329,7 @@ wait_for_response(struct TCP_Server_Info *server, struct mid_q_entry *midQ) { int error; - error = wait_event_killable(server->response_q, + error = wait_event_freezekillable(server->response_q, midQ->midState != MID_REQUEST_SUBMITTED); if (error < 0) return -ERESTARTSYS; diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 1effc8b..3672f73 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h @@ -134,10 +134,25 @@ static inline void set_freezable_with_signal(void) } /* - * Freezer-friendly wrappers around wait_event_interruptible() and - * wait_event_interruptible_timeout(), originally defined in + * Freezer-friendly wrappers around wait_event_interruptible(), + * wait_event_killable() and wait_event_interruptible_timeout(), originally + * defined in */ +#define wait_event_freezekillable(wq, condition) \ +({ \ + int __retval; \ + do { \ + __retval = wait_event_killable(wq, \ + (condition) || freezing(current)); \ + if (__retval && !freezing(current)) \ + break; \ + else if (!(condition)) \ + __retval = -ERESTARTSYS; \ + } while (try_to_freeze()); \ + __retval; \ +}) + #define wait_event_freezable(wq, condition) \ ({ \ int __retval; \ -- 1.7.0.4