mount.c revision 3b4b82634489b2f9d367b1f897d51a341208d163
1/**
2 * mount.c
3 *
4 * Copyright (c) 2013 Samsung Electronics Co., Ltd.
5 *             http://www.samsung.com/
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11#include "fsck.h"
12
13void print_inode_info(struct f2fs_inode *inode)
14{
15	unsigned int i = 0;
16	int namelen = le32_to_cpu(inode->i_namelen);
17
18	DISP_u32(inode, i_mode);
19	DISP_u32(inode, i_uid);
20	DISP_u32(inode, i_gid);
21	DISP_u32(inode, i_links);
22	DISP_u64(inode, i_size);
23	DISP_u64(inode, i_blocks);
24
25	DISP_u64(inode, i_atime);
26	DISP_u32(inode, i_atime_nsec);
27	DISP_u64(inode, i_ctime);
28	DISP_u32(inode, i_ctime_nsec);
29	DISP_u64(inode, i_mtime);
30	DISP_u32(inode, i_mtime_nsec);
31
32	DISP_u32(inode, i_generation);
33	DISP_u32(inode, i_current_depth);
34	DISP_u32(inode, i_xattr_nid);
35	DISP_u32(inode, i_flags);
36	DISP_u32(inode, i_pino);
37
38	if (namelen) {
39		DISP_u32(inode, i_namelen);
40		inode->i_name[namelen] = '\0';
41		DISP_utf(inode, i_name);
42	}
43
44	printf("i_ext: fofs:%x blkaddr:%x len:%x\n",
45			inode->i_ext.fofs,
46			inode->i_ext.blk_addr,
47			inode->i_ext.len);
48
49	DISP_u32(inode, i_addr[0]);	/* Pointers to data blocks */
50	DISP_u32(inode, i_addr[1]);	/* Pointers to data blocks */
51	DISP_u32(inode, i_addr[2]);	/* Pointers to data blocks */
52	DISP_u32(inode, i_addr[3]);	/* Pointers to data blocks */
53
54	for (i = 4; i < ADDRS_PER_INODE(inode); i++) {
55		if (inode->i_addr[i] != 0x0) {
56			printf("i_addr[0x%x] points data block\r\t\t\t\t[0x%4x]\n",
57					i, inode->i_addr[i]);
58			break;
59		}
60	}
61
62	DISP_u32(inode, i_nid[0]);	/* direct */
63	DISP_u32(inode, i_nid[1]);	/* direct */
64	DISP_u32(inode, i_nid[2]);	/* indirect */
65	DISP_u32(inode, i_nid[3]);	/* indirect */
66	DISP_u32(inode, i_nid[4]);	/* double indirect */
67
68	printf("\n");
69}
70
71void print_node_info(struct f2fs_node *node_block)
72{
73	nid_t ino = le32_to_cpu(node_block->footer.ino);
74	nid_t nid = le32_to_cpu(node_block->footer.nid);
75	/* Is this inode? */
76	if (ino == nid) {
77		DBG(0, "Node ID [0x%x:%u] is inode\n", nid, nid);
78		print_inode_info(&node_block->i);
79	} else {
80		int i;
81		u32 *dump_blk = (u32 *)node_block;
82		DBG(0, "Node ID [0x%x:%u] is direct node or indirect node.\n", nid, nid);
83		for (i = 0; i <= 10; i++)
84			MSG(0, "[%d]\t\t\t[0x%8x : %d]\n", i, dump_blk[i], dump_blk[i]);
85	}
86}
87
88void print_raw_sb_info(struct f2fs_sb_info *sbi)
89{
90	struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
91
92	if (!config.dbg_lv)
93		return;
94
95	printf("\n");
96	printf("+--------------------------------------------------------+\n");
97	printf("| Super block                                            |\n");
98	printf("+--------------------------------------------------------+\n");
99
100	DISP_u32(sb, magic);
101	DISP_u32(sb, major_ver);
102	DISP_u32(sb, minor_ver);
103	DISP_u32(sb, log_sectorsize);
104	DISP_u32(sb, log_sectors_per_block);
105
106	DISP_u32(sb, log_blocksize);
107	DISP_u32(sb, log_blocks_per_seg);
108	DISP_u32(sb, segs_per_sec);
109	DISP_u32(sb, secs_per_zone);
110	DISP_u32(sb, checksum_offset);
111	DISP_u64(sb, block_count);
112
113	DISP_u32(sb, section_count);
114	DISP_u32(sb, segment_count);
115	DISP_u32(sb, segment_count_ckpt);
116	DISP_u32(sb, segment_count_sit);
117	DISP_u32(sb, segment_count_nat);
118
119	DISP_u32(sb, segment_count_ssa);
120	DISP_u32(sb, segment_count_main);
121	DISP_u32(sb, segment0_blkaddr);
122
123	DISP_u32(sb, cp_blkaddr);
124	DISP_u32(sb, sit_blkaddr);
125	DISP_u32(sb, nat_blkaddr);
126	DISP_u32(sb, ssa_blkaddr);
127	DISP_u32(sb, main_blkaddr);
128
129	DISP_u32(sb, root_ino);
130	DISP_u32(sb, node_ino);
131	DISP_u32(sb, meta_ino);
132	DISP_u32(sb, cp_payload);
133	printf("\n");
134}
135
136void print_ckpt_info(struct f2fs_sb_info *sbi)
137{
138	struct f2fs_checkpoint *cp = F2FS_CKPT(sbi);
139
140	if (!config.dbg_lv)
141		return;
142
143	printf("\n");
144	printf("+--------------------------------------------------------+\n");
145	printf("| Checkpoint                                             |\n");
146	printf("+--------------------------------------------------------+\n");
147
148	DISP_u64(cp, checkpoint_ver);
149	DISP_u64(cp, user_block_count);
150	DISP_u64(cp, valid_block_count);
151	DISP_u32(cp, rsvd_segment_count);
152	DISP_u32(cp, overprov_segment_count);
153	DISP_u32(cp, free_segment_count);
154
155	DISP_u32(cp, alloc_type[CURSEG_HOT_NODE]);
156	DISP_u32(cp, alloc_type[CURSEG_WARM_NODE]);
157	DISP_u32(cp, alloc_type[CURSEG_COLD_NODE]);
158	DISP_u32(cp, cur_node_segno[0]);
159	DISP_u32(cp, cur_node_segno[1]);
160	DISP_u32(cp, cur_node_segno[2]);
161
162	DISP_u32(cp, cur_node_blkoff[0]);
163	DISP_u32(cp, cur_node_blkoff[1]);
164	DISP_u32(cp, cur_node_blkoff[2]);
165
166
167	DISP_u32(cp, alloc_type[CURSEG_HOT_DATA]);
168	DISP_u32(cp, alloc_type[CURSEG_WARM_DATA]);
169	DISP_u32(cp, alloc_type[CURSEG_COLD_DATA]);
170	DISP_u32(cp, cur_data_segno[0]);
171	DISP_u32(cp, cur_data_segno[1]);
172	DISP_u32(cp, cur_data_segno[2]);
173
174	DISP_u32(cp, cur_data_blkoff[0]);
175	DISP_u32(cp, cur_data_blkoff[1]);
176	DISP_u32(cp, cur_data_blkoff[2]);
177
178	DISP_u32(cp, ckpt_flags);
179	DISP_u32(cp, cp_pack_total_block_count);
180	DISP_u32(cp, cp_pack_start_sum);
181	DISP_u32(cp, valid_node_count);
182	DISP_u32(cp, valid_inode_count);
183	DISP_u32(cp, next_free_nid);
184	DISP_u32(cp, sit_ver_bitmap_bytesize);
185	DISP_u32(cp, nat_ver_bitmap_bytesize);
186	DISP_u32(cp, checksum_offset);
187	DISP_u64(cp, elapsed_time);
188
189	DISP_u32(cp, sit_nat_version_bitmap[0]);
190	printf("\n\n");
191}
192
193int sanity_check_raw_super(struct f2fs_super_block *raw_super)
194{
195	unsigned int blocksize;
196
197	if (F2FS_SUPER_MAGIC != le32_to_cpu(raw_super->magic)) {
198		return -1;
199	}
200
201	if (F2FS_BLKSIZE != PAGE_CACHE_SIZE) {
202		return -1;
203	}
204
205	blocksize = 1 << le32_to_cpu(raw_super->log_blocksize);
206	if (F2FS_BLKSIZE != blocksize) {
207		return -1;
208	}
209
210	if (F2FS_LOG_SECTOR_SIZE != le32_to_cpu(raw_super->log_sectorsize)) {
211		return -1;
212	}
213
214	if (F2FS_LOG_SECTORS_PER_BLOCK != le32_to_cpu(raw_super->log_sectors_per_block)) {
215		return -1;
216	}
217
218	return 0;
219}
220
221int validate_super_block(struct f2fs_sb_info *sbi, int block)
222{
223	u64 offset = (block + 1) * F2FS_SUPER_OFFSET;
224	sbi->raw_super = malloc(sizeof(struct f2fs_super_block));
225
226	if (dev_read(sbi->raw_super, offset, sizeof(struct f2fs_super_block)))
227		return -1;
228
229	if (!sanity_check_raw_super(sbi->raw_super))
230		return 0;
231
232	free(sbi->raw_super);
233	MSG(0, "\tCan't find a valid F2FS filesystem in %d superblock\n", block);
234
235	return -EINVAL;
236}
237
238int init_sb_info(struct f2fs_sb_info *sbi)
239{
240	struct f2fs_super_block *raw_super = sbi->raw_super;
241
242	sbi->log_sectors_per_block =
243		le32_to_cpu(raw_super->log_sectors_per_block);
244	sbi->log_blocksize = le32_to_cpu(raw_super->log_blocksize);
245	sbi->blocksize = 1 << sbi->log_blocksize;
246	sbi->log_blocks_per_seg = le32_to_cpu(raw_super->log_blocks_per_seg);
247	sbi->blocks_per_seg = 1 << sbi->log_blocks_per_seg;
248	sbi->segs_per_sec = le32_to_cpu(raw_super->segs_per_sec);
249	sbi->secs_per_zone = le32_to_cpu(raw_super->secs_per_zone);
250	sbi->total_sections = le32_to_cpu(raw_super->section_count);
251	sbi->total_node_count =
252		(le32_to_cpu(raw_super->segment_count_nat) / 2)
253		* sbi->blocks_per_seg * NAT_ENTRY_PER_BLOCK;
254	sbi->root_ino_num = le32_to_cpu(raw_super->root_ino);
255	sbi->node_ino_num = le32_to_cpu(raw_super->node_ino);
256	sbi->meta_ino_num = le32_to_cpu(raw_super->meta_ino);
257	sbi->cur_victim_sec = NULL_SEGNO;
258	return 0;
259}
260
261void *validate_checkpoint(struct f2fs_sb_info *sbi, block_t cp_addr, unsigned long long *version)
262{
263	void *cp_page_1, *cp_page_2;
264	struct f2fs_checkpoint *cp_block;
265	unsigned long blk_size = sbi->blocksize;
266	unsigned long long cur_version = 0, pre_version = 0;
267	unsigned int crc = 0;
268	size_t crc_offset;
269
270	/* Read the 1st cp block in this CP pack */
271	cp_page_1 = malloc(PAGE_SIZE);
272	if (dev_read_block(cp_page_1, cp_addr) < 0)
273		return NULL;
274
275	cp_block = (struct f2fs_checkpoint *)cp_page_1;
276	crc_offset = le32_to_cpu(cp_block->checksum_offset);
277	if (crc_offset >= blk_size)
278		goto invalid_cp1;
279
280	crc = *(unsigned int *)((unsigned char *)cp_block + crc_offset);
281	if (f2fs_crc_valid(crc, cp_block, crc_offset))
282		goto invalid_cp1;
283
284	pre_version = le64_to_cpu(cp_block->checkpoint_ver);
285
286	/* Read the 2nd cp block in this CP pack */
287	cp_page_2 = malloc(PAGE_SIZE);
288	cp_addr += le32_to_cpu(cp_block->cp_pack_total_block_count) - 1;
289
290	if (dev_read_block(cp_page_2, cp_addr) < 0)
291		goto invalid_cp2;
292
293	cp_block = (struct f2fs_checkpoint *)cp_page_2;
294	crc_offset = le32_to_cpu(cp_block->checksum_offset);
295	if (crc_offset >= blk_size)
296		goto invalid_cp2;
297
298	crc = *(unsigned int *)((unsigned char *)cp_block + crc_offset);
299	if (f2fs_crc_valid(crc, cp_block, crc_offset))
300		goto invalid_cp2;
301
302	cur_version = le64_to_cpu(cp_block->checkpoint_ver);
303
304	if (cur_version == pre_version) {
305		*version = cur_version;
306		free(cp_page_2);
307		return cp_page_1;
308	}
309
310invalid_cp2:
311	free(cp_page_2);
312invalid_cp1:
313	free(cp_page_1);
314	return NULL;
315}
316
317int get_valid_checkpoint(struct f2fs_sb_info *sbi)
318{
319	struct f2fs_super_block *raw_sb = sbi->raw_super;
320	void *cp1, *cp2, *cur_page;
321	unsigned long blk_size = sbi->blocksize;
322	unsigned long long cp1_version = 0, cp2_version = 0;
323	unsigned long long cp_start_blk_no;
324	unsigned int cp_blks = 1 + le32_to_cpu(F2FS_RAW_SUPER(sbi)->cp_payload);
325
326	sbi->ckpt = malloc(cp_blks * blk_size);
327	if (!sbi->ckpt)
328		return -ENOMEM;
329	/*
330	 * Finding out valid cp block involves read both
331	 * sets( cp pack1 and cp pack 2)
332	 */
333	cp_start_blk_no = le32_to_cpu(raw_sb->cp_blkaddr);
334	cp1 = validate_checkpoint(sbi, cp_start_blk_no, &cp1_version);
335
336	/* The second checkpoint pack should start at the next segment */
337	cp_start_blk_no += 1 << le32_to_cpu(raw_sb->log_blocks_per_seg);
338	cp2 = validate_checkpoint(sbi, cp_start_blk_no, &cp2_version);
339
340	if (cp1 && cp2) {
341		if (ver_after(cp2_version, cp1_version))
342			cur_page = cp2;
343		else
344			cur_page = cp1;
345	} else if (cp1) {
346		cur_page = cp1;
347	} else if (cp2) {
348		cur_page = cp2;
349	} else {
350		free(cp1);
351		free(cp2);
352		goto fail_no_cp;
353	}
354
355	memcpy(sbi->ckpt, cur_page, blk_size);
356
357	if (cp_blks > 1) {
358		unsigned int i;
359		unsigned long long cp_blk_no;
360
361		cp_blk_no = le32_to_cpu(raw_sb->cp_blkaddr);
362		if (cur_page == cp2)
363			cp_blk_no += 1 << le32_to_cpu(raw_sb->log_blocks_per_seg);
364		/* copy sit bitmap */
365		for (i = 1; i < cp_blks; i++) {
366			unsigned char *ckpt = (unsigned char *)sbi->ckpt;
367			dev_read_block(cur_page, cp_blk_no + i);
368			memcpy(ckpt + i * blk_size, cur_page, blk_size);
369		}
370	}
371	free(cp1);
372	free(cp2);
373	return 0;
374
375fail_no_cp:
376	free(sbi->ckpt);
377	return -EINVAL;
378}
379
380int sanity_check_ckpt(struct f2fs_sb_info *sbi)
381{
382	unsigned int total, fsmeta;
383	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
384	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
385
386	total = le32_to_cpu(raw_super->segment_count);
387	fsmeta = le32_to_cpu(raw_super->segment_count_ckpt);
388	fsmeta += le32_to_cpu(raw_super->segment_count_sit);
389	fsmeta += le32_to_cpu(raw_super->segment_count_nat);
390	fsmeta += le32_to_cpu(ckpt->rsvd_segment_count);
391	fsmeta += le32_to_cpu(raw_super->segment_count_ssa);
392
393	if (fsmeta >= total)
394		return 1;
395
396	return 0;
397}
398
399int init_node_manager(struct f2fs_sb_info *sbi)
400{
401	struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi);
402	struct f2fs_nm_info *nm_i = NM_I(sbi);
403	unsigned char *version_bitmap;
404	unsigned int nat_segs, nat_blocks;
405
406	nm_i->nat_blkaddr = le32_to_cpu(sb_raw->nat_blkaddr);
407
408	/* segment_count_nat includes pair segment so divide to 2. */
409	nat_segs = le32_to_cpu(sb_raw->segment_count_nat) >> 1;
410	nat_blocks = nat_segs << le32_to_cpu(sb_raw->log_blocks_per_seg);
411	nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nat_blocks;
412	nm_i->fcnt = 0;
413	nm_i->nat_cnt = 0;
414	nm_i->init_scan_nid = le32_to_cpu(sbi->ckpt->next_free_nid);
415	nm_i->next_scan_nid = le32_to_cpu(sbi->ckpt->next_free_nid);
416
417	nm_i->bitmap_size = __bitmap_size(sbi, NAT_BITMAP);
418
419	nm_i->nat_bitmap = malloc(nm_i->bitmap_size);
420	if (!nm_i->nat_bitmap)
421		return -ENOMEM;
422	version_bitmap = __bitmap_ptr(sbi, NAT_BITMAP);
423	if (!version_bitmap)
424		return -EFAULT;
425
426	/* copy version bitmap */
427	memcpy(nm_i->nat_bitmap, version_bitmap, nm_i->bitmap_size);
428	return 0;
429}
430
431int build_node_manager(struct f2fs_sb_info *sbi)
432{
433	int err;
434	sbi->nm_info = malloc(sizeof(struct f2fs_nm_info));
435	if (!sbi->nm_info)
436		return -ENOMEM;
437
438	err = init_node_manager(sbi);
439	if (err)
440		return err;
441
442	return 0;
443}
444
445int build_sit_info(struct f2fs_sb_info *sbi)
446{
447	struct f2fs_super_block *raw_sb = F2FS_RAW_SUPER(sbi);
448	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
449	struct sit_info *sit_i;
450	unsigned int sit_segs, start;
451	char *src_bitmap, *dst_bitmap;
452	unsigned int bitmap_size;
453
454	sit_i = malloc(sizeof(struct sit_info));
455	if (!sit_i)
456		return -ENOMEM;
457
458	SM_I(sbi)->sit_info = sit_i;
459
460	sit_i->sentries = calloc(TOTAL_SEGS(sbi) * sizeof(struct seg_entry), 1);
461
462	for (start = 0; start < TOTAL_SEGS(sbi); start++) {
463		sit_i->sentries[start].cur_valid_map
464			= calloc(SIT_VBLOCK_MAP_SIZE, 1);
465		sit_i->sentries[start].ckpt_valid_map
466			= calloc(SIT_VBLOCK_MAP_SIZE, 1);
467		if (!sit_i->sentries[start].cur_valid_map
468				|| !sit_i->sentries[start].ckpt_valid_map)
469			return -ENOMEM;
470	}
471
472	sit_segs = le32_to_cpu(raw_sb->segment_count_sit) >> 1;
473	bitmap_size = __bitmap_size(sbi, SIT_BITMAP);
474	src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP);
475
476	dst_bitmap = malloc(bitmap_size);
477	memcpy(dst_bitmap, src_bitmap, bitmap_size);
478
479	sit_i->sit_base_addr = le32_to_cpu(raw_sb->sit_blkaddr);
480	sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg;
481	sit_i->written_valid_blocks = le64_to_cpu(ckpt->valid_block_count);
482	sit_i->sit_bitmap = dst_bitmap;
483	sit_i->bitmap_size = bitmap_size;
484	sit_i->dirty_sentries = 0;
485	sit_i->sents_per_block = SIT_ENTRY_PER_BLOCK;
486	sit_i->elapsed_time = le64_to_cpu(ckpt->elapsed_time);
487	return 0;
488}
489
490void reset_curseg(struct f2fs_sb_info *sbi, int type)
491{
492	struct curseg_info *curseg = CURSEG_I(sbi, type);
493
494	curseg->segno = curseg->next_segno;
495	curseg->zone = GET_ZONENO_FROM_SEGNO(sbi, curseg->segno);
496	curseg->next_blkoff = 0;
497	curseg->next_segno = NULL_SEGNO;
498
499}
500
501int read_compacted_summaries(struct f2fs_sb_info *sbi)
502{
503	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
504	struct curseg_info *curseg;
505	block_t start;
506	char *kaddr;
507	unsigned int i, j, offset;
508
509	start = start_sum_block(sbi);
510
511	kaddr = (char *)malloc(PAGE_SIZE);
512	dev_read_block(kaddr, start++);
513
514	curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
515	memcpy(&curseg->sum_blk->n_nats, kaddr, SUM_JOURNAL_SIZE);
516
517	curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
518	memcpy(&curseg->sum_blk->n_sits, kaddr + SUM_JOURNAL_SIZE, SUM_JOURNAL_SIZE);
519
520	offset = 2 * SUM_JOURNAL_SIZE;
521	for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) {
522		unsigned short blk_off;
523		unsigned int segno;
524
525		curseg = CURSEG_I(sbi, i);
526		segno = le32_to_cpu(ckpt->cur_data_segno[i]);
527		blk_off = le16_to_cpu(ckpt->cur_data_blkoff[i]);
528		curseg->next_segno = segno;
529		reset_curseg(sbi, i);
530		curseg->alloc_type = ckpt->alloc_type[i];
531		curseg->next_blkoff = blk_off;
532
533		if (curseg->alloc_type == SSR)
534			blk_off = sbi->blocks_per_seg;
535
536		for (j = 0; j < blk_off; j++) {
537			struct f2fs_summary *s;
538			s = (struct f2fs_summary *)(kaddr + offset);
539			curseg->sum_blk->entries[j] = *s;
540			offset += SUMMARY_SIZE;
541			if (offset + SUMMARY_SIZE <= PAGE_CACHE_SIZE - SUM_FOOTER_SIZE)
542				continue;
543			memset(kaddr, 0, PAGE_SIZE);
544			dev_read_block(kaddr, start++);
545			offset = 0;
546		}
547	}
548
549	free(kaddr);
550	return 0;
551}
552
553int restore_node_summary(struct f2fs_sb_info *sbi,
554		unsigned int segno, struct f2fs_summary_block *sum_blk)
555{
556	struct f2fs_node *node_blk;
557	struct f2fs_summary *sum_entry;
558	void *page;
559	block_t addr;
560	unsigned int i;
561
562	page = malloc(PAGE_SIZE);
563	if (!page)
564		return -ENOMEM;
565
566	/* scan the node segment */
567	addr = START_BLOCK(sbi, segno);
568	sum_entry = &sum_blk->entries[0];
569
570	for (i = 0; i < sbi->blocks_per_seg; i++, sum_entry++) {
571		if (dev_read_block(page, addr))
572			goto out;
573
574		node_blk = (struct f2fs_node *)page;
575		sum_entry->nid = node_blk->footer.nid;
576		/* do not change original value */
577#if 0
578		sum_entry->version = 0;
579		sum_entry->ofs_in_node = 0;
580#endif
581		addr++;
582
583	}
584out:
585	free(page);
586	return 0;
587}
588
589int read_normal_summaries(struct f2fs_sb_info *sbi, int type)
590{
591	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
592	struct f2fs_summary_block *sum_blk;
593	struct curseg_info *curseg;
594	unsigned short blk_off;
595	unsigned int segno = 0;
596	block_t blk_addr = 0;
597
598	if (IS_DATASEG(type)) {
599		segno = le32_to_cpu(ckpt->cur_data_segno[type]);
600		blk_off = le16_to_cpu(ckpt->cur_data_blkoff[type - CURSEG_HOT_DATA]);
601
602		if (is_set_ckpt_flags(ckpt, CP_UMOUNT_FLAG))
603			blk_addr = sum_blk_addr(sbi, NR_CURSEG_TYPE, type);
604		else
605			blk_addr = sum_blk_addr(sbi, NR_CURSEG_DATA_TYPE, type);
606	} else {
607		segno = le32_to_cpu(ckpt->cur_node_segno[type - CURSEG_HOT_NODE]);
608		blk_off = le16_to_cpu(ckpt->cur_node_blkoff[type - CURSEG_HOT_NODE]);
609
610		if (is_set_ckpt_flags(ckpt, CP_UMOUNT_FLAG))
611			blk_addr = sum_blk_addr(sbi, NR_CURSEG_NODE_TYPE, type - CURSEG_HOT_NODE);
612		else
613			blk_addr = GET_SUM_BLKADDR(sbi, segno);
614	}
615
616	sum_blk = (struct f2fs_summary_block *)malloc(PAGE_SIZE);
617	dev_read_block(sum_blk, blk_addr);
618
619	if (IS_NODESEG(type)) {
620		if (is_set_ckpt_flags(ckpt, CP_UMOUNT_FLAG)) {
621			struct f2fs_summary *sum_entry = &sum_blk->entries[0];
622			unsigned int i;
623			for (i = 0; i < sbi->blocks_per_seg; i++, sum_entry++) {
624				/* do not change original value */
625#if 0
626				sum_entry->version = 0;
627				sum_entry->ofs_in_node = 0;
628#endif
629			}
630		} else {
631			if (restore_node_summary(sbi, segno, sum_blk)) {
632				free(sum_blk);
633				return -EINVAL;
634			}
635		}
636	}
637
638	curseg = CURSEG_I(sbi, type);
639	memcpy(curseg->sum_blk, sum_blk, PAGE_CACHE_SIZE);
640	curseg->next_segno = segno;
641	reset_curseg(sbi, type);
642	curseg->alloc_type = ckpt->alloc_type[type];
643	curseg->next_blkoff = blk_off;
644	free(sum_blk);
645
646	return 0;
647}
648
649int restore_curseg_summaries(struct f2fs_sb_info *sbi)
650{
651	int type = CURSEG_HOT_DATA;
652
653	if (is_set_ckpt_flags(F2FS_CKPT(sbi), CP_COMPACT_SUM_FLAG)) {
654		if (read_compacted_summaries(sbi))
655			return -EINVAL;
656		type = CURSEG_HOT_NODE;
657	}
658
659	for (; type <= CURSEG_COLD_NODE; type++) {
660		if (read_normal_summaries(sbi, type))
661			return -EINVAL;
662	}
663	return 0;
664}
665
666int build_curseg(struct f2fs_sb_info *sbi)
667{
668	struct curseg_info *array;
669	int i;
670
671	array = malloc(sizeof(*array) * NR_CURSEG_TYPE);
672
673	SM_I(sbi)->curseg_array = array;
674
675	for (i = 0; i < NR_CURSEG_TYPE; i++) {
676		array[i].sum_blk = malloc(PAGE_CACHE_SIZE);
677		if (!array[i].sum_blk)
678			return -ENOMEM;
679		array[i].segno = NULL_SEGNO;
680		array[i].next_blkoff = 0;
681	}
682	return restore_curseg_summaries(sbi);
683}
684
685inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int segno)
686{
687	unsigned int end_segno = SM_I(sbi)->segment_count - 1;
688	ASSERT(segno <= end_segno);
689}
690
691struct f2fs_sit_block *get_current_sit_page(struct f2fs_sb_info *sbi, unsigned int segno)
692{
693	struct sit_info *sit_i = SIT_I(sbi);
694	unsigned int offset = SIT_BLOCK_OFFSET(sit_i, segno);
695	block_t blk_addr = sit_i->sit_base_addr + offset;
696	struct f2fs_sit_block *sit_blk = calloc(BLOCK_SZ, 1);
697
698	check_seg_range(sbi, segno);
699
700	/* calculate sit block address */
701	if (f2fs_test_bit(offset, sit_i->sit_bitmap))
702		blk_addr += sit_i->sit_blocks;
703
704	dev_read_block(sit_blk, blk_addr);
705
706	return sit_blk;
707}
708
709void check_block_count(struct f2fs_sb_info *sbi,
710		unsigned int segno, struct f2fs_sit_entry *raw_sit)
711{
712	struct f2fs_sm_info *sm_info = SM_I(sbi);
713	unsigned int end_segno = sm_info->segment_count - 1;
714	int valid_blocks = 0;
715	unsigned int i;
716
717
718	/* check segment usage */
719	ASSERT(GET_SIT_VBLOCKS(raw_sit) <= sbi->blocks_per_seg);
720
721	/* check boundary of a given segment number */
722	ASSERT(segno <= end_segno);
723
724	/* check bitmap with valid block count */
725	for (i = 0; i < sbi->blocks_per_seg; i++)
726		if (f2fs_test_bit(i, (char *)raw_sit->valid_map))
727			valid_blocks++;
728	ASSERT(GET_SIT_VBLOCKS(raw_sit) == valid_blocks);
729}
730
731void seg_info_from_raw_sit(struct seg_entry *se,
732		struct f2fs_sit_entry *raw_sit)
733{
734	se->valid_blocks = GET_SIT_VBLOCKS(raw_sit);
735	se->ckpt_valid_blocks = GET_SIT_VBLOCKS(raw_sit);
736	memcpy(se->cur_valid_map, raw_sit->valid_map, SIT_VBLOCK_MAP_SIZE);
737	memcpy(se->ckpt_valid_map, raw_sit->valid_map, SIT_VBLOCK_MAP_SIZE);
738	se->type = GET_SIT_TYPE(raw_sit);
739	se->mtime = le64_to_cpu(raw_sit->mtime);
740}
741
742struct seg_entry *get_seg_entry(struct f2fs_sb_info *sbi,
743		unsigned int segno)
744{
745	struct sit_info *sit_i = SIT_I(sbi);
746	return &sit_i->sentries[segno];
747}
748
749int get_sum_block(struct f2fs_sb_info *sbi, unsigned int segno, struct f2fs_summary_block *sum_blk)
750{
751	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
752	struct curseg_info *curseg;
753	int type, ret;
754	u64 ssa_blk;
755
756	ssa_blk = GET_SUM_BLKADDR(sbi, segno);
757	for (type = 0; type < NR_CURSEG_NODE_TYPE; type++) {
758		if (segno == ckpt->cur_node_segno[type]) {
759			curseg = CURSEG_I(sbi, CURSEG_HOT_NODE + type);
760			memcpy(sum_blk, curseg->sum_blk, BLOCK_SZ);
761			return SEG_TYPE_CUR_NODE; /* current node seg was not stored */
762		}
763	}
764
765	for (type = 0; type < NR_CURSEG_DATA_TYPE; type++) {
766		if (segno == ckpt->cur_data_segno[type]) {
767			curseg = CURSEG_I(sbi, type);
768			memcpy(sum_blk, curseg->sum_blk, BLOCK_SZ);
769			ASSERT(!IS_SUM_NODE_SEG(sum_blk->footer));
770			DBG(2, "segno [0x%x] is current data seg[0x%x]\n", segno, type);
771			return SEG_TYPE_CUR_DATA; /* current data seg was not stored */
772		}
773	}
774
775	ret = dev_read_block(sum_blk, ssa_blk);
776	ASSERT(ret >= 0);
777
778	if (IS_SUM_NODE_SEG(sum_blk->footer))
779		return SEG_TYPE_NODE;
780	else
781		return SEG_TYPE_DATA;
782
783}
784
785int get_sum_entry(struct f2fs_sb_info *sbi, u32 blk_addr, struct f2fs_summary *sum_entry)
786{
787	struct f2fs_summary_block *sum_blk;
788	u32 segno, offset;
789	int ret;
790
791	segno = GET_SEGNO(sbi, blk_addr);
792	offset = OFFSET_IN_SEG(sbi, blk_addr);
793
794	sum_blk = calloc(BLOCK_SZ, 1);
795
796	ret = get_sum_block(sbi, segno, sum_blk);
797
798	memcpy(sum_entry, &(sum_blk->entries[offset]), sizeof(struct f2fs_summary));
799
800	free(sum_blk);
801	return ret;
802}
803
804static void get_nat_entry(struct f2fs_sb_info *sbi, nid_t nid,
805				struct f2fs_nat_entry *raw_nat)
806{
807	struct f2fs_nm_info *nm_i = NM_I(sbi);
808	struct f2fs_nat_block *nat_block;
809	pgoff_t block_off;
810	pgoff_t block_addr;
811	int seg_off, entry_off;
812	int ret;
813
814	if (lookup_nat_in_journal(sbi, nid, raw_nat) >= 0)
815		return;
816
817	nat_block = (struct f2fs_nat_block *)calloc(BLOCK_SZ, 1);
818
819	block_off = nid / NAT_ENTRY_PER_BLOCK;
820	entry_off = nid % NAT_ENTRY_PER_BLOCK;
821
822	seg_off = block_off >> sbi->log_blocks_per_seg;
823	block_addr = (pgoff_t)(nm_i->nat_blkaddr +
824			(seg_off << sbi->log_blocks_per_seg << 1) +
825			(block_off & ((1 << sbi->log_blocks_per_seg) - 1)));
826
827	if (f2fs_test_bit(block_off, nm_i->nat_bitmap))
828		block_addr += sbi->blocks_per_seg;
829
830	ret = dev_read_block(nat_block, block_addr);
831	ASSERT(ret >= 0);
832
833	memcpy(raw_nat, &nat_block->entries[entry_off],
834					sizeof(struct f2fs_nat_entry));
835	free(nat_block);
836}
837
838void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni)
839{
840	struct f2fs_nat_entry raw_nat;
841	get_nat_entry(sbi, nid, &raw_nat);
842	ni->nid = nid;
843	node_info_from_raw_nat(ni, &raw_nat);
844}
845
846void build_sit_entries(struct f2fs_sb_info *sbi)
847{
848	struct sit_info *sit_i = SIT_I(sbi);
849	struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
850	struct f2fs_summary_block *sum = curseg->sum_blk;
851	unsigned int segno;
852
853	for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
854		struct seg_entry *se = &sit_i->sentries[segno];
855		struct f2fs_sit_block *sit_blk;
856		struct f2fs_sit_entry sit;
857		int i;
858
859		for (i = 0; i < sits_in_cursum(sum); i++) {
860			if (le32_to_cpu(segno_in_journal(sum, i)) == segno) {
861				sit = sit_in_journal(sum, i);
862				goto got_it;
863			}
864		}
865		sit_blk = get_current_sit_page(sbi, segno);
866		sit = sit_blk->entries[SIT_ENTRY_OFFSET(sit_i, segno)];
867		free(sit_blk);
868got_it:
869		check_block_count(sbi, segno, &sit);
870		seg_info_from_raw_sit(se, &sit);
871	}
872
873}
874
875int build_segment_manager(struct f2fs_sb_info *sbi)
876{
877	struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi);
878	struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi);
879	struct f2fs_sm_info *sm_info;
880
881	sm_info = malloc(sizeof(struct f2fs_sm_info));
882	if (!sm_info)
883		return -ENOMEM;
884
885	/* init sm info */
886	sbi->sm_info = sm_info;
887	sm_info->seg0_blkaddr = le32_to_cpu(raw_super->segment0_blkaddr);
888	sm_info->main_blkaddr = le32_to_cpu(raw_super->main_blkaddr);
889	sm_info->segment_count = le32_to_cpu(raw_super->segment_count);
890	sm_info->reserved_segments = le32_to_cpu(ckpt->rsvd_segment_count);
891	sm_info->ovp_segments = le32_to_cpu(ckpt->overprov_segment_count);
892	sm_info->main_segments = le32_to_cpu(raw_super->segment_count_main);
893	sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
894
895	build_sit_info(sbi);
896
897	build_curseg(sbi);
898
899	build_sit_entries(sbi);
900
901	return 0;
902}
903
904int build_sit_area_bitmap(struct f2fs_sb_info *sbi)
905{
906	struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
907	struct f2fs_sm_info *sm_i = SM_I(sbi);
908	unsigned int segno = 0;
909	int j = 0;
910	char *ptr = NULL;
911
912	u32 sum_vblocks = 0;
913	u32 free_segs = 0;
914	u32 vblocks = 0;
915
916	struct seg_entry *se;
917
918	fsck->sit_area_bitmap_sz = sm_i->main_segments * SIT_VBLOCK_MAP_SIZE;
919	fsck->sit_area_bitmap = calloc(1, fsck->sit_area_bitmap_sz);
920	ptr = fsck->sit_area_bitmap;
921
922	ASSERT(fsck->sit_area_bitmap_sz == fsck->main_area_bitmap_sz);
923
924	for (segno = 0; segno < sm_i->main_segments; segno++) {
925		se = get_seg_entry(sbi, segno);
926
927		memcpy(ptr, se->cur_valid_map, SIT_VBLOCK_MAP_SIZE);
928		ptr += SIT_VBLOCK_MAP_SIZE;
929
930		vblocks = 0;
931		for (j = 0; j < SIT_VBLOCK_MAP_SIZE; j++) {
932			vblocks += get_bits_in_byte(se->cur_valid_map[j]);
933		}
934		ASSERT(vblocks == se->valid_blocks);
935
936		if (se->valid_blocks == 0x0) {
937
938			if (sbi->ckpt->cur_node_segno[0] == segno ||
939					sbi->ckpt->cur_data_segno[0] == segno ||
940					sbi->ckpt->cur_node_segno[1] == segno ||
941					sbi->ckpt->cur_data_segno[1] == segno ||
942					sbi->ckpt->cur_node_segno[2] == segno ||
943					sbi->ckpt->cur_data_segno[2] == segno) {
944				continue;
945			} else {
946				free_segs++;
947			}
948
949		} else {
950			ASSERT(se->valid_blocks <= 512);
951			sum_vblocks += se->valid_blocks;
952		}
953	}
954
955	fsck->chk.sit_valid_blocks = sum_vblocks;
956	fsck->chk.sit_free_segs = free_segs;
957
958	DBG(1, "Blocks [0x%x : %d] Free Segs [0x%x : %d]\n\n", sum_vblocks, sum_vblocks,
959			free_segs, free_segs);
960	return 0;
961}
962
963int lookup_nat_in_journal(struct f2fs_sb_info *sbi, u32 nid, struct f2fs_nat_entry *raw_nat)
964{
965	struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA);
966	struct f2fs_summary_block *sum = curseg->sum_blk;
967	int i = 0;
968
969	for (i = 0; i < nats_in_cursum(sum); i++) {
970		if (le32_to_cpu(nid_in_journal(sum, i)) == nid) {
971			memcpy(raw_nat, &nat_in_journal(sum, i), sizeof(struct f2fs_nat_entry));
972			DBG(3, "==> Found nid [0x%x] in nat cache\n", nid);
973			return i;
974		}
975	}
976	return -1;
977}
978
979void build_nat_area_bitmap(struct f2fs_sb_info *sbi)
980{
981	struct f2fs_fsck *fsck = F2FS_FSCK(sbi);
982	struct f2fs_super_block *raw_sb = F2FS_RAW_SUPER(sbi);
983	struct f2fs_nm_info *nm_i = NM_I(sbi);
984	struct f2fs_nat_block *nat_block;
985	u32 nid, nr_nat_blks;
986
987	pgoff_t block_off;
988	pgoff_t block_addr;
989	int seg_off;
990	int ret;
991	unsigned int i;
992
993
994	nat_block = (struct f2fs_nat_block *)calloc(BLOCK_SZ, 1);
995
996	/* Alloc & build nat entry bitmap */
997	nr_nat_blks = (le32_to_cpu(raw_sb->segment_count_nat) / 2) << sbi->log_blocks_per_seg;
998
999	fsck->nr_nat_entries = nr_nat_blks * NAT_ENTRY_PER_BLOCK;
1000	fsck->nat_area_bitmap_sz = (fsck->nr_nat_entries + 7) / 8;
1001	fsck->nat_area_bitmap = calloc(fsck->nat_area_bitmap_sz, 1);
1002	ASSERT(fsck->nat_area_bitmap != NULL);
1003
1004	for (block_off = 0; block_off < nr_nat_blks; block_off++) {
1005
1006		seg_off = block_off >> sbi->log_blocks_per_seg;
1007		block_addr = (pgoff_t)(nm_i->nat_blkaddr +
1008				(seg_off << sbi->log_blocks_per_seg << 1) +
1009				(block_off & ((1 << sbi->log_blocks_per_seg) - 1)));
1010
1011		if (f2fs_test_bit(block_off, nm_i->nat_bitmap))
1012			block_addr += sbi->blocks_per_seg;
1013
1014		ret = dev_read_block(nat_block, block_addr);
1015		ASSERT(ret >= 0);
1016
1017		nid = block_off * NAT_ENTRY_PER_BLOCK;
1018		for (i = 0; i < NAT_ENTRY_PER_BLOCK; i++) {
1019			struct f2fs_nat_entry raw_nat;
1020			struct node_info ni;
1021			ni.nid = nid + i;
1022
1023			if ((nid + i) == F2FS_NODE_INO(sbi) ||
1024					(nid + i) == F2FS_META_INO(sbi)) {
1025				ASSERT(nat_block->entries[i].block_addr != 0x0);
1026				continue;
1027			}
1028
1029			if (lookup_nat_in_journal(sbi, nid + i, &raw_nat) >= 0) {
1030				node_info_from_raw_nat(&ni, &raw_nat);
1031				if (ni.blk_addr != 0x0) {
1032					f2fs_set_bit(nid + i, fsck->nat_area_bitmap);
1033					fsck->chk.valid_nat_entry_cnt++;
1034					DBG(3, "nid[0x%x] in nat cache\n", nid + i);
1035				}
1036			} else {
1037				node_info_from_raw_nat(&ni, &nat_block->entries[i]);
1038				if (ni.blk_addr != 0) {
1039					ASSERT(nid + i != 0x0);
1040
1041					DBG(3, "nid[0x%8x] in nat entry [0x%16x] [0x%8x]\n",
1042							nid + i,
1043							ni.blk_addr,
1044							ni.ino);
1045
1046					f2fs_set_bit(nid + i, fsck->nat_area_bitmap);
1047					fsck->chk.valid_nat_entry_cnt++;
1048				}
1049			}
1050		}
1051	}
1052	free(nat_block);
1053
1054	DBG(1, "valid nat entries (block_addr != 0x0) [0x%8x : %u]\n",
1055			fsck->chk.valid_nat_entry_cnt, fsck->chk.valid_nat_entry_cnt);
1056
1057}
1058
1059int f2fs_do_mount(struct f2fs_sb_info *sbi)
1060{
1061	int ret;
1062	sbi->active_logs = NR_CURSEG_TYPE;
1063	ret = validate_super_block(sbi, 0);
1064	if (ret) {
1065		ret = validate_super_block(sbi, 1);
1066		if (ret)
1067			return -1;
1068	}
1069
1070	print_raw_sb_info(sbi);
1071
1072	init_sb_info(sbi);
1073
1074	ret = get_valid_checkpoint(sbi);
1075	if (ret) {
1076		ERR_MSG("Can't find valid checkpoint\n");
1077		return -1;
1078	}
1079
1080	if (sanity_check_ckpt(sbi)) {
1081		ERR_MSG("Checkpoint is polluted\n");
1082		return -1;
1083	}
1084
1085	print_ckpt_info(sbi);
1086
1087	sbi->total_valid_node_count = le32_to_cpu(sbi->ckpt->valid_node_count);
1088	sbi->total_valid_inode_count = le32_to_cpu(sbi->ckpt->valid_inode_count);
1089	sbi->user_block_count = le64_to_cpu(sbi->ckpt->user_block_count);
1090	sbi->total_valid_block_count = le64_to_cpu(sbi->ckpt->valid_block_count);
1091	sbi->last_valid_block_count = sbi->total_valid_block_count;
1092	sbi->alloc_valid_block_count = 0;
1093
1094	if (build_segment_manager(sbi)) {
1095		ERR_MSG("build_segment_manager failed\n");
1096		return -1;
1097	}
1098
1099	if (build_node_manager(sbi)) {
1100		ERR_MSG("build_segment_manager failed\n");
1101		return -1;
1102	}
1103
1104	return ret;
1105}
1106
1107void f2fs_do_umount(struct f2fs_sb_info *sbi)
1108{
1109	struct sit_info *sit_i = SIT_I(sbi);
1110	struct f2fs_sm_info *sm_i = SM_I(sbi);
1111	struct f2fs_nm_info *nm_i = NM_I(sbi);
1112	unsigned int i;
1113
1114	/* free nm_info */
1115	free(nm_i->nat_bitmap);
1116	free(sbi->nm_info);
1117
1118	/* free sit_info */
1119	for (i = 0; i < TOTAL_SEGS(sbi); i++) {
1120		free(sit_i->sentries[i].cur_valid_map);
1121		free(sit_i->sentries[i].ckpt_valid_map);
1122	}
1123	free(sit_i->sit_bitmap);
1124	free(sm_i->sit_info);
1125
1126	/* free sm_info */
1127	for (i = 0; i < NR_CURSEG_TYPE; i++)
1128		free(sm_i->curseg_array[i].sum_blk);
1129
1130	free(sm_i->curseg_array);
1131	free(sbi->sm_info);
1132
1133	free(sbi->ckpt);
1134	free(sbi->raw_super);
1135}
1136