static int dev_ioctl(file_t * file, unsigned request, void * arg, size_t arg_len) { struct dev_info * devnfo = (struct dev_info *)file->vnode->vn_specinfo; if (!devnfo) return -ENOTTY; switch (request) { case IOCTL_GETBLKSIZE: if (!arg) return -EINVAL; sizetto(devnfo->block_size, arg, arg_len); return 0; case IOCTL_GETBLKCNT: if (!arg) return -EINVAL; sizetto(devnfo->num_blocks, arg, arg_len); return 0; } if (!devnfo->ioctl) return -EINVAL; return devnfo->ioctl(devnfo, request, arg, arg_len); }
static int dev_ioctl(file_t * file, unsigned request, void * arg, size_t arg_len) { struct dev_info * devnfo = (struct dev_info *)file->vnode->vn_specinfo; if (!devnfo) return -ENOTTY; if (devnfo->ioctl) { int err; err = devnfo->ioctl(devnfo, request, arg, arg_len); if (err == 0 || err != -EINVAL) return err; } /* * Default handlers. */ switch (request) { case IOCTL_GETBLKSIZE: if (!arg) return -EINVAL; sizetto(devnfo->block_size, arg, arg_len); return 0; case IOCTL_GETBLKCNT: if (!arg) return -EINVAL; sizetto(devnfo->num_blocks, arg, arg_len); return 0; case IOCTL_FLSBLKBUF: /* Don't care if the dev doesn't support sync. */ return 0; default: return -EINVAL; } }