From mboxrd@z Thu Jan 1 00:00:00 1970 From: Hui Wang Subject: [PATCH] vfs: try to unblock evpoll if mounted filesystem is RDONLY Date: Mon, 8 Jul 2013 10:02:54 +0800 Message-ID: <1373248974-3272-1-git-send-email-jason77.wang@gmail.com> Cc: linux-fsdevel@vger.kernel.org To: viro@zeniv.linux.org.uk, tj@kernel.org, kay.sievers@vrfy.org, jaxboe@fusionio.com Return-path: Received: from mail-pb0-f46.google.com ([209.85.160.46]:55660 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753326Ab3GHCDB (ORCPT ); Sun, 7 Jul 2013 22:03:01 -0400 Received: by mail-pb0-f46.google.com with SMTP id rq2so3760009pbb.19 for ; Sun, 07 Jul 2013 19:03:00 -0700 (PDT) Sender: linux-fsdevel-owner@vger.kernel.org List-ID: When inserting a rw optical disc like a DVD/CD rw disc, and we mount it without an explicit ro option, the vfs will block its event poll workqueue to protect it from damaging while writing to disc, the direct result of the blocking of event poll is to make the eject button can't work. This protection is reasonable when the filesystem on the rw disc is also rw. but if the filessytem on the rw disc is ro, e.g. the iso9660 and udf readonly partition, this protection is a little bit weird and unneeded, since most people are going to be curious why the eject button can't work while the mount is ro? To make the eject button work again while the mounted filesystem is ro, we should inspect the flags of the filesytem's sb and unblock the evpoll conditionally, the code refers to the blkdev_put() in the fs/block_dev.c. Signed-off-by: Hui Wang --- I personally don't know if this is a real defect or not, but this issue is reported by a customer of our company, he said from the user experience, this is a defect, since no matter the disc is ro or rw, the mount is ro, the eject button should work. so far, all DVD/CD and DVD-R/CD-R follow this rule (mount is ro, eject button can work), but DVD/CD rw discs don't, no matter the mount is ro or rw, the eject button always can't work. So our finial goal is to make the eject button can work while the filesystem on the rw disc is ro and the whole mounting is ro. fs/super.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/fs/super.c b/fs/super.c index 7465d43..7980602 100644 --- a/fs/super.c +++ b/fs/super.c @@ -1011,6 +1011,25 @@ struct dentry *mount_bdev(struct file_system_type *fs_type, s->s_flags |= MS_ACTIVE; bdev->bd_super = s; + + mutex_lock(&bdev->bd_mutex); + + if ((s->s_flags & MS_RDONLY) && bdev->bd_write_holder) { + int bd_holders; + + bd_holders = bdev->bd_holders; + if (bdev == bdev->bd_contains) + bd_holders -= 2; + else + bd_holders -= 1; + + if (!bd_holders) { + disk_unblock_events(bdev->bd_disk); + bdev->bd_write_holder = false; + } + } + + mutex_unlock(&bdev->bd_mutex); } return dget(s->s_root); -- 1.8.1.2