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