18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * usnjrnl.h - NTFS kernel transaction log ($UsnJrnl) handling. Part of the 48c2ecf20Sopenharmony_ci * Linux-NTFS project. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Copyright (c) 2005 Anton Altaparmakov 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#ifdef NTFS_RW 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/fs.h> 128c2ecf20Sopenharmony_ci#include <linux/highmem.h> 138c2ecf20Sopenharmony_ci#include <linux/mm.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci#include "aops.h" 168c2ecf20Sopenharmony_ci#include "debug.h" 178c2ecf20Sopenharmony_ci#include "endian.h" 188c2ecf20Sopenharmony_ci#include "time.h" 198c2ecf20Sopenharmony_ci#include "types.h" 208c2ecf20Sopenharmony_ci#include "usnjrnl.h" 218c2ecf20Sopenharmony_ci#include "volume.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci/** 248c2ecf20Sopenharmony_ci * ntfs_stamp_usnjrnl - stamp the transaction log ($UsnJrnl) on an ntfs volume 258c2ecf20Sopenharmony_ci * @vol: ntfs volume on which to stamp the transaction log 268c2ecf20Sopenharmony_ci * 278c2ecf20Sopenharmony_ci * Stamp the transaction log ($UsnJrnl) on the ntfs volume @vol and return 288c2ecf20Sopenharmony_ci * 'true' on success and 'false' on error. 298c2ecf20Sopenharmony_ci * 308c2ecf20Sopenharmony_ci * This function assumes that the transaction log has already been loaded and 318c2ecf20Sopenharmony_ci * consistency checked by a call to fs/ntfs/super.c::load_and_init_usnjrnl(). 328c2ecf20Sopenharmony_ci */ 338c2ecf20Sopenharmony_cibool ntfs_stamp_usnjrnl(ntfs_volume *vol) 348c2ecf20Sopenharmony_ci{ 358c2ecf20Sopenharmony_ci ntfs_debug("Entering."); 368c2ecf20Sopenharmony_ci if (likely(!NVolUsnJrnlStamped(vol))) { 378c2ecf20Sopenharmony_ci sle64 stamp; 388c2ecf20Sopenharmony_ci struct page *page; 398c2ecf20Sopenharmony_ci USN_HEADER *uh; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0); 428c2ecf20Sopenharmony_ci if (IS_ERR(page)) { 438c2ecf20Sopenharmony_ci ntfs_error(vol->sb, "Failed to read from " 448c2ecf20Sopenharmony_ci "$UsnJrnl/$DATA/$Max attribute."); 458c2ecf20Sopenharmony_ci return false; 468c2ecf20Sopenharmony_ci } 478c2ecf20Sopenharmony_ci uh = (USN_HEADER*)page_address(page); 488c2ecf20Sopenharmony_ci stamp = get_current_ntfs_time(); 498c2ecf20Sopenharmony_ci ntfs_debug("Stamping transaction log ($UsnJrnl): old " 508c2ecf20Sopenharmony_ci "journal_id 0x%llx, old lowest_valid_usn " 518c2ecf20Sopenharmony_ci "0x%llx, new journal_id 0x%llx, new " 528c2ecf20Sopenharmony_ci "lowest_valid_usn 0x%llx.", 538c2ecf20Sopenharmony_ci (long long)sle64_to_cpu(uh->journal_id), 548c2ecf20Sopenharmony_ci (long long)sle64_to_cpu(uh->lowest_valid_usn), 558c2ecf20Sopenharmony_ci (long long)sle64_to_cpu(stamp), 568c2ecf20Sopenharmony_ci i_size_read(vol->usnjrnl_j_ino)); 578c2ecf20Sopenharmony_ci uh->lowest_valid_usn = 588c2ecf20Sopenharmony_ci cpu_to_sle64(i_size_read(vol->usnjrnl_j_ino)); 598c2ecf20Sopenharmony_ci uh->journal_id = stamp; 608c2ecf20Sopenharmony_ci flush_dcache_page(page); 618c2ecf20Sopenharmony_ci set_page_dirty(page); 628c2ecf20Sopenharmony_ci ntfs_unmap_page(page); 638c2ecf20Sopenharmony_ci /* Set the flag so we do not have to do it again on remount. */ 648c2ecf20Sopenharmony_ci NVolSetUsnJrnlStamped(vol); 658c2ecf20Sopenharmony_ci } 668c2ecf20Sopenharmony_ci ntfs_debug("Done."); 678c2ecf20Sopenharmony_ci return true; 688c2ecf20Sopenharmony_ci} 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci#endif /* NTFS_RW */ 71