Commit | Line | Data |
---|---|---|
3f2faef0 AA |
1 | /* |
2 | * usnjrnl.h - NTFS kernel transaction log ($UsnJrnl) handling. Part of the | |
3 | * Linux-NTFS project. | |
4 | * | |
5 | * Copyright (c) 2005 Anton Altaparmakov | |
6 | * | |
7 | * This program/include file is free software; you can redistribute it and/or | |
8 | * modify it under the terms of the GNU General Public License as published | |
9 | * by the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | * | |
12 | * This program/include file is distributed in the hope that it will be | |
13 | * useful, but WITHOUT ANY WARRANTY; without even the implied warranty | |
14 | * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | * GNU General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License | |
18 | * along with this program (in the main directory of the Linux-NTFS | |
19 | * distribution in the file COPYING); if not, write to the Free Software | |
20 | * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
21 | */ | |
22 | ||
23 | #ifdef NTFS_RW | |
24 | ||
25 | #include <linux/fs.h> | |
26 | #include <linux/highmem.h> | |
27 | #include <linux/mm.h> | |
28 | ||
29 | #include "aops.h" | |
30 | #include "debug.h" | |
31 | #include "endian.h" | |
32 | #include "time.h" | |
33 | #include "types.h" | |
34 | #include "usnjrnl.h" | |
35 | #include "volume.h" | |
36 | ||
37 | /** | |
38 | * ntfs_stamp_usnjrnl - stamp the transaction log ($UsnJrnl) on an ntfs volume | |
39 | * @vol: ntfs volume on which to stamp the transaction log | |
40 | * | |
41 | * Stamp the transaction log ($UsnJrnl) on the ntfs volume @vol and return | |
c49c3111 | 42 | * 'true' on success and 'false' on error. |
3f2faef0 AA |
43 | * |
44 | * This function assumes that the transaction log has already been loaded and | |
45 | * consistency checked by a call to fs/ntfs/super.c::load_and_init_usnjrnl(). | |
46 | */ | |
c49c3111 | 47 | bool ntfs_stamp_usnjrnl(ntfs_volume *vol) |
3f2faef0 AA |
48 | { |
49 | ntfs_debug("Entering."); | |
50 | if (likely(!NVolUsnJrnlStamped(vol))) { | |
51 | sle64 stamp; | |
52 | struct page *page; | |
53 | USN_HEADER *uh; | |
54 | ||
55 | page = ntfs_map_page(vol->usnjrnl_max_ino->i_mapping, 0); | |
56 | if (IS_ERR(page)) { | |
57 | ntfs_error(vol->sb, "Failed to read from " | |
58 | "$UsnJrnl/$DATA/$Max attribute."); | |
c49c3111 | 59 | return false; |
3f2faef0 AA |
60 | } |
61 | uh = (USN_HEADER*)page_address(page); | |
62 | stamp = get_current_ntfs_time(); | |
63 | ntfs_debug("Stamping transaction log ($UsnJrnl): old " | |
64 | "journal_id 0x%llx, old lowest_valid_usn " | |
65 | "0x%llx, new journal_id 0x%llx, new " | |
66 | "lowest_valid_usn 0x%llx.", | |
67 | (long long)sle64_to_cpu(uh->journal_id), | |
68 | (long long)sle64_to_cpu(uh->lowest_valid_usn), | |
69 | (long long)sle64_to_cpu(stamp), | |
70 | i_size_read(vol->usnjrnl_j_ino)); | |
71 | uh->lowest_valid_usn = | |
72 | cpu_to_sle64(i_size_read(vol->usnjrnl_j_ino)); | |
73 | uh->journal_id = stamp; | |
74 | flush_dcache_page(page); | |
75 | set_page_dirty(page); | |
76 | ntfs_unmap_page(page); | |
77 | /* Set the flag so we do not have to do it again on remount. */ | |
78 | NVolSetUsnJrnlStamped(vol); | |
79 | } | |
80 | ntfs_debug("Done."); | |
c49c3111 | 81 | return true; |
3f2faef0 AA |
82 | } |
83 | ||
84 | #endif /* NTFS_RW */ |