Commit | Line | Data |
---|---|---|
d7e09d03 PT |
1 | /* |
2 | * GPL HEADER START | |
3 | * | |
4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 only, | |
8 | * as published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, but | |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | * General Public License version 2 for more details (a copy is included | |
14 | * in the LICENSE file that accompanied this code). | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * version 2 along with this program; If not, see | |
18 | * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf | |
19 | * | |
20 | * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
21 | * CA 95054 USA or visit www.sun.com if you need additional information or | |
22 | * have any questions. | |
23 | * | |
24 | * GPL HEADER END | |
25 | */ | |
26 | /* | |
27 | * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. | |
28 | * Use is subject to license terms. | |
29 | * | |
30 | * Copyright (c) 2011, 2012, Intel Corporation. | |
31 | */ | |
32 | /* | |
33 | * This file is part of Lustre, http://www.lustre.org/ | |
34 | * Lustre is a trademark of Sun Microsystems, Inc. | |
35 | */ | |
36 | ||
37 | #ifndef _LINUX_COMPAT25_H | |
38 | #define _LINUX_COMPAT25_H | |
39 | ||
40 | #include <linux/fs_struct.h> | |
41 | #include <linux/namei.h> | |
d7e09d03 | 42 | |
1accaadf | 43 | #include "lustre_patchless_compat.h" |
d7e09d03 PT |
44 | |
45 | # define LOCK_FS_STRUCT(fs) spin_lock(&(fs)->lock) | |
46 | # define UNLOCK_FS_STRUCT(fs) spin_unlock(&(fs)->lock) | |
47 | ||
48 | static inline void ll_set_fs_pwd(struct fs_struct *fs, struct vfsmount *mnt, | |
49 | struct dentry *dentry) | |
50 | { | |
51 | struct path path; | |
52 | struct path old_pwd; | |
53 | ||
54 | path.mnt = mnt; | |
55 | path.dentry = dentry; | |
56 | LOCK_FS_STRUCT(fs); | |
57 | old_pwd = fs->pwd; | |
58 | path_get(&path); | |
59 | fs->pwd = path; | |
60 | UNLOCK_FS_STRUCT(fs); | |
61 | ||
62 | if (old_pwd.dentry) | |
63 | path_put(&old_pwd); | |
64 | } | |
65 | ||
66 | ||
67 | /* | |
68 | * set ATTR_BLOCKS to a high value to avoid any risk of collision with other | |
69 | * ATTR_* attributes (see bug 13828) | |
70 | */ | |
71 | #define ATTR_BLOCKS (1 << 27) | |
72 | ||
73 | #define current_ngroups current_cred()->group_info->ngroups | |
74 | #define current_groups current_cred()->group_info->small_block | |
75 | ||
76 | /* | |
77 | * OBD need working random driver, thus all our | |
78 | * initialization routines must be called after device | |
79 | * driver initialization | |
80 | */ | |
81 | #ifndef MODULE | |
82 | #undef module_init | |
83 | #define module_init(a) late_initcall(a) | |
84 | #endif | |
85 | ||
86 | ||
87 | #define LTIME_S(time) (time.tv_sec) | |
88 | ||
d7e09d03 PT |
89 | /* inode_dio_wait(i) use as-is for write lock */ |
90 | # define inode_dio_write_done(i) do {} while (0) /* for write unlock */ | |
91 | # define inode_dio_read(i) atomic_inc(&(i)->i_dio_count) | |
92 | /* inode_dio_done(i) use as-is for read unlock */ | |
93 | ||
94 | #define TREE_READ_LOCK_IRQ(mapping) spin_lock_irq(&(mapping)->tree_lock) | |
95 | #define TREE_READ_UNLOCK_IRQ(mapping) spin_unlock_irq(&(mapping)->tree_lock) | |
96 | ||
d7e09d03 PT |
97 | #ifndef FS_HAS_FIEMAP |
98 | #define FS_HAS_FIEMAP (0) | |
99 | #endif | |
100 | ||
1d8cb70c GD |
101 | #define ll_vfs_rmdir(dir, entry, mnt) vfs_rmdir(dir, entry) |
102 | #define ll_vfs_mkdir(inode, dir, mnt, mode) vfs_mkdir(inode, dir, mode) | |
103 | #define ll_vfs_link(old, mnt, dir, new, mnt1) vfs_link(old, dir, new) | |
104 | #define ll_vfs_unlink(inode, entry, mnt) vfs_unlink(inode, entry) | |
105 | #define ll_vfs_mknod(dir, entry, mnt, mode, dev) \ | |
106 | vfs_mknod(dir, entry, mode, dev) | |
107 | #define ll_security_inode_unlink(dir, entry, mnt) \ | |
108 | security_inode_unlink(dir, entry) | |
520c8b16 MS |
109 | #define ll_vfs_rename(old, old_dir, mnt, new, new_dir, mnt1) \ |
110 | vfs_rename(old, old_dir, new, new_dir, NULL, 0) | |
d7e09d03 | 111 | |
1d8cb70c GD |
112 | #define cfs_bio_io_error(a, b) bio_io_error((a)) |
113 | #define cfs_bio_endio(a, b, c) bio_endio((a), (c)) | |
d7e09d03 PT |
114 | |
115 | #define cfs_fs_pwd(fs) ((fs)->pwd.dentry) | |
116 | #define cfs_fs_mnt(fs) ((fs)->pwd.mnt) | |
117 | #define cfs_path_put(nd) path_put(&(nd)->path) | |
118 | ||
119 | ||
120 | #ifndef SLAB_DESTROY_BY_RCU | |
121 | #define SLAB_DESTROY_BY_RCU 0 | |
122 | #endif | |
123 | ||
124 | ||
125 | ||
126 | static inline int | |
127 | ll_quota_on(struct super_block *sb, int off, int ver, char *name, int remount) | |
128 | { | |
129 | int rc; | |
130 | ||
131 | if (sb->s_qcop->quota_on) { | |
132 | struct path path; | |
133 | ||
134 | rc = kern_path(name, LOOKUP_FOLLOW, &path); | |
135 | if (!rc) | |
136 | return rc; | |
137 | rc = sb->s_qcop->quota_on(sb, off, ver | |
138 | , &path | |
139 | ); | |
140 | path_put(&path); | |
141 | return rc; | |
142 | } | |
143 | else | |
144 | return -ENOSYS; | |
145 | } | |
146 | ||
147 | static inline int ll_quota_off(struct super_block *sb, int off, int remount) | |
148 | { | |
149 | if (sb->s_qcop->quota_off) { | |
150 | return sb->s_qcop->quota_off(sb, off | |
151 | ); | |
152 | } | |
153 | else | |
154 | return -ENOSYS; | |
155 | } | |
156 | ||
157 | ||
158 | # define ll_vfs_dq_init dquot_initialize | |
159 | # define ll_vfs_dq_drop dquot_drop | |
160 | # define ll_vfs_dq_transfer dquot_transfer | |
161 | # define ll_vfs_dq_off(sb, remount) dquot_suspend(sb, -1) | |
162 | ||
163 | ||
164 | ||
165 | ||
166 | ||
167 | #define queue_max_phys_segments(rq) queue_max_segments(rq) | |
168 | #define queue_max_hw_segments(rq) queue_max_segments(rq) | |
169 | ||
d7e09d03 PT |
170 | |
171 | #define ll_d_hlist_node hlist_node | |
172 | #define ll_d_hlist_empty(list) hlist_empty(list) | |
173 | #define ll_d_hlist_entry(ptr, type, name) hlist_entry(ptr.first, type, name) | |
174 | #define ll_d_hlist_for_each(tmp, i_dentry) hlist_for_each(tmp, i_dentry) | |
175 | #define ll_d_hlist_for_each_entry(dentry, p, i_dentry, alias) \ | |
176 | p = NULL; hlist_for_each_entry(dentry, i_dentry, alias) | |
177 | ||
178 | ||
179 | #define bio_hw_segments(q, bio) 0 | |
180 | ||
181 | ||
182 | #define ll_pagevec_init(pv, cold) do {} while (0) | |
183 | #define ll_pagevec_add(pv, pg) (0) | |
184 | #define ll_pagevec_lru_add_file(pv) do {} while (0) | |
185 | ||
186 | ||
187 | #ifndef QUOTA_OK | |
188 | # define QUOTA_OK 0 | |
189 | #endif | |
190 | #ifndef NO_QUOTA | |
191 | # define NO_QUOTA (-EDQUOT) | |
192 | #endif | |
193 | ||
194 | #ifndef SEEK_DATA | |
195 | #define SEEK_DATA 3 /* seek to the next data */ | |
196 | #endif | |
197 | #ifndef SEEK_HOLE | |
198 | #define SEEK_HOLE 4 /* seek to the next hole */ | |
199 | #endif | |
200 | ||
201 | #ifndef FMODE_UNSIGNED_OFFSET | |
202 | #define FMODE_UNSIGNED_OFFSET ((__force fmode_t)0x2000) | |
203 | #endif | |
204 | ||
205 | #if !defined(_ASM_GENERIC_BITOPS_EXT2_NON_ATOMIC_H_) && !defined(ext2_set_bit) | |
206 | # define ext2_set_bit __test_and_set_bit_le | |
207 | # define ext2_clear_bit __test_and_clear_bit_le | |
208 | # define ext2_test_bit test_bit_le | |
209 | # define ext2_find_first_zero_bit find_first_zero_bit_le | |
210 | # define ext2_find_next_zero_bit find_next_zero_bit_le | |
211 | #endif | |
212 | ||
213 | #ifdef ATTR_TIMES_SET | |
214 | # define TIMES_SET_FLAGS (ATTR_MTIME_SET | ATTR_ATIME_SET | ATTR_TIMES_SET) | |
215 | #else | |
216 | # define TIMES_SET_FLAGS (ATTR_MTIME_SET | ATTR_ATIME_SET) | |
217 | #endif | |
218 | ||
219 | ||
220 | ||
221 | /* | |
222 | * After 3.1, kernel's nameidata.intent.open.flags is different | |
223 | * with lustre's lookup_intent.it_flags, as lustre's it_flags' | |
224 | * lower bits equal to FMODE_xxx while kernel doesn't transliterate | |
225 | * lower bits of nameidata.intent.open.flags to FMODE_xxx. | |
226 | * */ | |
227 | #include <linux/version.h> | |
228 | static inline int ll_namei_to_lookup_intent_flag(int flag) | |
229 | { | |
230 | #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) | |
231 | flag = (flag & ~O_ACCMODE) | OPEN_FMODE(flag); | |
232 | #endif | |
233 | return flag; | |
234 | } | |
235 | ||
d7e09d03 PT |
236 | #include <linux/fs.h> |
237 | ||
238 | # define ll_umode_t umode_t | |
239 | ||
240 | #include <linux/dcache.h> | |
241 | ||
242 | # define ll_dirty_inode(inode, flag) (inode)->i_sb->s_op->dirty_inode((inode), flag) | |
243 | ||
244 | #endif /* _COMPAT25_H */ |