Messages in this thread |  | | | Date | Thu, 30 Jun 2011 08:31:30 +0200 | | From | Willy Tarreau <> | | Subject | Re: [stable] Ioctl in 2.6.35.22 change the argument value? |
| |
Hello,
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.
Regards, Willy
|  |