| 
             static int mtdblock_ioctl(struct inode * inode, struct file * file, unsigned int cmd, unsigned long arg) {  struct mtdblk_dev *mtdblk;  mtdblk = mtdblks[minor(inode->i_rdev)];  switch (cmd) {   case BLKGETSIZE: /* Return device size */    return put_user((mtdblk->mtd->size >> 9), (unsigned long *) arg);
    case BLKFLSBUF:    if(!capable(CAP_SYS_ADMIN))     return -EACCES;    fsync_dev(inode->i_rdev);    invalidate_buffers(inode->i_rdev);    down(&mtdblk->cache_sem);    write_cached_data(mtdblk);    up(&mtdblk->cache_sem);    if (mtdblk->mtd->sync)     mtdblk->mtd->sync(mtdblk->mtd);     return 0;   default:    return -EINVAL;  } }
  static struct block_device_operations mtd_fops =  {  owner: THIS_MODULE,  open: mtdblock_open,  release: mtdblock_release,  ioctl: mtdblock_ioctl };
  static void mtd_notify_add(struct mtd_info* mtd) {  … }
  static void mtd_notify_remove(struct mtd_info* mtd) {  if (!mtd || mtd->type == MTD_ABSENT)   return;
   devfs_unregister(devfs_rw_handle[mtd->index]); }
  int __init init_mtdblock(void) {  int i;
   spin_lock_init(&mtdblks_lock);  /* this lock is used just in kernels >= 2.5.x */  spin_lock_init(&mtdblock_lock);
   #ifdef CONFIG_DEVFS_FS  if (devfs_register_blkdev(MTD_BLOCK_MAJOR, DEVICE_NAME, &mtd_fops))  {   printk(KERN_NOTICE "Can't allocate major number %d for Memory Technology Devices.\n", MTD_BLOCK_MAJOR);   return -EAGAIN;  }
   devfs_dir_handle = devfs_mk_dir(NULL, DEVICE_NAME, NULL);  register_mtd_user(¬ifier); 
             |