| 
                case WRITE:     // Read only device     if ( !(mtdblk->mtd->flags & MTD_WRITEABLE) )       break;      // Do the write      down(&mtdblk->cache_sem);      err = do_cached_write (mtdblk, req->sector << 9,req->current_nr_sectors << 9, req->buffer);      up(&mtdblk->cache_sem);     if (!err)      res = 1;      break;   }
    end_req:    spin_lock_irq(QUEUE_LOCK(QUEUE));     end_request(res);  } }
  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);  #else  if (register_blkdev(MAJOR_NR,DEVICE_NAME,&mtd_fops)) {   printk(KERN_NOTICE "Can't allocate major number %d for Memory Technology Devices.\n",MTD_BLOCK_MAJOR);   return -EAGAIN;  }  #endif
   /* We fill it in at open() time. */  for (i=0; i< MAX_MTD_DEVICES; i++) {   mtd_sizes[i] = 0;   mtd_blksizes[i] = BLOCK_SIZE;  }  init_waitqueue_head(&thr_wq);  /* Allow the block size to default to BLOCK_SIZE. */  blksize_size[MAJOR_NR] = mtd_blksizes;  blk_size[MAJOR_NR] = mtd_sizes;
   BLK_INIT_QUEUE(BLK_DEFAULT_QUEUE(MAJOR_NR), &mtdblock_request, &mtdblock_lock);
   kernel_thread (mtdblock_thread, NULL, CLONE_FS|CLONE_FILES|CLONE_SIGHAND);  return 0; }
  static void __exit cleanup_mtdblock(void) {  leaving = 1;  wake_up(&thr_wq);  down(&thread_sem);  #ifdef CONFIG_DEVFS_FS   unregister_mtd_user(¬ifier);   devfs_unregister(devfs_dir_handle);   devfs_unregister_blkdev(MTD_BLOCK_MAJOR, DEVICE_NAME);  #else   unregister_blkdev(MAJOR_NR,DEVICE_NAME);  #endif  blk_cleanup_queue(BLK_DEFAULT_QUEUE(MAJOR_NR));  blksize_size[MAJOR_NR] = NULL;  blk_size[MAJOR_NR] = NULL; } 
             |