[lkml]   [2011]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    SubjectRe: [stable] Ioctl in change the argument value?

    On Wed, Jun 29, 2011 at 11:09:26PM -0700, ????????? wrote:
    > Hello everybody,
    > When I want to get the block size about the block device(DM or real),I
    > use the system API like "ioctl(int fd, BLKGETSIZE,long size)".
    > Everything works fine. But when I pass the third parameter whose type
    > is "int", the first parameter fd will be changed to zero. It only
    > happened on x86_64 and 2.6.35 ,on 2.6.38 and 32bit will not occur,
    > I've already tested on them.
    > (My PC:Linux server-group 2.6.35-22-server #33-Ubuntu SMP Sun Sep 19
    > 20:48:58 UTC 2010 x86_64 GNU/Linux)
    > here is the test code:
    > int main(){
    > int fd;
    > int blksize ;
    > fd = open("/dev/sda",O_RDONLY,0);
    > ioctl(fd, BLKGETSIZE,&blksize) ;
    > close(fd);
    > }
    > If I change the fd type as long( int fd ==> long fd ) , won't occur
    > again. I quite sure the ioctl syscall when return to userspace changes
    > the fd's value.

    This is expected, check the ioctl list (man ioctl_list) :
    0x00001260 BLKGETSIZE unsigned long *

    So it returns a long, and you need to have blksize declared as long
    and not as int. On 32-bit systems, both are the same size so your
    bug has no effect.

    Please also note that this is irrelevant to the stable list.


     \ /
      Last update: 2011-06-30 08:33    [W:0.020 / U:15.380 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site