1 | /* |
2 | * linux/fs/hfs/sysdep.c |
3 | * |
4 | * Copyright (C) 1996 Paul H. Hargrove |
5 | * (C) 2003 Ardis Technologies <roman@ardistech.com> |
6 | * This file may be distributed under the terms of the GNU General Public License. |
7 | * |
8 | * This file contains the code to do various system dependent things. |
9 | */ |
10 | |
11 | #include <linux/namei.h> |
12 | #include "hfs_fs.h" |
13 | |
14 | /* dentry case-handling: just lowercase everything */ |
15 | |
16 | static int hfs_revalidate_dentry(struct dentry *dentry, unsigned int flags) |
17 | { |
18 | struct inode *inode; |
19 | int diff; |
20 | |
21 | if (flags & LOOKUP_RCU) |
22 | return -ECHILD; |
23 | |
24 | inode = d_inode(dentry); |
25 | if(!inode) |
26 | return 1; |
27 | |
28 | /* fix up inode on a timezone change */ |
29 | diff = sys_tz.tz_minuteswest * 60 - HFS_I(inode)->tz_secondswest; |
30 | if (diff) { |
31 | struct timespec64 ts = inode_get_ctime(inode); |
32 | |
33 | inode_set_ctime(inode, sec: ts.tv_sec + diff, nsec: ts.tv_nsec); |
34 | ts = inode_get_atime(inode); |
35 | inode_set_atime(inode, sec: ts.tv_sec + diff, nsec: ts.tv_nsec); |
36 | ts = inode_get_mtime(inode); |
37 | inode_set_mtime(inode, sec: ts.tv_sec + diff, nsec: ts.tv_nsec); |
38 | HFS_I(inode)->tz_secondswest += diff; |
39 | } |
40 | return 1; |
41 | } |
42 | |
43 | const struct dentry_operations hfs_dentry_operations = |
44 | { |
45 | .d_revalidate = hfs_revalidate_dentry, |
46 | .d_hash = hfs_hash_dentry, |
47 | .d_compare = hfs_compare_dentry, |
48 | }; |
49 | |
50 | |