On Sat, May 14, 2011 at 10:36 AM, Julia Lawall <[email protected]> wrote:
> On Sat, 14 May 2011, Jim Cromie wrote:
>
>> >> drivers/tty/tty_io.c: unregister_chrdev_region(MKDEV(driver->major,
>> >> driver->minor_start),
>> >> drivers/tty/tty_io.c:     register_chrdev_region(MKDEV(TTYAUX_MAJOR,
>> >> 0), 1, "/dev/tty") < 0)
>> >> drivers/tty/tty_io.c:     register_chrdev_region(MKDEV(TTYAUX_MAJOR,
>> >> 1), 1, "/dev/console") < 0)
>> >>

ok. from what I understood of your responses, I tried the following:

has +code before -code, inserting into position @pdecl
-code should be providing the matched expr for the +code.
spatch didnt complain, so I guess its legal.


@ mkdev_expr @
dev_t devid;
expression ct, name;
expression major, minor;
position pdecl;
@@

{ @pdecl
+ dev_t devt = MKDEV(major,minor);
  ...
- register_chrdev_region(MKDEV(major,minor), ct, name);
+ register_chrdev_region(devt, ct, name);
  ...
}

when used as written, it misses the expr inside the if statement,
However, if I strip the semicolons off the -+ code, to allow expression
match rather than statement match, the rule hangs indefinitely.

^C     C-c intercepted, will do some cleaning before exiting




here another run, using a different expression-transform
on one of the more complicated call-sites.

@ register_chrdev_region @ // depends on fs_h @
//dev_t devid;
expression devid;
expression ct, name;
@@

- register_chrdev_region(devid, ct, name)
+ register_chrdev_ids(&devid, ct, name)



[jimc@groucho linux-2.6.git]$ spatch -sp_file chrdev.cocci-expr
drivers/tty/tty_io.c -partial_match -debug
....
----------------------------------------------------------------------
Finished
-----------------------------------------------------------------------
diff =
--- drivers/tty/tty_io.c        2011-05-14 00:52:22.221529714 -0600
+++ /tmp/cocci-output-4815-63ba00-tty_io.c      2011-05-14 11:20:22.293249506 
-0600
@@ -3295,13 +3295,13 @@ int __init tty_init(void)
 {
        cdev_init(&tty_cdev, &tty_fops);
        if (cdev_add(&tty_cdev, MKDEV(TTYAUX_MAJOR, 0), 1) ||
-           register_chrdev_region(MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
+           register_chrdev_ids(&MKDEV(TTYAUX_MAJOR, 0), 1, "/dev/tty") < 0)
                panic("Couldn't register /dev/tty driver\n");
        device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 0), NULL, "tty");

        cdev_init(&console_cdev, &console_fops);
        if (cdev_add(&console_cdev, MKDEV(TTYAUX_MAJOR, 1), 1) ||
-           register_chrdev_region(MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 
0)
+           register_chrdev_ids(&MKDEV(TTYAUX_MAJOR, 1), 1, "/dev/console") < 0)
                panic("Couldn't register /dev/console driver\n");
        consdev = device_create(tty_class, NULL, MKDEV(TTYAUX_MAJOR, 1), NULL,
                              "console");
Check duplication for 1 files


Ideally, my rule would catch and transform all 4 (2x2) occurrences of
MKDEV(TTYAUX_MAJOR, [01]), but in this particular case,
a single decl wouldnt suffice; 2 are needed:
  dev_t  ttydev0 = MKDEV(TTYAUX_MAJOR, 0);
  dev_t  ttydev1 = MKDEV(TTYAUX_MAJOR, 1);

this is rather more binding-fu than Ive got or need,
but if generalized by a master, could probably hoist
a lot of invariant code out of inner scopes.
Runtime might be a problem..

Given that my more constrained version above is hanging,
I cant cast a wider net, but heres what I was hoping to do.




@ md @
expression ct, name;
expression major, minor;
position pdecl;
@@

{ @pdecl
+ dev_t devt = MKDEV(major,minor);
  ...
- MKDEV(major,minor)
+ devt
  ...
}

@@
dev_t devt;
@@

- register_chrdev_region(devt, ct, name)
+ register_chrdev_ids(&devt, ct, name)


Oof - Ive asked -parse_cocci questions regarding this in other reply..
the ones about identiffffier foob belong there,
but these did not..


2 - how to fix this warning ?

warning: iso braces2 does not match the code below on line 9
{
  >>> dev_t devt = MKDEV(md:major, md:minor);
_______________________________________________
Cocci mailing list
[email protected]
http://lists.diku.dk/mailman/listinfo/cocci
(Web access from inside DIKUs LAN only)

Reply via email to