All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tejun Heo <tj@kernel.org>
To: axboe@kernel.dk, hch@infradead.org, linux-kernel@vger.kernel.org,
	petero2@telia.com, schwidefsky@de.ibm.com,
	heiko.carstens@de.ibm.com, jack@suse.cz,
	akpm@linux-foundation.org, adilge
Subject: [PATCH 6/5] block: check bdev_read_only() from blkdev_get()
Date: Thu, 11 Nov 2010 18:10:17 +0100	[thread overview]
Message-ID: <4CDC2379.3050505@kernel.org> (raw)
In-Reply-To: <1288628129-12811-1-git-send-email-tj@kernel.org>

bdev read-only status can be queried using bdev_read_only() and may
change while the device is being opened.  Enforce it by checking it
from blkdev_get() after open succeeds.

This makes bdev_read_only() check in open_bdev_exclusive() and
fsg_lun_open() unnecessary.  Drop them.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Cc: linux-usb@vger.kernel.org
---
 drivers/usb/gadget/storage_common.c |    7 ++-----
 fs/block_dev.c                      |   11 ++++++-----
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 3b513ba..b015561 100644
--- a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -543,7 +543,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
 	ro = curlun->initially_ro;
 	if (!ro) {
 		filp = filp_open(filename, O_RDWR | O_LARGEFILE, 0);
-		if (-EROFS == PTR_ERR(filp))
+		if (PTR_ERR(filp) == -EROFS || PTR_ERR(filp) == -EACCES)
 			ro = 1;
 	}
 	if (ro)
@@ -558,10 +558,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)

 	if (filp->f_path.dentry)
 		inode = filp->f_path.dentry->d_inode;
-	if (inode && S_ISBLK(inode->i_mode)) {
-		if (bdev_read_only(inode->i_bdev))
-			ro = 1;
-	} else if (!inode || !S_ISREG(inode->i_mode)) {
+	if (!inode || (!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))) {
 		LINFO(curlun, "invalid file type: %s\n", filename);
 		goto out;
 	}
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 269bfbb..606a525 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1149,6 +1149,12 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)

 	res = __blkdev_get(bdev, mode, 0);

+	/* __blkdev_get() may alter read only status, check it afterwards */
+	if (!res && (mode & FMODE_WRITE) && bdev_read_only(bdev)) {
+		__blkdev_put(bdev, mode, 0);
+		res = -EACCES;
+	}
+
 	if (whole) {
 		/* finish claiming */
 		spin_lock(&bdev_lock);
@@ -1453,11 +1459,6 @@ struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *h
 	if (error)
 		return ERR_PTR(error);

-	if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) {
-		blkdev_put(bdev, mode);
-		return ERR_PTR(-EACCES);
-	}
-
 	return bdev;
 }

-- 
1.7.1


WARNING: multiple messages have this Message-ID (diff)
From: Tejun Heo <tj@kernel.org>
To: axboe@kernel.dk, hch@infradead.org, linux-kernel@vger.kernel.org,
	petero2@telia.com, schwidefsky@de.ibm.com,
	heiko.carstens@de.ibm.com, jack@suse.cz,
	akpm@linux-foundation.org, adilger.kernel@dilger.ca,
	tytso@mit.edu, mfasheh@suse.com, joel.becker@oracle.com,
	aelder@sgi.com, dm-devel@redhat.com, drbd-dev@lists.linbit.com,
	neilb@suse.de, leochen@broadcom.com, sbranden@broadcom.com,
	chris.mason@oracle.com, swhiteho@redhat.com,
	shaggy@linux.vnet.ibm.com, joern@logfs.org,
	konishi.ryusuke@lab.ntt.co.jp, reiserfs-devel@vger.kernel.org,
	viro@zeniv.linux.org.uk, dbrownell@users.sourceforge.net
Subject: [Drbd-dev] [PATCH 6/5] block: check bdev_read_only() from blkdev_get()
Date: Thu, 11 Nov 2010 18:10:17 +0100	[thread overview]
Message-ID: <4CDC2379.3050505@kernel.org> (raw)
In-Reply-To: <1288628129-12811-1-git-send-email-tj@kernel.org>

bdev read-only status can be queried using bdev_read_only() and may
change while the device is being opened.  Enforce it by checking it
from blkdev_get() after open succeeds.

This makes bdev_read_only() check in open_bdev_exclusive() and
fsg_lun_open() unnecessary.  Drop them.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Cc: linux-usb@vger.kernel.org
---
 drivers/usb/gadget/storage_common.c |    7 ++-----
 fs/block_dev.c                      |   11 ++++++-----
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 3b513ba..b015561 100644
--- a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -543,7 +543,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
 	ro = curlun->initially_ro;
 	if (!ro) {
 		filp = filp_open(filename, O_RDWR | O_LARGEFILE, 0);
-		if (-EROFS == PTR_ERR(filp))
+		if (PTR_ERR(filp) == -EROFS || PTR_ERR(filp) == -EACCES)
 			ro = 1;
 	}
 	if (ro)
@@ -558,10 +558,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)

 	if (filp->f_path.dentry)
 		inode = filp->f_path.dentry->d_inode;
-	if (inode && S_ISBLK(inode->i_mode)) {
-		if (bdev_read_only(inode->i_bdev))
-			ro = 1;
-	} else if (!inode || !S_ISREG(inode->i_mode)) {
+	if (!inode || (!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))) {
 		LINFO(curlun, "invalid file type: %s\n", filename);
 		goto out;
 	}
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 269bfbb..606a525 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1149,6 +1149,12 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)

 	res = __blkdev_get(bdev, mode, 0);

+	/* __blkdev_get() may alter read only status, check it afterwards */
+	if (!res && (mode & FMODE_WRITE) && bdev_read_only(bdev)) {
+		__blkdev_put(bdev, mode, 0);
+		res = -EACCES;
+	}
+
 	if (whole) {
 		/* finish claiming */
 		spin_lock(&bdev_lock);
@@ -1453,11 +1459,6 @@ struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *h
 	if (error)
 		return ERR_PTR(error);

-	if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) {
-		blkdev_put(bdev, mode);
-		return ERR_PTR(-EACCES);
-	}
-
 	return bdev;
 }

-- 
1.7.1


WARNING: multiple messages have this Message-ID (diff)
From: Tejun Heo <tj@kernel.org>
To: axboe@kernel.dk, hch@infradead.org, linux-kernel@vger.kernel.org,
	petero2@telia.com, schwidefsky@de.ibm.com,
	heiko.carstens@de.ibm.com, jack@suse.cz,
	akpm@linux-foundation.org, adilger.kernel@dilger.ca,
	tytso@mit.edu, mfasheh@suse.com, joel.becker@oracle.com,
	aelder@sgi.com, dm-devel@redhat.com, drbd-dev@lists.linbit.com,
	neilb@suse.de, leochen@broadcom.com, sbranden@broadcom.com,
	chris.mason@oracle.com, swhiteho@redhat.com,
	shaggy@linux.vnet.ibm.com, joern@logfs.org,
	konishi.ryusuke@lab.ntt.co.jp, reiserfs-devel@vger.kernel.org,
	viro@zeniv.linux.org.uk, dbrownell@users.sourceforge.net
Subject: [PATCH 6/5] block: check bdev_read_only() from blkdev_get()
Date: Thu, 11 Nov 2010 18:10:17 +0100	[thread overview]
Message-ID: <4CDC2379.3050505@kernel.org> (raw)
In-Reply-To: <1288628129-12811-1-git-send-email-tj@kernel.org>

bdev read-only status can be queried using bdev_read_only() and may
change while the device is being opened.  Enforce it by checking it
from blkdev_get() after open succeeds.

This makes bdev_read_only() check in open_bdev_exclusive() and
fsg_lun_open() unnecessary.  Drop them.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: David Brownell <dbrownell@users.sourceforge.net>
Cc: linux-usb@vger.kernel.org
---
 drivers/usb/gadget/storage_common.c |    7 ++-----
 fs/block_dev.c                      |   11 ++++++-----
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 3b513ba..b015561 100644
--- a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -543,7 +543,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
 	ro = curlun->initially_ro;
 	if (!ro) {
 		filp = filp_open(filename, O_RDWR | O_LARGEFILE, 0);
-		if (-EROFS == PTR_ERR(filp))
+		if (PTR_ERR(filp) == -EROFS || PTR_ERR(filp) == -EACCES)
 			ro = 1;
 	}
 	if (ro)
@@ -558,10 +558,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)

 	if (filp->f_path.dentry)
 		inode = filp->f_path.dentry->d_inode;
-	if (inode && S_ISBLK(inode->i_mode)) {
-		if (bdev_read_only(inode->i_bdev))
-			ro = 1;
-	} else if (!inode || !S_ISREG(inode->i_mode)) {
+	if (!inode || (!S_ISREG(inode->i_mode) && !S_ISBLK(inode->i_mode))) {
 		LINFO(curlun, "invalid file type: %s\n", filename);
 		goto out;
 	}
diff --git a/fs/block_dev.c b/fs/block_dev.c
index 269bfbb..606a525 100644
--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -1149,6 +1149,12 @@ int blkdev_get(struct block_device *bdev, fmode_t mode, void *holder)

 	res = __blkdev_get(bdev, mode, 0);

+	/* __blkdev_get() may alter read only status, check it afterwards */
+	if (!res && (mode & FMODE_WRITE) && bdev_read_only(bdev)) {
+		__blkdev_put(bdev, mode, 0);
+		res = -EACCES;
+	}
+
 	if (whole) {
 		/* finish claiming */
 		spin_lock(&bdev_lock);
@@ -1453,11 +1459,6 @@ struct block_device *open_bdev_exclusive(const char *path, fmode_t mode, void *h
 	if (error)
 		return ERR_PTR(error);

-	if ((mode & FMODE_WRITE) && bdev_read_only(bdev)) {
-		blkdev_put(bdev, mode);
-		return ERR_PTR(-EACCES);
-	}
-
 	return bdev;
 }

-- 
1.7.1


  parent reply	other threads:[~2010-11-11 17:10 UTC|newest]

Thread overview: 80+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-11-01 16:15 [PATCHSET] block: clean up bdev claim/release handling Tejun Heo
2010-11-01 16:15 ` Tejun Heo
2010-11-01 16:15 ` [Drbd-dev] " Tejun Heo
2010-11-01 16:15 ` [PATCH 1/5] mtd: fix bdev exclusive open bugs in block2mtd::add_device() Tejun Heo
2010-11-01 16:15 ` Tejun Heo
2010-11-01 16:15 ` Tejun Heo
2010-11-01 16:15   ` [Drbd-dev] " Tejun Heo
2010-11-13 10:38   ` Artem Bityutskiy
2010-11-13 10:38     ` Artem Bityutskiy
2010-11-13 10:38     ` Artem Bityutskiy
2010-11-13 10:42     ` Tejun Heo
2010-11-13 10:42       ` [Drbd-dev] " Tejun Heo
2010-11-13 10:42       ` Tejun Heo
2010-11-13 11:10       ` Artem Bityutskiy
2010-11-13 11:10         ` Artem Bityutskiy
2010-11-13 11:10         ` Artem Bityutskiy
2010-11-13 10:59   ` [PATCH UPDATED " Tejun Heo
2010-11-13 10:59     ` [Drbd-dev] " Tejun Heo
2010-11-13 10:59     ` Tejun Heo
2010-11-13 11:14     ` Artem Bityutskiy
2010-11-13 11:14       ` Artem Bityutskiy
2010-11-13 11:14       ` Artem Bityutskiy
2010-11-13 11:18       ` Tejun Heo
2010-11-13 11:18         ` [Drbd-dev] " Tejun Heo
2010-11-13 11:18         ` Tejun Heo
2010-11-01 16:15 ` [PATCH 2/5] btrfs: close_bdev_exclusive() should use the same @flags as the matching open_bdev_exclusive() Tejun Heo
2010-11-01 16:15 ` Tejun Heo
2010-11-01 16:15 ` [Drbd-dev] " Tejun Heo
2010-11-01 16:15   ` Tejun Heo
2010-11-01 16:15 ` [PATCH 3/5] block: simplify holder symlink handling Tejun Heo
2010-11-01 16:15 ` [Drbd-dev] " Tejun Heo
2010-11-01 16:15   ` Tejun Heo
2010-11-04 15:06   ` Mike Snitzer
2010-11-04 15:06     ` Mike Snitzer
2010-11-04 15:06     ` [Drbd-dev] " Mike Snitzer
2010-11-01 16:15 ` Tejun Heo
2010-11-01 16:15 ` [PATCH 4/5] block: make blkdev_get/put() handle exclusive access Tejun Heo
2010-11-01 16:15   ` Tejun Heo
2010-11-01 16:15   ` [Drbd-dev] " Tejun Heo
2010-11-03 15:06   ` Jan Kara
2010-11-03 15:06     ` [Drbd-dev] " Jan Kara
2010-11-09 10:18     ` Tejun Heo
2010-11-09 10:18       ` [Drbd-dev] " Tejun Heo
2010-11-03 16:10   ` Christoph Hellwig
2010-11-03 16:10     ` [Drbd-dev] " Christoph Hellwig
2010-11-04 15:04     ` Mike Snitzer
2010-11-04 15:04       ` Mike Snitzer
2010-11-04 15:04       ` [Drbd-dev] " Mike Snitzer
2010-11-09 10:34     ` Tejun Heo
2010-11-09 10:34       ` [Drbd-dev] " Tejun Heo
2010-11-09 10:36       ` Christoph Hellwig
2010-11-09 10:36         ` [Drbd-dev] " Christoph Hellwig
2010-11-01 16:15 ` Tejun Heo
2010-11-01 16:15 ` [PATCH 5/5] block: reorganize claim/release implementation Tejun Heo
2010-11-01 16:15 ` [Drbd-dev] " Tejun Heo
2010-11-01 16:15   ` Tejun Heo
2010-11-01 16:15 ` Tejun Heo
2010-11-01 19:49 ` [PATCHSET] block: clean up bdev claim/release handling Neil Brown
2010-11-01 19:49   ` [Drbd-dev] " Neil Brown
2010-11-03 15:53 ` Philipp Reisner
2010-11-03 15:53   ` Philipp Reisner
2010-11-11 17:10 ` [PATCH 6/5] block: check bdev_read_only() from blkdev_get() Tejun Heo
2010-11-11 17:10 ` Tejun Heo [this message]
2010-11-11 17:10   ` Tejun Heo
2010-11-11 17:10   ` [Drbd-dev] " Tejun Heo
2010-11-11 17:11 ` [PATCH 7/5] block: clean up blkdev_get() wrappers and their users Tejun Heo
2010-11-11 17:11 ` Tejun Heo
2010-11-11 17:11   ` Tejun Heo
2010-11-11 17:11   ` [Drbd-dev] " Tejun Heo
2010-11-11 19:19   ` Steven Whitehouse
2010-11-11 17:14 ` [PATCHSET] block: clean up bdev claim/release handling Tejun Heo
2010-11-11 17:14 ` Tejun Heo
2010-11-11 17:14   ` Tejun Heo
2010-11-11 17:14   ` [Drbd-dev] " Tejun Heo
2010-11-27 16:01   ` Tejun Heo
2010-11-27 16:01   ` Tejun Heo
2010-11-27 16:01     ` Tejun Heo
2010-11-27 16:01     ` [Drbd-dev] " Tejun Heo
2010-11-27 18:47     ` Jens Axboe
2010-11-27 18:47       ` [Drbd-dev] " Jens Axboe

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4CDC2379.3050505@kernel.org \
    --to=tj@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=axboe@kernel.dk \
    --cc=hch@infradead.org \
    --cc=heiko.carstens@de.ibm.com \
    --cc=jack@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=petero2@telia.com \
    --cc=schwidefsky@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.