On Thu, 29 Mar 2007 00:28:07 +0200
"Rafael J. Wysocki" <[EMAIL PROTECTED]> wrote:

> On Thursday, 29 March 2007 00:14, Tim Dijkstra wrote:
> > On Tue, 27 Mar 2007 23:11:41 +0200
> > "Rafael J. Wysocki" <[EMAIL PROTECTED]> wrote:
> > 
> > > > diff -u -r1.70 suspend.c
> > > > --- suspend.c   16 Mar 2007 16:02:22 -0000      1.70
> > > > +++ suspend.c   27 Mar 2007 20:36:52 -0000
> > > > @@ -208,7 +208,7 @@
> > > >         swap.offset = offset;
> > > >         error = ioctl(dev, SNAPSHOT_SET_SWAP_AREA, &swap);
> > > >         if (error && !offset)
> > > > -               error = ioctl(dev, SNAPSHOT_SET_SWAP_FILE, blkdev);
> > > > +               error = ioctl(dev, SNAPSHOT_SET_SWAP_FILE, (unsigned 
> > > > long) blkdev);  
> > > 
> > > Heh, I wonder. :-)
> > 
> > 
> > Apparently it worked... IMHO this means the code in user.c should be
> > different. snapshot_ioctl expects an unsigned long, which isn't what 
> > the user sends. Would it be useful to use copy_from_user()? (Disclaimer
> > I haven't written a single line of kernel code yet, this is just from
> > reading user.c)
> 
> Well, maybe, but then we'd have to redefine the ioctl which I'd rather avoid.
> Besides, the kernel only needs the lower 32 bits anyway, so why should we
> complicate things to pass the remaining 32 zero bits to it for nothing?
> 
> The problem is that in fact the kernel expects us to provide a _pointer_
> as arg to the ioctl and unsigned long just happens to be of the same size.  So
> I think we can live with your hack in the userland just fine (but please add a
> comment explaining why its needed).

Would this comment suffice?

Index: suspend.c
===================================================================
RCS file: /cvsroot/suspend/suspend/suspend.c,v
retrieving revision 1.70
diff -u -r1.70 suspend.c
--- suspend.c   16 Mar 2007 16:02:22 -0000      1.70
+++ suspend.c   29 Mar 2007 19:42:43 -0000
@@ -207,8 +207,13 @@
        swap.dev = blkdev;
        swap.offset = offset;
        error = ioctl(dev, SNAPSHOT_SET_SWAP_AREA, &swap);
+       /* We cast blkdev to `unsigned long' here because dev_t can be
+        * `unsinged long long' on some architectures. The kernel side expects
+        * a unsigned long however (32 bits is enough). Without the cast this
+        * goes OK on LE, on BE however we end up with the wrong bits...
+        */
        if (error && !offset)
-               error = ioctl(dev, SNAPSHOT_SET_SWAP_FILE, blkdev);
+               error = ioctl(dev, SNAPSHOT_SET_SWAP_FILE, (unsigned 
long)(blkdev));

        return error;
 }

Attachment: signature.asc
Description: PGP signature

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys-and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Suspend-devel mailing list
Suspend-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/suspend-devel

Reply via email to