diff options
Diffstat (limited to 'fs/ntfs/usnjrnl.c')
-rw-r--r-- | fs/ntfs/usnjrnl.c | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/fs/ntfs/usnjrnl.c b/fs/ntfs/usnjrnl.c new file mode 100644 index 000000000000..77773240d139 --- /dev/null +++ b/fs/ntfs/usnjrnl.c | |||
@@ -0,0 +1,84 @@ | |||
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 | ||
42 | * TRUE on success and FALSE on error. | ||
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 | */ | ||
47 | BOOL ntfs_stamp_usnjrnl(ntfs_volume *vol) | ||
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."); | ||
59 | return FALSE; | ||
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."); | ||
81 | return TRUE; | ||
82 | } | ||
83 | |||
84 | #endif /* NTFS_RW */ | ||