From patchwork Sun Jul 18 18:34:18 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jiri Slaby X-Patchwork-Id: 3822 Return-path: Envelope-to: mchehab@infradead.org Delivery-date: Sun, 18 Jul 2010 18:36:52 +0000 Received: from bombadil.infradead.org [18.85.46.34] by localhost with IMAP (fetchmail-6.3.17) for (single-drop); Sun, 18 Jul 2010 15:39:35 -0300 (BRT) Received: from vger.kernel.org ([209.132.180.67]) by bombadil.infradead.org with esmtp (Exim 4.72 #1 (Red Hat Linux)) id 1OaYjM-0005GV-OD; Sun, 18 Jul 2010 18:36:52 +0000 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757026Ab0GRSgc (ORCPT + 1 other); Sun, 18 Jul 2010 14:36:32 -0400 Received: from mail.pripojeni.net ([217.66.174.14]:58321 "EHLO smtp.pripojeni.net" rhost-flags-OK-FAIL-OK-OK) by vger.kernel.org with ESMTP id S1756994Ab0GRSgb (ORCPT ); Sun, 18 Jul 2010 14:36:31 -0400 Received: from bellona ([217.66.174.142]) by smtp.pripojeni.net (Kerio Connect 7.0.0 patch 1); Sun, 18 Jul 2010 20:34:21 +0200 From: Jiri Slaby To: mchehab@infradead.org Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, jirislaby@gmail.com, Markus Rechberger Subject: [PATCH 1/1] DVB: fix dvr node refcounting Date: Sun, 18 Jul 2010 20:34:18 +0200 Message-Id: <1279478058-974-1-git-send-email-jslaby@suse.cz> X-Mailer: git-send-email 1.7.1 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org In dvb_dvr_release, there is a test dvbdev->users==-1, but users are never negative. This error results in hung tasks: task PC stack pid father bash D ffffffffa000c948 0 3264 3170 0x00000000 ffff88003aec5ce8 0000000000000086 0000000000011f80 0000000000011f80 ffff88003aec5fd8 ffff88003aec5fd8 ffff88003b848670 0000000000011f80 ffff88003aec5fd8 0000000000011f80 ffff88003e02a030 ffff88003b848670 Call Trace: [] dvb_dmxdev_release+0xc5/0x130 [] ? autoremove_wake_function+0x0/0x40 [] dvb_usb_adapter_dvb_exit+0x42/0x70 [dvb_usb] [] dvb_usb_exit+0x55/0xd0 [dvb_usb] [] dvb_usb_device_exit+0x4e/0x70 [dvb_usb] [] af9015_usb_device_exit+0x55/0x60 [dvb_usb_af9015] [] usb_unbind_interface+0x55/0x1a0 [] __device_release_driver+0x70/0xe0 ... So check against 1 there instead. BTW why's the TODO there? Adding TODOs to the code without descriptions is like adding nothing. Signed-off-by: Jiri Slaby Cc: Markus Rechberger Cc: Mauro Carvalho Chehab --- drivers/media/dvb/dvb-core/dmxdev.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c index 425862f..0042306 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.c +++ b/drivers/media/dvb/dvb-core/dmxdev.c @@ -207,7 +207,7 @@ static int dvb_dvr_release(struct inode *inode, struct file *file) } /* TODO */ dvbdev->users--; - if(dvbdev->users==-1 && dmxdev->exit==1) { + if (dvbdev->users == 1 && dmxdev->exit == 1) { fops_put(file->f_op); file->f_op = NULL; mutex_unlock(&dmxdev->mutex);