Hi. On Mon, Mar 15, 2021 at 05:44:06PM +0300, Konstantin Komarov wrote: > This adds initialization of super block > > ...SNIP... > > + > +/* > + * Helper for ntfs_loadlog_and_replay > + * fill on-disk logfile range by (-1) > + * this means empty logfile > + */ > +int ntfs_bio_fill_1(struct ntfs_sb_info *sbi, const struct runs_tree *run) > +{ > + int err = 0; > + struct super_block *sb = sbi->sb; > + struct block_device *bdev = sb->s_bdev; > + u8 cluster_bits = sbi->cluster_bits; > + struct bio *new, *bio = NULL; > + CLST lcn, clen; > + u64 lbo, len; > + size_t run_idx; > + struct page *fill; > + void *kaddr; > + struct blk_plug plug; > + > + fill = alloc_page(GFP_KERNEL); > + if (!fill) > + return -ENOMEM; > + > + kaddr = kmap_atomic(fill); > + memset(kaddr, -1, PAGE_SIZE); > + kunmap_atomic(kaddr); > + flush_dcache_page(fill); > + lock_page(fill); > + > + if (!run_lookup_entry(run, 0, &lcn, &clen, &run_idx)) { > + err = -ENOENT; > + goto out; > + } > + > + /* > + * TODO: try blkdev_issue_write_same > + */ > + blk_start_plug(&plug); > + do { > + lbo = (u64)lcn << cluster_bits; > + len = (u64)clen << cluster_bits; > +new_bio: > + new = ntfs_alloc_bio(BIO_MAX_PAGES); ^^^^^^^^^^^^^ this was renamed to BIO_MAX_VECS recently. > + if (!new) { > + err = -ENOMEM; > + break; > + } > + if (bio) { > + bio_chain(bio, new); > + submit_bio(bio); > + } > + bio = new; > + bio_set_dev(bio, bdev); > + bio->bi_opf = REQ_OP_WRITE; > + bio->bi_iter.bi_sector = lbo >> 9; > + > + for (;;) { > + u32 add = len > PAGE_SIZE ? PAGE_SIZE : len; > + > + if (bio_add_page(bio, fill, add, 0) < add) > + goto new_bio; > + > + lbo += add; > + if (len <= add) > + break; > + len -= add; > + } > + } while (run_get_entry(run, ++run_idx, NULL, &lcn, &clen)); > + > + if (bio) { > + if (!err) > + err = submit_bio_wait(bio); > + bio_put(bio); > + } > + blk_finish_plug(&plug); > +out: > + unlock_page(fill); > + put_page(fill); > + > + return err; > +} > > ...SNIP... > -- Oleksandr Natalenko (post-factum)