Lines Matching full:log

18  * LOG FILE structs
29 __le32 sys_page_size; // 0x10: Page size of the system which initialized the log.
30 __le32 page_size; // 0x14: Log page size used for this log file.
53 /* Two copies of these will exist at the beginning of the log file */
55 __le64 current_lsn; // 0x00: Current logical end of log file.
62 __le64 l_size; // 0x18: Usable log file size.
64 __le16 rec_hdr_len; // 0x24: Log page data offset.
65 __le16 data_off; // 0x26: Log page data length.
193 __le32 undo_records; // 0x20: Number of undo log records pending abort
232 /* The following type defines the different log record types. */
236 /* This is used to uniquely identify a client for a particular log file. */
242 /* This is the header that begins every Log Record in the log file. */
248 struct CLIENT_ID client; // 0x1C: Owner of this log record.
262 __le64 last_end_lsn; // 0x08: lsn for the last log record which ends on the page,
279 // Page contains the end of a log record.
290 * END of NTFS LOG structures
341 * Array for log records which require a target attribute.
387 /* Log record length. */
396 struct LFS_RECORD_HDR *lrh; // Log record header of the current lsn.
511 /* Make sure the sequence number bits match the log file size. */ in is_rst_area_valid()
523 /* The log page data offset and record header length must be quad-aligned. */ in is_rst_area_valid()
1060 static inline u32 lsn_to_vbo(struct ntfs_log *log, const u64 lsn) in lsn_to_vbo() argument
1062 u32 vbo = (lsn << log->seq_num_bits) >> (log->seq_num_bits - 3); in lsn_to_vbo()
1067 /* Compute the offset in the log file of the next log page. */
1068 static inline u32 next_page_off(struct ntfs_log *log, u32 off) in next_page_off() argument
1070 off = (off & ~log->sys_page_mask) + log->page_size; in next_page_off()
1071 return off >= log->l_size ? log->first_page : off; in next_page_off()
1074 static inline u32 lsn_to_page_off(struct ntfs_log *log, u64 lsn) in lsn_to_page_off() argument
1076 return (((u32)lsn) << 3) & log->page_mask; in lsn_to_page_off()
1079 static inline u64 vbo_to_lsn(struct ntfs_log *log, u32 off, u64 Seq) in vbo_to_lsn() argument
1081 return (off >> 3) + (Seq << log->file_data_bits); in vbo_to_lsn()
1084 static inline bool is_lsn_in_file(struct ntfs_log *log, u64 lsn) in is_lsn_in_file() argument
1086 return lsn >= log->oldest_lsn && in is_lsn_in_file()
1087 lsn <= le64_to_cpu(log->ra->current_lsn); in is_lsn_in_file()
1090 static inline u32 hdr_file_off(struct ntfs_log *log, in hdr_file_off() argument
1093 if (log->major_ver < 2) in hdr_file_off()
1099 static inline u64 base_lsn(struct ntfs_log *log, in base_lsn() argument
1103 u64 ret = (((h_lsn >> log->file_data_bits) + in base_lsn()
1104 (lsn < (lsn_to_vbo(log, h_lsn) & ~log->page_mask) ? 1 : 0)) in base_lsn()
1105 << log->file_data_bits) + in base_lsn()
1109 log->page_size) + in base_lsn()
1116 static inline bool verify_client_lsn(struct ntfs_log *log, in verify_client_lsn() argument
1120 lsn <= le64_to_cpu(log->ra->current_lsn) && lsn; in verify_client_lsn()
1123 static int read_log_page(struct ntfs_log *log, u32 vbo, in read_log_page() argument
1127 u32 page_idx = vbo >> log->page_bits; in read_log_page()
1128 u32 page_off = vbo & log->page_mask; in read_log_page()
1129 u32 bytes = log->page_size - page_off; in read_log_page()
1131 u32 page_vbo = page_idx << log->page_bits; in read_log_page()
1133 struct ntfs_inode *ni = log->ni; in read_log_page()
1136 if (vbo >= log->l_size) in read_log_page()
1140 to_free = kmalloc(log->page_size, GFP_NOFS); in read_log_page()
1146 page_buf = page_off ? log->one_page_buf : *buffer; in read_log_page()
1149 log->page_size, NULL); in read_log_page()
1184 static int log_read_rst(struct ntfs_log *log, bool first, in log_read_rst() argument
1200 for (; vbo < log->l_size; vbo = 2 * vbo + skip, skip = 0) { in log_read_rst()
1206 if (read_log_page(log, vbo, (struct RECORD_PAGE_HDR **)&r_page, in log_read_rst()
1212 /* Exit if the signature is a log record page. */ in log_read_rst()
1291 * Ilog_init_pg_hdr - Init @log from restart page header.
1293 static void log_init_pg_hdr(struct ntfs_log *log, u16 major_ver, u16 minor_ver) in log_init_pg_hdr() argument
1295 log->sys_page_size = log->page_size; in log_init_pg_hdr()
1296 log->sys_page_mask = log->page_mask; in log_init_pg_hdr()
1298 log->clst_per_page = log->page_size >> log->ni->mi.sbi->cluster_bits; in log_init_pg_hdr()
1299 if (!log->clst_per_page) in log_init_pg_hdr()
1300 log->clst_per_page = 1; in log_init_pg_hdr()
1302 log->first_page = major_ver >= 2 ? 0x22 * log->page_size : in log_init_pg_hdr()
1303 4 * log->page_size; in log_init_pg_hdr()
1304 log->major_ver = major_ver; in log_init_pg_hdr()
1305 log->minor_ver = minor_ver; in log_init_pg_hdr()
1309 * log_create - Init @log in cases when we don't have a restart area to use.
1311 static void log_create(struct ntfs_log *log, const u64 last_lsn, in log_create() argument
1315 log->file_data_bits = blksize_bits(log->l_size) - 3; in log_create()
1316 log->seq_num_mask = (8 << log->file_data_bits) - 1; in log_create()
1317 log->seq_num_bits = sizeof(u64) * 8 - log->file_data_bits; in log_create()
1318 log->seq_num = (last_lsn >> log->file_data_bits) + 2; in log_create()
1319 log->next_page = log->first_page; in log_create()
1320 log->oldest_lsn = log->seq_num << log->file_data_bits; in log_create()
1321 log->oldest_lsn_off = 0; in log_create()
1322 log->last_lsn = log->oldest_lsn; in log_create()
1324 log->l_flags |= NTFSLOG_NO_LAST_LSN | NTFSLOG_NO_OLDEST_LSN; in log_create()
1328 log->l_flags |= NTFSLOG_WRAPPED; in log_create()
1331 log->l_flags |= NTFSLOG_MULTIPLE_PAGE_IO; in log_create()
1333 /* Compute the log page values. */ in log_create()
1334 log->data_off = ALIGN( in log_create()
1336 sizeof(short) * ((log->page_size >> SECTOR_SHIFT) + 1), in log_create()
1338 log->data_size = log->page_size - log->data_off; in log_create()
1339 log->record_header_len = sizeof(struct LFS_RECORD_HDR); in log_create()
1342 log->reserved = log->data_size - log->record_header_len; in log_create()
1345 log->ra_off = ALIGN( in log_create()
1348 ((log->sys_page_size >> SECTOR_SHIFT) + 1), in log_create()
1350 log->restart_size = log->sys_page_size - log->ra_off; in log_create()
1351 log->ra_size = struct_size(log->ra, clients, 1); in log_create()
1352 log->current_openlog_count = open_log_count; in log_create()
1355 * The total available log file space is the number of in log_create()
1356 * log file pages times the space available on each page. in log_create()
1358 log->total_avail_pages = log->l_size - log->first_page; in log_create()
1359 log->total_avail = log->total_avail_pages >> log->page_bits; in log_create()
1366 log->max_current_avail = log->total_avail * log->reserved; in log_create()
1367 log->total_avail = log->total_avail * log->data_size; in log_create()
1368 log->current_avail = log->max_current_avail; in log_create()
1372 * log_create_ra - Fill a restart area from the values stored in @log.
1374 static struct RESTART_AREA *log_create_ra(struct ntfs_log *log) in log_create_ra() argument
1377 struct RESTART_AREA *ra = kzalloc(log->restart_size, GFP_NOFS); in log_create_ra()
1382 ra->current_lsn = cpu_to_le64(log->last_lsn); in log_create_ra()
1385 if (log->l_flags & NTFSLOG_MULTIPLE_PAGE_IO) in log_create_ra()
1387 ra->seq_num_bits = cpu_to_le32(log->seq_num_bits); in log_create_ra()
1388 ra->ra_len = cpu_to_le16(log->ra_size); in log_create_ra()
1390 ra->l_size = cpu_to_le64(log->l_size); in log_create_ra()
1391 ra->rec_hdr_len = cpu_to_le16(log->record_header_len); in log_create_ra()
1392 ra->data_off = cpu_to_le16(log->data_off); in log_create_ra()
1393 ra->open_log_count = cpu_to_le32(log->current_openlog_count + 1); in log_create_ra()
1403 static u32 final_log_off(struct ntfs_log *log, u64 lsn, u32 data_len) in final_log_off() argument
1406 u32 final_log_off = (base_vbo & log->seq_num_mask) & ~log->page_mask; in final_log_off()
1407 u32 page_off = base_vbo & log->page_mask; in final_log_off()
1408 u32 tail = log->page_size - page_off; in final_log_off()
1413 data_len += log->record_header_len; in final_log_off()
1416 * If this lsn is contained this log page we are done. in final_log_off()
1417 * Otherwise we need to walk through several log pages. in final_log_off()
1421 tail = log->data_size; in final_log_off()
1422 page_off = log->data_off - 1; in final_log_off()
1425 final_log_off = next_page_off(log, final_log_off); in final_log_off()
1439 * and then add that value to the file offset of this log page. in final_log_off()
1444 static int next_log_lsn(struct ntfs_log *log, const struct LFS_RECORD_HDR *rh, in next_log_lsn() argument
1449 u32 vbo = lsn_to_vbo(log, this_lsn); in next_log_lsn()
1451 final_log_off(log, this_lsn, le32_to_cpu(rh->client_data_len)); in next_log_lsn()
1452 u32 hdr_off = end & ~log->sys_page_mask; in next_log_lsn()
1453 u64 seq = this_lsn >> log->file_data_bits; in next_log_lsn()
1460 /* Log page header for this page. */ in next_log_lsn()
1461 err = read_log_page(log, hdr_off, &page, NULL); in next_log_lsn()
1473 hdr_off = next_page_off(log, hdr_off); in next_log_lsn()
1474 if (hdr_off == log->first_page) in next_log_lsn()
1477 vbo = hdr_off + log->data_off; in next_log_lsn()
1483 *lsn = vbo_to_lsn(log, vbo, seq); in next_log_lsn()
1489 if (!is_lsn_in_file(log, *lsn)) in next_log_lsn()
1498 * current_log_avail - Calculate the number of bytes available for log records.
1500 static u32 current_log_avail(struct ntfs_log *log) in current_log_avail() argument
1504 if (log->l_flags & NTFSLOG_NO_LAST_LSN) { in current_log_avail()
1506 return log->max_current_avail; in current_log_avail()
1514 oldest_off = (log->l_flags & NTFSLOG_NO_OLDEST_LSN) ? in current_log_avail()
1515 log->first_page : in current_log_avail()
1516 (log->oldest_lsn_off & ~log->sys_page_mask); in current_log_avail()
1519 * We will use the next log page offset to compute the next free page. in current_log_avail()
1523 next_free_off = (log->l_flags & NTFSLOG_REUSE_TAIL) ? in current_log_avail()
1524 log->next_page + log->page_size : in current_log_avail()
1525 log->next_page == log->first_page ? log->l_size : in current_log_avail()
1526 log->next_page; in current_log_avail()
1537 log->total_avail_pages - (next_free_off - oldest_off) : in current_log_avail()
1540 free_bytes >>= log->page_bits; in current_log_avail()
1541 return free_bytes * log->reserved; in current_log_avail()
1544 static bool check_subseq_log_page(struct ntfs_log *log, in check_subseq_log_page() argument
1559 lsn_seq = lsn >> log->file_data_bits; in check_subseq_log_page()
1566 (lsn_seq == seq - 1 && log->first_page == vbo && in check_subseq_log_page()
1567 vbo != (lsn_to_vbo(log, lsn) & ~log->page_mask)); in check_subseq_log_page()
1573 * Walks through the log pages for a file, searching for the
1574 * last log page written to the file.
1576 static int last_log_lsn(struct ntfs_log *log) in last_log_lsn() argument
1581 bool reuse_page = log->l_flags & NTFSLOG_REUSE_TAIL; in last_log_lsn()
1595 u64 last_ok_lsn = reuse_page ? log->last_lsn : 0; in last_log_lsn()
1609 if (log->major_ver >= 2) { in last_log_lsn()
1610 final_off = 0x02 * log->page_size; in last_log_lsn()
1611 second_off = 0x12 * log->page_size; in last_log_lsn()
1614 page_bufs = kmalloc(log->page_size * 0x10, GFP_NOFS); in last_log_lsn()
1618 second_off = log->first_page - log->page_size; in last_log_lsn()
1619 final_off = second_off - log->page_size; in last_log_lsn()
1624 if (read_log_page(log, second_off, &second_tail, &usa_error) || in last_log_lsn()
1631 second_file_off = hdr_file_off(log, second_tail); in last_log_lsn()
1636 if (read_log_page(log, final_off, &first_tail, &usa_error) || in last_log_lsn()
1643 first_file_off = hdr_file_off(log, first_tail); in last_log_lsn()
1647 if (log->major_ver < 2) { in last_log_lsn()
1667 seq_base = (best_page ? lsn2 : lsn1) >> log->file_data_bits; in last_log_lsn()
1671 best_lsn1 = first_tail ? base_lsn(log, first_tail, first_file_off) : 0; in last_log_lsn()
1672 best_lsn2 = second_tail ? base_lsn(log, second_tail, second_file_off) : in last_log_lsn()
1701 seq_base = best_lsn >> log->file_data_bits; in last_log_lsn()
1705 memmove(page_bufs, best_page, log->page_size); in last_log_lsn()
1713 } else if (seq_base == (best_lsn >> log->file_data_bits) && in last_log_lsn()
1714 saved_off + log->page_size == this_off && in last_log_lsn()
1721 saved_off += log->page_size; in last_log_lsn()
1724 memmove(Add2Ptr(page_bufs, tails * log->page_size), best_page, in last_log_lsn()
1725 log->page_size); in last_log_lsn()
1754 final_off += log->page_size; in last_log_lsn()
1755 second_off += log->page_size; in last_log_lsn()
1768 curpage_off = seq_base == log->seq_num ? min(log->next_page, page_off) : in last_log_lsn()
1769 log->next_page; in last_log_lsn()
1772 curpage_off == log->first_page && in last_log_lsn()
1773 !(log->l_flags & (NTFSLOG_NO_LAST_LSN | NTFSLOG_REUSE_TAIL)); in last_log_lsn()
1775 expected_seq = wrapped_file ? (log->seq_num + 1) : log->seq_num; in last_log_lsn()
1781 /* Read the next log page. */ in last_log_lsn()
1782 err = read_log_page(log, curpage_off, &page, &usa_error); in last_log_lsn()
1784 /* Compute the next log page offset the file. */ in last_log_lsn()
1785 nextpage_off = next_page_off(log, curpage_off); in last_log_lsn()
1786 wrapped = nextpage_off == log->first_page; in last_log_lsn()
1825 ((lsn_cur >> log->file_data_bits) + in last_log_lsn()
1827 (lsn_to_vbo(log, lsn_cur) & ~log->page_mask)) ? in last_log_lsn()
1839 log->seq_num = expected_seq; in last_log_lsn()
1840 log->l_flags &= ~NTFSLOG_NO_LAST_LSN; in last_log_lsn()
1841 log->last_lsn = le64_to_cpu(cur_page->record_hdr.last_end_lsn); in last_log_lsn()
1842 log->ra->current_lsn = cur_page->record_hdr.last_end_lsn; in last_log_lsn()
1844 if (log->record_header_len <= in last_log_lsn()
1845 log->page_size - in last_log_lsn()
1847 log->l_flags |= NTFSLOG_REUSE_TAIL; in last_log_lsn()
1848 log->next_page = curpage_off; in last_log_lsn()
1850 log->l_flags &= ~NTFSLOG_REUSE_TAIL; in last_log_lsn()
1851 log->next_page = nextpage_off; in last_log_lsn()
1855 log->l_flags |= NTFSLOG_WRAPPED; in last_log_lsn()
1900 if (expected_seq != (lsn_cur >> log->file_data_bits)) in last_log_lsn()
1924 expected_seq != (lsn_cur >> log->file_data_bits)) { in last_log_lsn()
1973 log->seq_num = expected_seq; in last_log_lsn()
1974 log->last_lsn = le64_to_cpu(page->record_hdr.last_end_lsn); in last_log_lsn()
1975 log->ra->current_lsn = page->record_hdr.last_end_lsn; in last_log_lsn()
1976 log->l_flags &= ~NTFSLOG_NO_LAST_LSN; in last_log_lsn()
1982 if (log->record_header_len <= in last_log_lsn()
1983 log->page_size - in last_log_lsn()
1985 log->l_flags |= NTFSLOG_REUSE_TAIL; in last_log_lsn()
1986 log->next_page = curpage_off; in last_log_lsn()
1988 log->l_flags &= ~NTFSLOG_REUSE_TAIL; in last_log_lsn()
1989 log->next_page = nextpage_off; in last_log_lsn()
1992 /* Remember if we wrapped the log file. */ in last_log_lsn()
1994 log->l_flags |= NTFSLOG_WRAPPED; in last_log_lsn()
2020 log->seq_num = expected_seq; in last_log_lsn()
2021 log->last_lsn = le64_to_cpu(tail_page->record_hdr.last_end_lsn); in last_log_lsn()
2022 log->ra->current_lsn = tail_page->record_hdr.last_end_lsn; in last_log_lsn()
2023 log->l_flags &= ~NTFSLOG_NO_LAST_LSN; in last_log_lsn()
2025 if (log->page_size - in last_log_lsn()
2028 log->record_header_len) { in last_log_lsn()
2029 log->l_flags |= NTFSLOG_REUSE_TAIL; in last_log_lsn()
2030 log->next_page = curpage_off; in last_log_lsn()
2032 log->l_flags &= ~NTFSLOG_REUSE_TAIL; in last_log_lsn()
2033 log->next_page = nextpage_off; in last_log_lsn()
2037 log->l_flags |= NTFSLOG_WRAPPED; in last_log_lsn()
2045 * the sequence number for log records which begon the next page. in last_log_lsn()
2054 if (replace_page || (log->ra->flags & RESTART_SINGLE_PAGE_IO)) { in last_log_lsn()
2063 * If the next page causes us to wrap to the beginning of the log in last_log_lsn()
2078 /* Walk through the file, reading log pages. */ in last_log_lsn()
2079 err = read_log_page(log, nextpage_off, &tst_page, &usa_error); in last_log_lsn()
2096 check_subseq_log_page(log, tst_page, nextpage_off, expected_seq)) { in last_log_lsn()
2106 nextpage_off = next_page_off(log, curpage_off); in last_log_lsn()
2107 wrapped = nextpage_off == log->first_page; in last_log_lsn()
2126 nextpage_off = next_page_off(log, curpage_off); in last_log_lsn()
2127 wrapped = nextpage_off == log->first_page; in last_log_lsn()
2133 /* Call our routine to check this log page. */ in last_log_lsn()
2137 err = read_log_page(log, nextpage_off, &tst_page, &usa_error); in last_log_lsn()
2139 check_subseq_log_page(log, tst_page, nextpage_off, expected_seq)) { in last_log_lsn()
2150 if (sb_rdonly(log->ni->mi.sbi->sb)) { in last_log_lsn()
2157 tails -= (page_off1 - page_off) / log->page_size; in last_log_lsn()
2166 u64 off = hdr_file_off(log, tmp_page); in last_log_lsn()
2169 page = kmalloc(log->page_size, GFP_NOFS); in last_log_lsn()
2180 memcpy(page, tmp_page, log->page_size); in last_log_lsn()
2183 if (log->major_ver < 2) in last_log_lsn()
2190 ntfs_fix_pre_write(&page->rhdr, log->page_size); in last_log_lsn()
2192 err = ntfs_sb_write_run(log->ni->mi.sbi, in last_log_lsn()
2193 &log->ni->file.run, off, page, in last_log_lsn()
2194 log->page_size, 0); in last_log_lsn()
2200 second_off += log->page_size; in last_log_lsn()
2204 tmp_page = Add2Ptr(tmp_page, log->page_size); in last_log_lsn()
2209 if (sb_rdonly(log->ni->mi.sbi->sb)) { in last_log_lsn()
2226 * read_log_rec_buf - Copy a log record from the file to a buffer.
2228 * The log record may span several log pages and may even wrap the file.
2230 static int read_log_rec_buf(struct ntfs_log *log, in read_log_rec_buf() argument
2236 u32 vbo = lsn_to_vbo(log, lsn) & ~log->page_mask; in read_log_rec_buf()
2237 u32 off = lsn_to_page_off(log, lsn) + log->record_header_len; in read_log_rec_buf()
2246 u32 tail = log->page_size - off; in read_log_rec_buf()
2253 err = read_log_page(log, vbo, &ph, &usa_error); in read_log_rec_buf()
2284 vbo = next_page_off(log, vbo); in read_log_rec_buf()
2285 off = log->data_off; in read_log_rec_buf()
2299 static int read_rst_area(struct ntfs_log *log, struct NTFS_RESTART **rst_, in read_rst_area() argument
2305 Add2Ptr(log->ra, le16_to_cpu(log->ra->client_off)); in read_rst_area()
2317 err = read_log_page(log, lsn_to_vbo(log, lsnc), in read_rst_area()
2351 err = read_log_rec_buf(log, rh, rst); in read_rst_area()
2365 static int find_log_rec(struct ntfs_log *log, u64 lsn, struct lcb *lcb) in find_log_rec() argument
2373 err = read_log_page(log, lsn_to_vbo(log, lsn), in find_log_rec()
2382 * If the lsn the log record doesn't match the desired in find_log_rec()
2392 * available space the log file. in find_log_rec()
2394 rec_len = len + log->record_header_len; in find_log_rec()
2395 if (rec_len >= log->total_avail) in find_log_rec()
2399 * If the entire log record is on this log page, in find_log_rec()
2400 * put a pointer to the log record the context block. in find_log_rec()
2412 err = read_log_rec_buf(log, rh, lr); in find_log_rec()
2417 u32 page_off = lsn_to_page_off(log, lsn); in find_log_rec()
2419 if (page_off + len + log->record_header_len > log->page_size) in find_log_rec()
2432 static int read_log_rec_lcb(struct ntfs_log *log, u64 lsn, u32 ctx_mode, in read_log_rec_lcb() argument
2449 cr = Add2Ptr(log->ra, le16_to_cpu(log->ra->client_off)); in read_log_rec_lcb()
2451 if (!verify_client_lsn(log, cr, lsn)) in read_log_rec_lcb()
2457 lcb->client = log->client_id; in read_log_rec_lcb()
2460 /* Find the log record indicated by the given lsn. */ in read_log_rec_lcb()
2461 err = find_log_rec(log, lsn, lcb); in read_log_rec_lcb()
2479 static int find_client_next_lsn(struct ntfs_log *log, struct lcb *lcb, u64 *lsn) in find_client_next_lsn() argument
2495 err = next_log_lsn(log, hdr, &current_lsn); in find_client_next_lsn()
2506 err = read_log_page(log, lsn_to_vbo(log, current_lsn), in find_client_next_lsn()
2539 log, Add2Ptr(log->ra, le16_to_cpu(log->ra->client_off)), in find_client_next_lsn()
2544 err = read_log_page(log, lsn_to_vbo(log, next_lsn), in find_client_next_lsn()
2556 static int read_next_log_rec(struct ntfs_log *log, struct lcb *lcb, u64 *lsn) in read_next_log_rec() argument
2560 err = find_client_next_lsn(log, lcb, lsn); in read_next_log_rec()
2575 return find_log_rec(log, *lsn, lcb); in read_next_log_rec()
2948 static struct OpenAttr *find_loaded_attr(struct ntfs_log *log, in find_loaded_attr() argument
2953 while ((oe = enum_rstbl(log->open_attr_tbl, oe))) { in find_loaded_attr()
3015 static int do_action(struct ntfs_log *log, struct OPEN_ATTR_ENRTY *oe, in do_action() argument
3020 struct ntfs_sb_info *sbi = log->ni->mi.sbi; in do_action()
3053 * Process MFT records, as described by the current log record. in do_action()
3140 * Process attributes, as described by the current log record. in do_action()
3235 oa2 = find_loaded_attr(log, attr, rno_base); in do_action()
3302 oa2 = find_loaded_attr(log, attr, rno_base); in do_action()
3342 oa2 = find_loaded_attr(log, attr, rno_base); in do_action()
3361 oa2 = find_loaded_attr(log, attr, rno_base); in do_action()
3705 log->set_dirty = true; in do_action()
3710 * log_replay - Replays log and empties it.
3713 * It replays log and empties it.
3720 struct ntfs_log *log; in log_replay() local
3756 log = kzalloc(sizeof(struct ntfs_log), GFP_NOFS); in log_replay()
3757 if (!log) in log_replay()
3760 log->ni = ni; in log_replay()
3761 log->l_size = log->orig_file_size = ni->vfs_inode.i_size; in log_replay()
3765 log->page_size = norm_file_page(PAGE_SIZE, &log->l_size, true); in log_replay()
3767 log->page_size = norm_file_page(PAGE_SIZE, &log->l_size, false); in log_replay()
3769 if (!log->page_size) { in log_replay()
3774 log->one_page_buf = kmalloc(log->page_size, GFP_NOFS); in log_replay()
3775 if (!log->one_page_buf) { in log_replay()
3780 log->page_mask = log->page_size - 1; in log_replay()
3781 log->page_bits = blksize_bits(log->page_size); in log_replay()
3784 err = log_read_rst(log, true, &log->rst_info); in log_replay()
3789 *initialized = log->rst_info.initialized; in log_replay()
3791 if (!log->rst_info.restart) { in log_replay()
3792 if (log->rst_info.initialized) { in log_replay()
3798 log_init_pg_hdr(log, 1, 1); in log_replay()
3799 log_create(log, 0, get_random_u32(), false, false); in log_replay()
3801 ra = log_create_ra(log); in log_replay()
3806 log->ra = ra; in log_replay()
3807 log->init_ra = true; in log_replay()
3816 if (log->rst_info.vbo) in log_replay()
3819 err = log_read_rst(log, false, &log->rst_info2); in log_replay()
3824 if (!log->rst_info2.restart || in log_replay()
3825 log->rst_info2.last_lsn <= log->rst_info.last_lsn) in log_replay()
3830 if (log->rst_info.chkdsk_was_run && in log_replay()
3831 log->page_size != log->rst_info.vbo) { in log_replay()
3835 if (!read_log_page(log, log->page_size, &sp, &usa_error) && in log_replay()
3843 kfree(log->rst_info.r_page); in log_replay()
3844 memcpy(&log->rst_info, &log->rst_info2, in log_replay()
3846 log->rst_info2.r_page = NULL; in log_replay()
3850 kfree(log->rst_info2.r_page); in log_replay()
3857 log->init_ra = !!log->rst_info.vbo; in log_replay()
3860 ra2 = log->rst_info.valid_page ? in log_replay()
3861 Add2Ptr(log->rst_info.r_page, in log_replay()
3862 le16_to_cpu(log->rst_info.r_page->ra_off)) : in log_replay()
3865 if (log->rst_info.chkdsk_was_run || in log_replay()
3871 /* Do some checks based on whether we have a valid log page. */ in log_replay()
3872 open_log_count = log->rst_info.valid_page ? in log_replay()
3876 log_init_pg_hdr(log, 1, 1); in log_replay()
3878 log_create(log, log->rst_info.last_lsn, open_log_count, wrapped, in log_replay()
3881 ra = log_create_ra(log); in log_replay()
3886 log->ra = ra; in log_replay()
3889 * the log file as required. in log_replay()
3900 * If the log page or the system page sizes have changed, we can't in log_replay()
3901 * use the log file. We must use the system page size instead of the in log_replay()
3904 t32 = le32_to_cpu(log->rst_info.r_page->sys_page_size); in log_replay()
3905 if (log->page_size != t32) { in log_replay()
3906 log->l_size = log->orig_file_size; in log_replay()
3907 log->page_size = norm_file_page(t32, &log->l_size, in log_replay()
3911 if (log->page_size != t32 || in log_replay()
3912 log->page_size != le32_to_cpu(log->rst_info.r_page->page_size)) { in log_replay()
3918 if (log->l_size < le64_to_cpu(ra2->l_size)) { in log_replay()
3923 log_init_pg_hdr(log, le16_to_cpu(log->rst_info.r_page->major_ver), in log_replay()
3924 le16_to_cpu(log->rst_info.r_page->minor_ver)); in log_replay()
3926 log->l_size = le64_to_cpu(ra2->l_size); in log_replay()
3927 log->seq_num_bits = le32_to_cpu(ra2->seq_num_bits); in log_replay()
3928 log->file_data_bits = sizeof(u64) * 8 - log->seq_num_bits; in log_replay()
3929 log->seq_num_mask = (8 << log->file_data_bits) - 1; in log_replay()
3930 log->last_lsn = le64_to_cpu(ra2->current_lsn); in log_replay()
3931 log->seq_num = log->last_lsn >> log->file_data_bits; in log_replay()
3932 log->ra_off = le16_to_cpu(log->rst_info.r_page->ra_off); in log_replay()
3933 log->restart_size = log->sys_page_size - log->ra_off; in log_replay()
3934 log->record_header_len = le16_to_cpu(ra2->rec_hdr_len); in log_replay()
3935 log->ra_size = le16_to_cpu(ra2->ra_len); in log_replay()
3936 log->data_off = le16_to_cpu(ra2->data_off); in log_replay()
3937 log->data_size = log->page_size - log->data_off; in log_replay()
3938 log->reserved = log->data_size - log->record_header_len; in log_replay()
3940 vbo = lsn_to_vbo(log, log->last_lsn); in log_replay()
3942 if (vbo < log->first_page) { in log_replay()
3944 log->l_flags |= NTFSLOG_NO_LAST_LSN; in log_replay()
3945 log->next_page = log->first_page; in log_replay()
3949 /* Find the end of this log record. */ in log_replay()
3950 off = final_log_off(log, log->last_lsn, in log_replay()
3955 log->seq_num += 1; in log_replay()
3956 log->l_flags |= NTFSLOG_WRAPPED; in log_replay()
3959 /* Now compute the next log page to use. */ in log_replay()
3960 vbo &= ~log->sys_page_mask; in log_replay()
3961 tail = log->page_size - (off & log->page_mask) - 1; in log_replay()
3964 *If we can fit another log record on the page, in log_replay()
3965 * move back a page the log file. in log_replay()
3967 if (tail >= log->record_header_len) { in log_replay()
3968 log->l_flags |= NTFSLOG_REUSE_TAIL; in log_replay()
3969 log->next_page = vbo; in log_replay()
3971 log->next_page = next_page_off(log, vbo); in log_replay()
3979 log->oldest_lsn = log->last_lsn; in log_replay()
3981 ra2->client_idx[1], &log->oldest_lsn); in log_replay()
3982 log->oldest_lsn_off = lsn_to_vbo(log, log->oldest_lsn); in log_replay()
3984 if (log->oldest_lsn_off < log->first_page) in log_replay()
3985 log->l_flags |= NTFSLOG_NO_OLDEST_LSN; in log_replay()
3988 log->l_flags |= NTFSLOG_WRAPPED | NTFSLOG_MULTIPLE_PAGE_IO; in log_replay()
3990 log->current_openlog_count = le32_to_cpu(ra2->open_log_count); in log_replay()
3991 log->total_avail_pages = log->l_size - log->first_page; in log_replay()
3992 log->total_avail = log->total_avail_pages >> log->page_bits; in log_replay()
3993 log->max_current_avail = log->total_avail * log->reserved; in log_replay()
3994 log->total_avail = log->total_avail * log->data_size; in log_replay()
3996 log->current_avail = current_log_avail(log); in log_replay()
3998 ra = kzalloc(log->restart_size, GFP_NOFS); in log_replay()
4003 log->ra = ra; in log_replay()
4007 memcpy(ra, ra2, log->ra_size); in log_replay()
4013 log->current_openlog_count = get_random_u32(); in log_replay()
4014 ra->open_log_count = cpu_to_le32(log->current_openlog_count); in log_replay()
4015 log->ra_size = offsetof(struct RESTART_AREA, clients) + in log_replay()
4019 ra->ra_len = cpu_to_le16(log->ra_size); in log_replay()
4025 err = last_log_lsn(log); in log_replay()
4029 log->current_avail = current_log_avail(log); in log_replay()
4032 log->init_ra = log->rst_info.vbo; in log_replay()
4035 /* 1.0, 1.1, 2.0 log->major_ver/minor_ver - short values. */ in log_replay()
4036 switch ((log->major_ver << 16) + log->minor_ver) { in log_replay()
4043 log->major_ver, log->minor_ver); in log_replay()
4045 log->set_dirty = true; in log_replay()
4067 cr->oldest_lsn = cpu_to_le64(log->oldest_lsn); in log_replay()
4089 log->client_id.seq_num = cr->seq_num; in log_replay()
4090 log->client_id.client_idx = client; in log_replay()
4092 err = read_rst_area(log, &rst, &checkpt_lsn); in log_replay()
4109 err = read_log_rec_lcb(log, t64, lcb_ctx_prev, &lcb); in log_replay()
4149 err = read_log_rec_lcb(log, t64, lcb_ctx_prev, &lcb); in log_replay()
4201 if (sbi->cluster_size <= log->page_size) in log_replay()
4227 err = read_log_rec_lcb(log, t64, lcb_ctx_prev, &lcb); in log_replay()
4259 err = read_log_rec_lcb(log, t64, lcb_ctx_prev, &lcb); in log_replay()
4289 log->open_attr_tbl = oatbl; in log_replay()
4347 log->open_attr_tbl = oatbl; in log_replay()
4353 err = read_log_rec_lcb(log, checkpt_lsn, lcb_ctx_next, &lcb); in log_replay()
4357 /* Loop to read all subsequent records to the end of the log file. */ in log_replay()
4359 err = read_next_log_rec(log, lcb, &rec_lsn); in log_replay()
4415 * If this is a compensation log record, then change in log_replay()
4421 /* Dispatch to handle log record depending on type. */ in log_replay()
4462 t32 = log->clst_per_page; in log_replay()
4485 * Copy the Lcns from the log record into the Dirty Page Entry. in log_replay()
4504 /* Loop through all of the Lcn ranges this log record. */ in log_replay()
4537 log->open_attr_tbl = oatbl; in log_replay()
4546 log->open_attr_tbl = oatbl; in log_replay()
4552 /* Initialize this entry from the log record. */ in log_replay()
4835 err = read_log_rec_lcb(log, rlsn, lcb_ctx_next, &lcb); in log_replay()
4840 * Now loop to read all of our log records forwards, until in log_replay()
4858 /* Ignore log records that do not update pages. */ in log_replay()
4928 * log record Vcn, after removing this unallocated Vcn. in log_replay()
4933 * If the update described this log record goes beyond in log_replay()
4944 * we can skip this log record. in log_replay()
4954 err = do_action(log, oe, lrh, t16, data, dlen, rec_len, &rec_lsn); in log_replay()
4960 err = read_next_log_rec(log, lcb, &rec_lsn); in log_replay()
4980 log->transaction_id = PtrOffset(trtbl, tr); in log_replay()
4991 err = read_log_rec_lcb(log, undo_next_lsn, lcb_ctx_undo_next, &lcb); in log_replay()
4996 * Now loop to read all of our log records forwards, in log_replay()
5033 vcn &= ~(u64)(log->clst_per_page - 1); in log_replay()
5060 err = do_action(log, oe, lrh, t16, data, dlen, rec_len, NULL); in log_replay()
5067 err = read_next_log_rec(log, lcb, &rec_lsn); in log_replay()
5078 free_rsttbl_idx(trtbl, log->transaction_id); in log_replay()
5080 log->transaction_id = 0; in log_replay()
5096 rh = kzalloc(log->page_size, GFP_NOFS); in log_replay()
5104 t16 = (log->page_size >> SECTOR_SHIFT) + 1; in log_replay()
5106 rh->sys_page_size = cpu_to_le32(log->page_size); in log_replay()
5107 rh->page_size = cpu_to_le32(log->page_size); in log_replay()
5124 ntfs_fix_pre_write(&rh->rhdr, log->page_size); in log_replay()
5126 err = ntfs_sb_write_run(sbi, &ni->file.run, 0, rh, log->page_size, 0); in log_replay()
5128 err = ntfs_sb_write_run(sbi, &log->ni->file.run, log->page_size, in log_replay()
5129 rh, log->page_size, 0); in log_replay()
5172 kfree(log->rst_info.r_page); in log_replay()
5175 kfree(log->one_page_buf); in log_replay()
5182 else if (log->set_dirty) in log_replay()
5185 kfree(log); in log_replay()