4 * Copyright (C) 1991, 1992 Linus Torvalds
8 #include <linux/smp_lock.h>
9 #include <linux/file.h>
11 #include <asm/uaccess.h>
13 static int file_ioctl(struct file
*filp
,unsigned int cmd
,unsigned long arg
)
17 struct inode
* inode
= filp
->f_dentry
->d_inode
;
22 struct buffer_head tmp
;
24 if (inode
->i_op
== NULL
)
26 if (inode
->i_op
->get_block
== NULL
)
28 if (!capable(CAP_SYS_RAWIO
))
30 if ((error
= get_user(block
, (int *) arg
)) != 0)
35 inode
->i_op
->get_block(inode
, block
, &tmp
, 0);
36 return put_user(tmp
.b_blocknr
, (int *) arg
);
39 if (inode
->i_sb
== NULL
)
41 return put_user(inode
->i_sb
->s_blocksize
, (int *) arg
);
43 return put_user(inode
->i_size
- filp
->f_pos
, (int *) arg
);
45 if (filp
->f_op
&& filp
->f_op
->ioctl
)
46 return filp
->f_op
->ioctl(inode
, filp
, cmd
, arg
);
51 asmlinkage
int sys_ioctl(unsigned int fd
, unsigned int cmd
, unsigned long arg
)
55 int on
, error
= -EBADF
;
64 FD_SET(fd
, current
->files
->close_on_exec
);
68 FD_CLR(fd
, current
->files
->close_on_exec
);
72 if ((error
= get_user(on
, (int *)arg
)) != 0)
76 /* SunOS compatibility item. */
77 if(O_NONBLOCK
!= O_NDELAY
)
81 filp
->f_flags
|= flag
;
83 filp
->f_flags
&= ~flag
;
87 if ((error
= get_user(on
, (int *)arg
)) != 0)
89 flag
= on
? FASYNC
: 0;
91 /* Did FASYNC state change ? */
92 if ((flag
^ filp
->f_flags
) & FASYNC
) {
93 if (filp
->f_op
&& filp
->f_op
->fasync
)
94 filp
->f_op
->fasync(fd
, filp
, on
);
97 filp
->f_flags
|= FASYNC
;
99 filp
->f_flags
&= ~FASYNC
;
104 if (!filp
->f_dentry
|| !filp
->f_dentry
->d_inode
)
106 else if (S_ISREG(filp
->f_dentry
->d_inode
->i_mode
))
107 error
= file_ioctl(filp
, cmd
, arg
);
108 else if (filp
->f_op
&& filp
->f_op
->ioctl
)
109 error
= filp
->f_op
->ioctl(filp
->f_dentry
->d_inode
, filp
, cmd
, arg
);