public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [patch 7/7] uml ubd: handle readonly status
@ 2005-04-24 18:19 blaisorblade
  2005-04-25 10:16 ` Jens Axboe
  0 siblings, 1 reply; 4+ messages in thread
From: blaisorblade @ 2005-04-24 18:19 UTC (permalink / raw)
  To: akpm
  Cc: jdike, bstroesser, linux-kernel, user-mode-linux-devel,
	blaisorblade, axboe


CC: Jens Axboe <axboe@suse.de>

Use the set_disk_ro() API when the backing file is read-only, to mark the disk
read-only, during the ->open(). The current hack does not work when doing a
mount -o remount.

Also, upgrade some warnings to WARN_ON(1) statements. They should actually
become BUG()s probably but I'll avoid that since I'm not so sure the change
works so well. I gave it only some limited testing.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
---

 linux-2.6.12-paolo/arch/um/drivers/ubd_kern.c |   14 ++++++++++----
 1 files changed, 10 insertions(+), 4 deletions(-)

diff -puN arch/um/drivers/ubd_kern.c~uml-ubd-handle-readonly arch/um/drivers/ubd_kern.c
--- linux-2.6.12/arch/um/drivers/ubd_kern.c~uml-ubd-handle-readonly	2005-04-24 20:17:06.000000000 +0200
+++ linux-2.6.12-paolo/arch/um/drivers/ubd_kern.c	2005-04-24 20:17:06.000000000 +0200
@@ -156,6 +156,7 @@ static struct gendisk *fake_gendisk[MAX_
 static struct openflags global_openflags = OPEN_FLAGS;
 
 struct cow {
+	/* This is the backing file, actually */
 	char *file;
 	int fd;
 	unsigned long *bitmap;
@@ -927,10 +928,14 @@ static int ubd_open(struct inode *inode,
 		}
 	}
 	dev->count++;
-	if((filp->f_mode & FMODE_WRITE) && !dev->openflags.w){
+	set_disk_ro(disk, !dev->openflags.w);
+
+	/* This should no more be needed. And it didn't work anyway to exclude
+	 * read-write remounting of filesystems.*/
+	/*if((filp->f_mode & FMODE_WRITE) && !dev->openflags.w){
 	        if(--dev->count == 0) ubd_close(dev);
 	        err = -EROFS;
-	}
+	}*/
  out:
 	return(err);
 }
@@ -1099,6 +1104,7 @@ static int prepare_request(struct reques
 	if((rq_data_dir(req) == WRITE) && !dev->openflags.w){
 		printk("Write attempted on readonly ubd device %s\n", 
 		       disk->disk_name);
+		WARN_ON(1); /* This should be impossible now */
 		end_request(req, 0);
 		return(1);
 	}
@@ -1252,6 +1258,7 @@ static int ubd_check_remapped(int fd, un
 			 */
 			printk("Write access to mapped page from readonly ubd "
 			       "device %d\n", i);
+			WARN_ON(1); /* This should be impossible now */
 			return(0);
 		}
 
@@ -1605,8 +1612,7 @@ void do_io(struct io_thread_req *req)
 				}
 			} while((n < len) && (n != 0));
 			if (n < len) memset(&buf[n], 0, len - n);
-		}
-		else {
+		} else {
 			n = os_write_file(req->fds[bit], buf, len);
 			if(n != len){
 				printk("do_io - write failed err = %d "
_

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [patch 7/7] uml ubd: handle readonly status
  2005-04-24 18:19 [patch 7/7] uml ubd: handle readonly status blaisorblade
@ 2005-04-25 10:16 ` Jens Axboe
  2005-04-25 19:20   ` Blaisorblade
  0 siblings, 1 reply; 4+ messages in thread
From: Jens Axboe @ 2005-04-25 10:16 UTC (permalink / raw)
  To: blaisorblade; +Cc: akpm, jdike, bstroesser, linux-kernel, user-mode-linux-devel

On Sun, Apr 24 2005, blaisorblade@yahoo.it wrote:
> @@ -1099,6 +1104,7 @@ static int prepare_request(struct reques
>  	if((rq_data_dir(req) == WRITE) && !dev->openflags.w){
>  		printk("Write attempted on readonly ubd device %s\n", 
>  		       disk->disk_name);
> +		WARN_ON(1); /* This should be impossible now */
>  		end_request(req, 0);
>  		return(1);
>  	}

I don't think that's a sound change. The WARN_ON() is strictly only
really useful for when you need the stack trace for something
interesting. As the io happens async, you will get a boring trace that
doesn't contain any valuable information.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [patch 7/7] uml ubd: handle readonly status
  2005-04-25 10:16 ` Jens Axboe
@ 2005-04-25 19:20   ` Blaisorblade
  2005-04-26  8:22     ` Jens Axboe
  0 siblings, 1 reply; 4+ messages in thread
From: Blaisorblade @ 2005-04-25 19:20 UTC (permalink / raw)
  To: Jens Axboe; +Cc: akpm, jdike, bstroesser, linux-kernel, user-mode-linux-devel

On Monday 25 April 2005 12:16, Jens Axboe wrote:
> On Sun, Apr 24 2005, blaisorblade@yahoo.it wrote:
> > @@ -1099,6 +1104,7 @@ static int prepare_request(struct reques
> >  	if((rq_data_dir(req) == WRITE) && !dev->openflags.w){
> >  		printk("Write attempted on readonly ubd device %s\n",
> >  		       disk->disk_name);
> > +		WARN_ON(1); /* This should be impossible now */
> >  		end_request(req, 0);
> >  		return(1);
> >  	}
>
> I don't think that's a sound change. The WARN_ON() is strictly only
> really useful for when you need the stack trace for something
> interesting. As the io happens async, you will get a boring trace that
> doesn't contain any valuable information.
Ok, removed, and resending the patch, is the rest ok? I.e. is that supposed to 
work? I gave a walk around and it seemed that the code handles 
set_{disk,device}_ro() even during the open, but I'm no block layer expert.

Thanks for the review.
-- 
Paolo Giarrusso, aka Blaisorblade
Skype user "PaoloGiarrusso"
Linux registered user n. 292729
http://www.user-mode-linux.org/~blaisorblade


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [patch 7/7] uml ubd: handle readonly status
  2005-04-25 19:20   ` Blaisorblade
@ 2005-04-26  8:22     ` Jens Axboe
  0 siblings, 0 replies; 4+ messages in thread
From: Jens Axboe @ 2005-04-26  8:22 UTC (permalink / raw)
  To: Blaisorblade; +Cc: akpm, jdike, bstroesser, linux-kernel, user-mode-linux-devel

On Mon, Apr 25 2005, Blaisorblade wrote:
> On Monday 25 April 2005 12:16, Jens Axboe wrote:
> > On Sun, Apr 24 2005, blaisorblade@yahoo.it wrote:
> > > @@ -1099,6 +1104,7 @@ static int prepare_request(struct reques
> > >  	if((rq_data_dir(req) == WRITE) && !dev->openflags.w){
> > >  		printk("Write attempted on readonly ubd device %s\n",
> > >  		       disk->disk_name);
> > > +		WARN_ON(1); /* This should be impossible now */
> > >  		end_request(req, 0);
> > >  		return(1);
> > >  	}
> >
> > I don't think that's a sound change. The WARN_ON() is strictly only
> > really useful for when you need the stack trace for something
> > interesting. As the io happens async, you will get a boring trace that
> > doesn't contain any valuable information.
> Ok, removed, and resending the patch, is the rest ok? I.e. is that
> supposed to work? I gave a walk around and it seemed that the code
> handles set_{disk,device}_ro() even during the open, but I'm no block
> layer expert.

I'd keep the checks for sanity. Although the set_disk/device_ro prevents
regular fs write mounts, a buggy layered drive could still send down a
write by accident.

-- 
Jens Axboe


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-04-26  8:23 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-24 18:19 [patch 7/7] uml ubd: handle readonly status blaisorblade
2005-04-25 10:16 ` Jens Axboe
2005-04-25 19:20   ` Blaisorblade
2005-04-26  8:22     ` Jens Axboe

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox