Whamcloud - gitweb
LU-15220 llite: Compat for set_pagevec_dirty
[fs/lustre-release.git] / lustre / include / lustre_compat.h
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.gnu.org/licenses/gpl-2.0.html
19  *
20  * GPL HEADER END
21  */
22 /*
23  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
24  * Use is subject to license terms.
25  *
26  * Copyright (c) 2011, 2017, Intel Corporation.
27  */
28 /*
29  * This file is part of Lustre, http://www.lustre.org/
30  */
31
32 #ifndef _LUSTRE_COMPAT_H
33 #define _LUSTRE_COMPAT_H
34
35 #include <linux/aio.h>
36 #include <linux/fs.h>
37 #include <linux/namei.h>
38 #include <linux/pagemap.h>
39 #include <linux/posix_acl_xattr.h>
40 #include <linux/bio.h>
41 #include <linux/xattr.h>
42 #include <linux/workqueue.h>
43 #include <linux/blkdev.h>
44 #include <linux/slab.h>
45 #include <linux/security.h>
46
47 #include <libcfs/linux/linux-fs.h>
48 #include <obd_support.h>
49
50 #ifdef HAVE_4ARGS_VFS_SYMLINK
51 #define ll_vfs_symlink(dir, dentry, mnt, path, mode) \
52                 vfs_symlink(dir, dentry, path, mode)
53 #else
54 #define ll_vfs_symlink(dir, dentry, mnt, path, mode) \
55                        vfs_symlink(dir, dentry, path)
56 #endif
57
58 #ifdef HAVE_BVEC_ITER
59 #define bio_idx(bio)                    (bio->bi_iter.bi_idx)
60 #define bio_set_sector(bio, sector)     (bio->bi_iter.bi_sector = sector)
61 #define bvl_to_page(bvl)                (bvl->bv_page)
62 #else
63 #define bio_idx(bio)                    (bio->bi_idx)
64 #define bio_set_sector(bio, sector)     (bio->bi_sector = sector)
65 #define bio_sectors(bio)                ((bio)->bi_size >> 9)
66 #define bvl_to_page(bvl)                (bvl->bv_page)
67 #endif
68
69 #ifdef HAVE_BVEC_ITER
70 #define bio_start_sector(bio) (bio->bi_iter.bi_sector)
71 #else
72 #define bio_start_sector(bio) (bio->bi_sector)
73 #endif
74
75 #ifndef HAVE_DENTRY_D_CHILD
76 #define d_child                 d_u.d_child
77 #endif
78
79 #ifdef HAVE_DENTRY_D_U_D_ALIAS
80 #define d_alias                 d_u.d_alias
81 #endif
82
83 #ifndef HAVE_D_IN_LOOKUP
84 static inline int d_in_lookup(struct dentry *dentry)
85 {
86         return false;
87 }
88 #endif
89
90 #ifndef HAVE_VM_FAULT_T
91 #define vm_fault_t int
92 #endif
93
94 #ifndef HAVE_FOP_ITERATE_SHARED
95 #define iterate_shared iterate
96 #endif
97
98 #ifdef HAVE_OLDSIZE_TRUNCATE_PAGECACHE
99 #define ll_truncate_pagecache(inode, size) truncate_pagecache(inode, 0, size)
100 #else
101 #define ll_truncate_pagecache(inode, size) truncate_pagecache(inode, size)
102 #endif
103
104 #ifdef HAVE_VFS_RENAME_5ARGS
105 #define ll_vfs_rename(a, b, c, d) vfs_rename(a, b, c, d, NULL)
106 #elif defined HAVE_VFS_RENAME_6ARGS
107 #define ll_vfs_rename(a, b, c, d) vfs_rename(a, b, c, d, NULL, 0)
108 #else
109 #define ll_vfs_rename(a, b, c, d) vfs_rename(a, b, c, d)
110 #endif
111
112 #ifdef HAVE_VFS_UNLINK_3ARGS
113 #define ll_vfs_unlink(a, b) vfs_unlink(a, b, NULL)
114 #else
115 #define ll_vfs_unlink(a, b) vfs_unlink(a, b)
116 #endif
117
118 static inline int ll_vfs_getattr(struct path *path, struct kstat *st,
119                                  u32 request_mask, unsigned int flags)
120 {
121         int rc;
122
123 #ifdef HAVE_INODEOPS_ENHANCED_GETATTR
124         rc = vfs_getattr(path, st, request_mask, flags);
125 #else
126         rc = vfs_getattr(path, st);
127 #endif
128         return rc;
129 }
130
131 #ifndef HAVE_D_IS_POSITIVE
132 static inline bool d_is_positive(const struct dentry *dentry)
133 {
134         return dentry->d_inode != NULL;
135 }
136 #endif
137
138 #ifndef HAVE_INODE_LOCK
139 # define inode_lock(inode) mutex_lock(&(inode)->i_mutex)
140 # define inode_unlock(inode) mutex_unlock(&(inode)->i_mutex)
141 # define inode_trylock(inode) mutex_trylock(&(inode)->i_mutex)
142 #endif
143
144 /* Old kernels lacked both Xarray support and the page cache
145  * using Xarrays. Our back ported Xarray support introduces
146  * the real xa_is_value() but we need a wrapper as well for
147  * the page cache interaction. Lets keep xa_is_value() separate
148  * in old kernels for Xarray support and page cache handling.
149  */
150 #ifndef HAVE_XARRAY_SUPPORT
151 static inline bool ll_xa_is_value(void *entry)
152 {
153         return radix_tree_exceptional_entry(entry);
154 }
155 #else
156 #define ll_xa_is_value  xa_is_value
157 #endif
158
159 #ifndef HAVE_TRUNCATE_INODE_PAGES_FINAL
160 static inline void truncate_inode_pages_final(struct address_space *map)
161 {
162         truncate_inode_pages(map, 0);
163 }
164 #endif
165
166 #ifndef HAVE_PTR_ERR_OR_ZERO
167 static inline int __must_check PTR_ERR_OR_ZERO(__force const void *ptr)
168 {
169         if (IS_ERR(ptr))
170                 return PTR_ERR(ptr);
171         else
172                 return 0;
173 }
174 #endif
175
176 #ifdef HAVE_PID_NS_FOR_CHILDREN
177 # define ll_task_pid_ns(task) \
178          ((task)->nsproxy ? ((task)->nsproxy->pid_ns_for_children) : NULL)
179 #else
180 # define ll_task_pid_ns(task) \
181          ((task)->nsproxy ? ((task)->nsproxy->pid_ns) : NULL)
182 #endif
183
184 #ifdef HAVE_FULL_NAME_HASH_3ARGS
185 # define ll_full_name_hash(salt, name, len) full_name_hash(salt, name, len)
186 #else
187 # define ll_full_name_hash(salt, name, len) full_name_hash(name, len)
188 #endif
189
190 #ifdef HAVE_STRUCT_POSIX_ACL_XATTR
191 # define posix_acl_xattr_header struct posix_acl_xattr_header
192 # define posix_acl_xattr_entry  struct posix_acl_xattr_entry
193 # define GET_POSIX_ACL_XATTR_ENTRY(head) ((void *)((head) + 1))
194 #else
195 # define GET_POSIX_ACL_XATTR_ENTRY(head) ((head)->a_entries)
196 #endif
197
198 #ifdef HAVE_IOP_XATTR
199 #define ll_setxattr     generic_setxattr
200 #define ll_getxattr     generic_getxattr
201 #define ll_removexattr  generic_removexattr
202 #endif /* HAVE_IOP_XATTR */
203
204 #ifndef HAVE_POSIX_ACL_VALID_USER_NS
205 #define posix_acl_valid(a,b)            posix_acl_valid(b)
206 #endif
207
208 #ifdef HAVE_IOP_SET_ACL
209 #ifdef CONFIG_LUSTRE_FS_POSIX_ACL
210 #ifndef HAVE_POSIX_ACL_UPDATE_MODE
211 static inline int posix_acl_update_mode(struct inode *inode, umode_t *mode_p,
212                           struct posix_acl **acl)
213 {
214         umode_t mode = inode->i_mode;
215         int error;
216
217         error = posix_acl_equiv_mode(*acl, &mode);
218         if (error < 0)
219                 return error;
220         if (error == 0)
221                 *acl = NULL;
222         if (!in_group_p(inode->i_gid) &&
223             !capable_wrt_inode_uidgid(inode, CAP_FSETID))
224                 mode &= ~S_ISGID;
225         *mode_p = mode;
226         return 0;
227 }
228 #endif /* HAVE_POSIX_ACL_UPDATE_MODE */
229 #endif
230 #endif
231
232 #ifndef HAVE_IOV_ITER_TRUNCATE
233 static inline void iov_iter_truncate(struct iov_iter *i, u64 count)
234 {
235         if (i->count > count)
236                 i->count = count;
237 }
238 #endif
239
240 /*
241  * mount MS_* flags split from superblock SB_* flags
242  * if the SB_* flags are not available use the MS_* flags
243  */
244 #if !defined(SB_RDONLY) && defined(MS_RDONLY)
245 # define SB_RDONLY MS_RDONLY
246 #endif
247 #if !defined(SB_ACTIVE) && defined(MS_ACTIVE)
248 # define SB_ACTIVE MS_ACTIVE
249 #endif
250 #if !defined(SB_NOSEC) && defined(MS_NOSEC)
251 # define SB_NOSEC MS_NOSEC
252 #endif
253 #if !defined(SB_POSIXACL) && defined(MS_POSIXACL)
254 # define SB_POSIXACL MS_POSIXACL
255 #endif
256 #if !defined(SB_NODIRATIME) && defined(MS_NODIRATIME)
257 # define SB_NODIRATIME MS_NODIRATIME
258 #endif
259
260 #ifndef HAVE_FILE_OPERATIONS_READ_WRITE_ITER
261 static inline void iov_iter_reexpand(struct iov_iter *i, size_t count)
262 {
263         i->count = count;
264 }
265
266 static inline struct iovec iov_iter_iovec(const struct iov_iter *iter)
267 {
268         return (struct iovec) {
269                 .iov_base = iter->iov->iov_base + iter->iov_offset,
270                 .iov_len = min(iter->count,
271                                iter->iov->iov_len - iter->iov_offset),
272         };
273 }
274
275 #define iov_for_each(iov, iter, start)                                  \
276         for (iter = (start);                                            \
277              (iter).count && ((iov = iov_iter_iovec(&(iter))), 1);      \
278              iov_iter_advance(&(iter), (iov).iov_len))
279
280 static inline ssize_t
281 generic_file_read_iter(struct kiocb *iocb, struct iov_iter *iter)
282 {
283         struct iovec iov;
284         struct iov_iter i;
285         ssize_t bytes = 0;
286
287         iov_for_each(iov, i, *iter) {
288                 ssize_t res;
289
290                 res = generic_file_aio_read(iocb, &iov, 1, iocb->ki_pos);
291                 if (res <= 0) {
292                         if (bytes == 0)
293                                 bytes = res;
294                         break;
295                 }
296
297                 bytes += res;
298                 if (res < iov.iov_len)
299                         break;
300         }
301
302         if (bytes > 0)
303                 iov_iter_advance(iter, bytes);
304         return bytes;
305 }
306
307 static inline ssize_t
308 __generic_file_write_iter(struct kiocb *iocb, struct iov_iter *iter)
309 {
310         struct iovec iov;
311         struct iov_iter i;
312         ssize_t bytes = 0;
313
314         /* Since LLITE updates file size at the end of I/O in
315          * vvp_io_commit_write(), append write has to be done in atomic when
316          * there are multiple segments because otherwise each iteration to
317          * __generic_file_aio_write() will see original file size */
318         if (unlikely(iocb->ki_filp->f_flags & O_APPEND && iter->nr_segs > 1)) {
319                 struct iovec *iov_copy;
320                 int count = 0;
321
322                 OBD_ALLOC_PTR_ARRAY(iov_copy, iter->nr_segs);
323                 if (!iov_copy)
324                         return -ENOMEM;
325
326                 iov_for_each(iov, i, *iter)
327                         iov_copy[count++] = iov;
328
329                 bytes = __generic_file_aio_write(iocb, iov_copy, count,
330                                                  &iocb->ki_pos);
331                 OBD_FREE_PTR_ARRAY(iov_copy, iter->nr_segs);
332
333                 if (bytes > 0)
334                         iov_iter_advance(iter, bytes);
335                 return bytes;
336         }
337
338         iov_for_each(iov, i, *iter) {
339                 ssize_t res;
340
341                 res = __generic_file_aio_write(iocb, &iov, 1, &iocb->ki_pos);
342                 if (res <= 0) {
343                         if (bytes == 0)
344                                 bytes = res;
345                         break;
346                 }
347
348                 bytes += res;
349                 if (res < iov.iov_len)
350                         break;
351         }
352
353         if (bytes > 0)
354                 iov_iter_advance(iter, bytes);
355         return bytes;
356 }
357 #endif /* HAVE_FILE_OPERATIONS_READ_WRITE_ITER */
358
359 static inline void __user *get_vmf_address(struct vm_fault *vmf)
360 {
361 #ifdef HAVE_VM_FAULT_ADDRESS
362         return (void __user *)vmf->address;
363 #else
364         return vmf->virtual_address;
365 #endif
366 }
367
368 #ifdef HAVE_VM_OPS_USE_VM_FAULT_ONLY
369 # define ll_filemap_fault(vma, vmf) filemap_fault(vmf)
370 #else
371 # define ll_filemap_fault(vma, vmf) filemap_fault(vma, vmf)
372 #endif
373
374 #ifndef HAVE_CURRENT_TIME
375 static inline struct timespec current_time(struct inode *inode)
376 {
377         return CURRENT_TIME;
378 }
379 #endif
380
381 #ifndef time_after32
382 /**
383  * time_after32 - compare two 32-bit relative times
384  * @a: the time which may be after @b
385  * @b: the time which may be before @a
386  *
387  * Needed for kernels earlier than v4.14-rc1~134^2
388  *
389  * time_after32(a, b) returns true if the time @a is after time @b.
390  * time_before32(b, a) returns true if the time @b is before time @a.
391  *
392  * Similar to time_after(), compare two 32-bit timestamps for relative
393  * times.  This is useful for comparing 32-bit seconds values that can't
394  * be converted to 64-bit values (e.g. due to disk format or wire protocol
395  * issues) when it is known that the times are less than 68 years apart.
396  */
397 #define time_after32(a, b)     ((s32)((u32)(b) - (u32)(a)) < 0)
398 #define time_before32(b, a)    time_after32(a, b)
399
400 #endif
401
402 #ifndef smp_store_mb
403 #define smp_store_mb(var, value)        set_mb(var, value)
404 #endif
405
406 #if IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY)
407 static inline unsigned short blk_integrity_interval(struct blk_integrity *bi)
408 {
409 #ifdef HAVE_INTERVAL_EXP_BLK_INTEGRITY
410         return bi->interval_exp ? 1 << bi->interval_exp : 0;
411 #elif defined(HAVE_INTERVAL_BLK_INTEGRITY)
412         return bi->interval;
413 #else
414         return bi->sector_size;
415 #endif /* !HAVE_INTERVAL_EXP_BLK_INTEGRITY */
416 }
417
418 static inline const char *blk_integrity_name(struct blk_integrity *bi)
419 {
420 #ifdef HAVE_INTERVAL_EXP_BLK_INTEGRITY
421         return bi->profile->name;
422 #else
423         return bi->name;
424 #endif
425 }
426
427 static inline unsigned int bip_size(struct bio_integrity_payload *bip)
428 {
429 #ifdef HAVE_BIP_ITER_BIO_INTEGRITY_PAYLOAD
430         return bip->bip_iter.bi_size;
431 #else
432         return bip->bip_size;
433 #endif
434 }
435 #else /* !CONFIG_BLK_DEV_INTEGRITY */
436 static inline unsigned short blk_integrity_interval(struct blk_integrity *bi)
437 {
438         return 0;
439 }
440 static inline const char *blk_integrity_name(struct blk_integrity *bi)
441 {
442         /* gcc8 dislikes when strcmp() is called against NULL */
443         return "";
444 }
445 #endif /* !CONFIG_BLK_DEV_INTEGRITY */
446
447 #ifndef INTEGRITY_FLAG_READ
448 #define INTEGRITY_FLAG_READ BLK_INTEGRITY_VERIFY
449 #endif
450
451 #ifndef INTEGRITY_FLAG_WRITE
452 #define INTEGRITY_FLAG_WRITE BLK_INTEGRITY_GENERATE
453 #endif
454
455 static inline bool bdev_integrity_enabled(struct block_device *bdev, int rw)
456 {
457 #if IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY)
458         struct blk_integrity *bi = bdev_get_integrity(bdev);
459
460         if (bi == NULL)
461                 return false;
462
463 #ifdef HAVE_INTERVAL_EXP_BLK_INTEGRITY
464         if (rw == 0 && bi->profile->verify_fn != NULL &&
465             (bi->flags & INTEGRITY_FLAG_READ))
466                 return true;
467
468         if (rw == 1 && bi->profile->generate_fn != NULL &&
469             (bi->flags & INTEGRITY_FLAG_WRITE))
470                 return true;
471 #else
472         if (rw == 0 && bi->verify_fn != NULL &&
473             (bi->flags & INTEGRITY_FLAG_READ))
474                 return true;
475
476         if (rw == 1 && bi->generate_fn != NULL &&
477             (bi->flags & INTEGRITY_FLAG_WRITE))
478                 return true;
479 #endif /* !HAVE_INTERVAL_EXP_BLK_INTEGRITY */
480 #endif /* !CONFIG_BLK_DEV_INTEGRITY */
481
482         return false;
483 }
484
485 #ifdef HAVE_PAGEVEC_INIT_ONE_PARAM
486 #define ll_pagevec_init(pvec, n) pagevec_init(pvec)
487 #else
488 #define ll_pagevec_init(pvec, n) pagevec_init(pvec, n)
489 #endif
490
491 #ifdef HAVE_D_COUNT
492 #  define ll_d_count(d)         d_count(d)
493 #else
494 #  define ll_d_count(d)         ((d)->d_count)
495 #endif /* HAVE_D_COUNT */
496
497 #ifndef HAVE_IN_COMPAT_SYSCALL
498 #define in_compat_syscall       is_compat_task
499 #endif
500
501 #ifdef HAVE_I_PAGES
502 #define page_tree i_pages
503 #define ll_xa_lock_irqsave(lockp, flags) xa_lock_irqsave(lockp, flags)
504 #define ll_xa_unlock_irqrestore(lockp, flags) xa_unlock_irqrestore(lockp, flags)
505 #else
506 #define i_pages tree_lock
507 #define ll_xa_lock_irqsave(lockp, flags) spin_lock_irqsave(lockp, flags)
508 #define ll_xa_unlock_irqrestore(lockp, flags) spin_unlock_irqrestore(lockp, flags)
509 #endif
510
511 #ifndef HAVE_LOCK_PAGE_MEMCG
512 #define lock_page_memcg(page) do {} while (0)
513 #define unlock_page_memcg(page) do {} while (0)
514 #endif
515
516 #ifndef KMEM_CACHE_USERCOPY
517 #define kmem_cache_create_usercopy(name, size, align, flags, useroffset, \
518                                    usersize, ctor)                       \
519         kmem_cache_create(name, size, align, flags, ctor)
520 #endif
521
522 #ifndef HAVE_LINUX_SELINUX_IS_ENABLED
523 #define selinux_is_enabled() 1
524 #endif
525
526 static inline int ll_vfs_getxattr(struct dentry *dentry, struct inode *inode,
527                                   const char *name,
528                                   void *value, size_t size)
529 {
530 #ifndef HAVE_VFS_SETXATTR
531         if (unlikely(!inode->i_op->getxattr))
532                 return -ENODATA;
533
534         return inode->i_op->getxattr(dentry, name, value, size);
535 #else
536         return __vfs_getxattr(dentry, inode, name, value, size);
537 #endif
538 }
539
540 static inline int ll_vfs_setxattr(struct dentry *dentry, struct inode *inode,
541                                   const char *name,
542                                   const void *value, size_t size, int flags)
543 {
544 #ifndef HAVE_VFS_SETXATTR
545         if (unlikely(!inode->i_op->setxattr))
546                 return -EOPNOTSUPP;
547
548         return inode->i_op->setxattr(dentry, name, value, size, flags);
549 #else
550         return __vfs_setxattr(dentry, inode, name, value, size, flags);
551 #endif
552 }
553
554 static inline int ll_vfs_removexattr(struct dentry *dentry, struct inode *inode,
555                                      const char *name)
556 {
557 #ifndef HAVE_VFS_SETXATTR
558         if (unlikely(!inode->i_op->setxattr))
559                 return -EOPNOTSUPP;
560
561         return inode->i_op->removexattr(dentry, name);
562 #else
563         return __vfs_removexattr(dentry, name);
564 #endif
565 }
566
567 #ifndef FALLOC_FL_COLLAPSE_RANGE
568 #define FALLOC_FL_COLLAPSE_RANGE 0x08 /* remove a range of a file */
569 #endif
570
571 #ifndef FALLOC_FL_ZERO_RANGE
572 #define FALLOC_FL_ZERO_RANGE 0x10 /* convert range to zeros */
573 #endif
574
575 #ifndef FALLOC_FL_INSERT_RANGE
576 #define FALLOC_FL_INSERT_RANGE 0x20 /* insert space within file */
577 #endif
578
579 #ifndef raw_cpu_ptr
580 #define raw_cpu_ptr(p) __this_cpu_ptr(p)
581 #endif
582
583 #ifndef HAVE_IS_ROOT_INODE
584 static inline bool is_root_inode(struct inode *inode)
585 {
586         return inode == inode->i_sb->s_root->d_inode;
587 }
588 #endif
589
590 #ifndef HAVE_REGISTER_SHRINKER_RET
591 #define register_shrinker(_s) (register_shrinker(_s), 0)
592 #endif
593
594 static inline void ll_security_release_secctx(char *secdata, u32 seclen)
595 {
596 #ifdef HAVE_SEC_RELEASE_SECCTX_1ARG
597         struct lsmcontext context = { };
598
599         lsmcontext_init(&context, secdata, seclen, 0);
600         return security_release_secctx(&context);
601 #else
602         return security_release_secctx(secdata, seclen);
603 #endif
604 }
605
606 #endif /* _LUSTRE_COMPAT_H */