Commit 2c49be99 authored by Paolo 'Blaisorblade' Giarrusso's avatar Paolo 'Blaisorblade' Giarrusso Committed by Linus Torvalds

[PATCH] uml ubd: handle readonly status

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, mark explicitly the code paths which should no more be triggerable (I've
removed the WARN_ON(1) things).  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: default avatarPaolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
CC: Jens Axboe <axboe@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent acef2e55
...@@ -156,6 +156,7 @@ static struct gendisk *fake_gendisk[MAX_DEV]; ...@@ -156,6 +156,7 @@ static struct gendisk *fake_gendisk[MAX_DEV];
static struct openflags global_openflags = OPEN_FLAGS; static struct openflags global_openflags = OPEN_FLAGS;
struct cow { struct cow {
/* This is the backing file, actually */
char *file; char *file;
int fd; int fd;
unsigned long *bitmap; unsigned long *bitmap;
...@@ -927,10 +928,14 @@ static int ubd_open(struct inode *inode, struct file *filp) ...@@ -927,10 +928,14 @@ static int ubd_open(struct inode *inode, struct file *filp)
} }
} }
dev->count++; 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); if(--dev->count == 0) ubd_close(dev);
err = -EROFS; err = -EROFS;
} }*/
out: out:
return(err); return(err);
} }
...@@ -1096,6 +1101,7 @@ static int prepare_request(struct request *req, struct io_thread_req *io_req) ...@@ -1096,6 +1101,7 @@ static int prepare_request(struct request *req, struct io_thread_req *io_req)
if(req->rq_status == RQ_INACTIVE) return(1); if(req->rq_status == RQ_INACTIVE) return(1);
/* This should be impossible now */
if((rq_data_dir(req) == WRITE) && !dev->openflags.w){ if((rq_data_dir(req) == WRITE) && !dev->openflags.w){
printk("Write attempted on readonly ubd device %s\n", printk("Write attempted on readonly ubd device %s\n",
disk->disk_name); disk->disk_name);
...@@ -1243,6 +1249,7 @@ static int ubd_check_remapped(int fd, unsigned long address, int is_write, ...@@ -1243,6 +1249,7 @@ static int ubd_check_remapped(int fd, unsigned long address, int is_write,
/* It's a write to a ubd device */ /* It's a write to a ubd device */
/* This should be impossible now */
if(!dev->openflags.w){ if(!dev->openflags.w){
/* It's a write access on a read-only device - probably /* It's a write access on a read-only device - probably
* shouldn't happen. If the kernel is trying to change * shouldn't happen. If the kernel is trying to change
...@@ -1605,8 +1612,7 @@ void do_io(struct io_thread_req *req) ...@@ -1605,8 +1612,7 @@ void do_io(struct io_thread_req *req)
} }
} while((n < len) && (n != 0)); } while((n < len) && (n != 0));
if (n < len) memset(&buf[n], 0, len - n); if (n < len) memset(&buf[n], 0, len - n);
} } else {
else {
n = os_write_file(req->fds[bit], buf, len); n = os_write_file(req->fds[bit], buf, len);
if(n != len){ if(n != len){
printk("do_io - write failed err = %d " printk("do_io - write failed err = %d "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment