Commit | Line | Data |
---|---|---|
a1d312de | 1 | // SPDX-License-Identifier: GPL-2.0-or-later |
3f2faef0 AA |
2 | /* |
3 | * usnjrnl.h - NTFS kernel transaction log ($UsnJrnl) handling. Part of the | |
4 | * Linux-NTFS project. | |
5 | * | |
6 | * Copyright (c) 2005 Anton Altaparmakov | |
3f2faef0 AA |
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 | |
c49c3111 | 28 | * 'true' on success and 'false' on error. |
3f2faef0 AA |
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 | */ | |
c49c3111 | 33 | bool ntfs_stamp_usnjrnl(ntfs_volume *vol) |
3f2faef0 AA |
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(vol->usnjrnl_max_ino->i_mapping, 0); | |
42 | if (IS_ERR(page)) { | |
43 | ntfs_error(vol->sb, "Failed to read from " | |
44 | "$UsnJrnl/$DATA/$Max attribute."); | |
c49c3111 | 45 | return false; |
3f2faef0 AA |
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(i_size_read(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."); | |
c49c3111 | 67 | return true; |
3f2faef0 AA |
68 | } |
69 | ||
70 | #endif /* NTFS_RW */ |