1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-or-later 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * usnjrnl.h - NTFS kernel transaction log ($UsnJrnl) handling. Part of the 4*4882a593Smuzhiyun * Linux-NTFS project. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (c) 2005 Anton Altaparmakov 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifdef NTFS_RW 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include <linux/fs.h> 12*4882a593Smuzhiyun #include <linux/highmem.h> 13*4882a593Smuzhiyun #include <linux/mm.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include "aops.h" 16*4882a593Smuzhiyun #include "debug.h" 17*4882a593Smuzhiyun #include "endian.h" 18*4882a593Smuzhiyun #include "time.h" 19*4882a593Smuzhiyun #include "types.h" 20*4882a593Smuzhiyun #include "usnjrnl.h" 21*4882a593Smuzhiyun #include "volume.h" 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /** 24*4882a593Smuzhiyun * ntfs_stamp_usnjrnl - stamp the transaction log ($UsnJrnl) on an ntfs volume 25*4882a593Smuzhiyun * @vol: ntfs volume on which to stamp the transaction log 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * Stamp the transaction log ($UsnJrnl) on the ntfs volume @vol and return 28*4882a593Smuzhiyun * 'true' on success and 'false' on error. 29*4882a593Smuzhiyun * 30*4882a593Smuzhiyun * This function assumes that the transaction log has already been loaded and 31*4882a593Smuzhiyun * consistency checked by a call to fs/ntfs/super.c::load_and_init_usnjrnl(). 32*4882a593Smuzhiyun */ ntfs_stamp_usnjrnl(ntfs_volume * vol)33*4882a593Smuzhiyunbool ntfs_stamp_usnjrnl(ntfs_volume *vol) 34*4882a593Smuzhiyun { 35*4882a593Smuzhiyun ntfs_debug("Entering."); 36*4882a593Smuzhiyun if (likely(!NVolUsnJrnlStamped(vol))) { 37*4882a593Smuzhiyun sle64 stamp; 38*4882a593Smuzhiyun struct page *page; 39*4882a593Smuzhiyun USN_HEADER *uh; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0); 42*4882a593Smuzhiyun if (IS_ERR(page)) { 43*4882a593Smuzhiyun ntfs_error(vol->sb, "Failed to read from " 44*4882a593Smuzhiyun "$UsnJrnl/$DATA/$Max attribute."); 45*4882a593Smuzhiyun return false; 46*4882a593Smuzhiyun } 47*4882a593Smuzhiyun uh = (USN_HEADER*)page_address(page); 48*4882a593Smuzhiyun stamp = get_current_ntfs_time(); 49*4882a593Smuzhiyun ntfs_debug("Stamping transaction log ($UsnJrnl): old " 50*4882a593Smuzhiyun "journal_id 0x%llx, old lowest_valid_usn " 51*4882a593Smuzhiyun "0x%llx, new journal_id 0x%llx, new " 52*4882a593Smuzhiyun "lowest_valid_usn 0x%llx.", 53*4882a593Smuzhiyun (long long)sle64_to_cpu(uh->journal_id), 54*4882a593Smuzhiyun (long long)sle64_to_cpu(uh->lowest_valid_usn), 55*4882a593Smuzhiyun (long long)sle64_to_cpu(stamp), 56*4882a593Smuzhiyun i_size_read(vol->usnjrnl_j_ino)); 57*4882a593Smuzhiyun uh->lowest_valid_usn = 58*4882a593Smuzhiyun cpu_to_sle64(i_size_read(vol->usnjrnl_j_ino)); 59*4882a593Smuzhiyun uh->journal_id = stamp; 60*4882a593Smuzhiyun flush_dcache_page(page); 61*4882a593Smuzhiyun set_page_dirty(page); 62*4882a593Smuzhiyun ntfs_unmap_page(page); 63*4882a593Smuzhiyun /* Set the flag so we do not have to do it again on remount. */ 64*4882a593Smuzhiyun NVolSetUsnJrnlStamped(vol); 65*4882a593Smuzhiyun } 66*4882a593Smuzhiyun ntfs_debug("Done."); 67*4882a593Smuzhiyun return true; 68*4882a593Smuzhiyun } 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #endif /* NTFS_RW */ 71