u32 index;
        struct bio_vec *bvec;
 
-       zram_stat64_inc(zram, &zram->stats.num_reads);
+       if (unlikely(!zram->init_done)) {
+               set_bit(BIO_UPTODATE, &bio->bi_flags);
+               bio_endio(bio, 0);
+               return 0;
+       }
 
+       zram_stat64_inc(zram, &zram->stats.num_reads);
        index = bio->bi_sector >> SECTORS_PER_PAGE_SHIFT;
+
        bio_for_each_segment(bvec, bio, i) {
                int ret;
                size_t clen;
 
 static int zram_write(struct zram *zram, struct bio *bio)
 {
-       int i;
+       int i, ret;
        u32 index;
        struct bio_vec *bvec;
 
-       zram_stat64_inc(zram, &zram->stats.num_writes);
+       if (unlikely(!zram->init_done)) {
+               ret = zram_init_device(zram);
+               if (ret)
+                       goto out;
+       }
 
+       zram_stat64_inc(zram, &zram->stats.num_writes);
        index = bio->bi_sector >> SECTORS_PER_PAGE_SHIFT;
 
        bio_for_each_segment(bvec, bio, i) {
-               int ret;
                u32 offset;
                size_t clen;
                struct zobj_header *zheader;
        int ret = 0;
        struct zram *zram = queue->queuedata;
 
-       if (unlikely(!zram->init_done)) {
-               bio_io_error(bio);
-               return 0;
-       }
-
        if (!valid_io_request(zram, bio)) {
                zram_stat64_inc(zram, &zram->stats.invalid_io);
                bio_io_error(bio);
 {
        size_t index;
 
-       /* Do not accept any new I/O request */
+       mutex_lock(&zram->init_lock);
        zram->init_done = 0;
 
        /* Free various per-device buffers */
        memset(&zram->stats, 0, sizeof(zram->stats));
 
        zram->disksize = 0;
+       mutex_unlock(&zram->init_lock);
 }
 
 int zram_init_device(struct zram *zram)
        int ret;
        size_t num_pages;
 
+       mutex_lock(&zram->init_lock);
+
        if (zram->init_done) {
-               pr_info("Device already initialized!\n");
-               return -EBUSY;
+               mutex_unlock(&zram->init_lock);
+               return 0;
        }
 
        zram_set_disksize(zram, totalram_pages << PAGE_SHIFT);
        }
 
        zram->init_done = 1;
+       mutex_unlock(&zram->init_lock);
 
        pr_debug("Initialization done!\n");
        return 0;
 
 fail:
+       mutex_unlock(&zram->init_lock);
        zram_reset_device(zram);
 
        pr_err("Initialization failed: err=%d\n", ret);
        int ret = 0;
 
        mutex_init(&zram->lock);
+       mutex_init(&zram->init_lock);
        spin_lock_init(&zram->stat64_lock);
 
        zram->queue = blk_alloc_queue(GFP_KERNEL);
 
        int ret;
        struct zram *zram = dev_to_zram(dev);
 
-       if (zram->init_done)
+       if (zram->init_done) {
+               pr_info("Cannot change disksize for initialized device\n");
                return -EBUSY;
+       }
 
        ret = strict_strtoull(buf, 10, &zram->disksize);
        if (ret)
        return sprintf(buf, "%u\n", zram->init_done);
 }
 
-static ssize_t initstate_store(struct device *dev,
-               struct device_attribute *attr, const char *buf, size_t len)
-{
-       int ret;
-       unsigned long do_init;
-       struct zram *zram = dev_to_zram(dev);
-
-       ret = strict_strtoul(buf, 10, &do_init);
-       if (ret)
-               return ret;
-
-       if (!do_init)
-               return -EINVAL;
-
-       zram_init_device(zram);
-
-       return len;
-}
-
 static ssize_t reset_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t len)
 {
 
 static DEVICE_ATTR(disksize, S_IRUGO | S_IWUGO,
                disksize_show, disksize_store);
-static DEVICE_ATTR(initstate, S_IRUGO | S_IWUGO,
-               initstate_show, initstate_store);
+static DEVICE_ATTR(initstate, S_IRUGO, initstate_show, NULL);
 static DEVICE_ATTR(reset, S_IWUGO, NULL, reset_store);
 static DEVICE_ATTR(num_reads, S_IRUGO, num_reads_show, NULL);
 static DEVICE_ATTR(num_writes, S_IRUGO, num_writes_show, NULL);