When parsing the <flags> section in ubd<n><flags>=file[,file2], instead of
requiring that the flags are specified in a certain order, just make the code
smarter.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <[EMAIL PROTECTED]>
---

 linux-2.6.11-paolo/arch/um/drivers/ubd_kern.c |   48 +++++++++++++++-----------
 1 files changed, 29 insertions(+), 19 deletions(-)

diff -puN arch/um/drivers/ubd_kern.c~uml-ubd-free-flag-ordering 
arch/um/drivers/ubd_kern.c
--- linux-2.6.11/arch/um/drivers/ubd_kern.c~uml-ubd-free-flag-ordering  
2005-01-13 03:11:22.564889912 +0100
+++ linux-2.6.11-paolo/arch/um/drivers/ubd_kern.c       2005-01-13 
03:11:22.567889456 +0100
@@ -250,7 +250,7 @@ static int ubd_setup_common(char *str, i
        struct ubd *dev;
        struct openflags flags = global_openflags;
        char *backing_file;
-       int n, err;
+       int n, err, i;
 
        if(index_out) *index_out = -1;
        n = *str;
@@ -312,29 +312,40 @@ static int ubd_setup_common(char *str, i
        dev = &ubd_dev[n];
        if(dev->file != NULL){
                printk(KERN_ERR "ubd_setup : device already configured\n");
-               goto out2;
+               goto out;
        }
 
-       if(index_out) *index_out = n;
+       if (index_out)
+               *index_out = n;
 
-       if (*str == 'r'){
-               flags.w = 0;
-               str++;
-       }
-       if (*str == 's'){
-               flags.s = 1;
-               str++;
-       }
-       if (*str == 'd'){
-               dev->no_cow = 1;
+       for (i = 0; i < 4; i++) {
+               switch (*str) {
+               case 'r':
+                       flags.w = 0;
+                       break;
+               case 's':
+                       flags.s = 1;
+                       break;
+               case 'd':
+                       dev->no_cow = 1;
+                       break;
+               case '=':
+                       str++;
+                       goto break_loop;
+               default:
+                       printk(KERN_ERR "ubd_setup : Expected '=' or flag 
letter (r,s or d)\n");
+                       goto out;
+               }
                str++;
        }
 
-       if(*str++ != '='){
+        if (*str == '=')
+               printk(KERN_ERR "ubd_setup : Too many flags specified\n");
+        else
                printk(KERN_ERR "ubd_setup : Expected '='\n");
-               goto out2;
-       }
+       goto out;
 
+break_loop:
        err = 0;
        backing_file = strchr(str, ',');
 
@@ -354,7 +365,7 @@ static int ubd_setup_common(char *str, i
        dev->file = str;
        dev->cow.file = backing_file;
        dev->boot_openflags = flags;
- out2:
+out:
        spin_unlock(&ubd_lock);
        return(err);
 }
@@ -385,8 +396,7 @@ __uml_help(ubd_setup,
 "    machine by running 'dd' on the device. <n> must be in the range\n"
 "    0 to 7. Appending an 'r' to the number will cause that device\n"
 "    to be mounted read-only. For example ubd1r=./ext_fs. Appending\n"
-"    an 's' (has to be _after_ 'r', if there is one) will cause data\n"
-"    to be written to disk on the host immediately.\n\n"
+"    an 's' will cause data to be written to disk on the host immediately.\n\n"
 );
 
 static int fakehd_set = 0;
_


-------------------------------------------------------
The SF.Net email is sponsored by: Beat the post-holiday blues
Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek.
It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt
_______________________________________________
User-mode-linux-devel mailing list
User-mode-linux-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel

Reply via email to