#include <linux/bio.h>
#include <linux/xattr.h>
#include <linux/workqueue.h>
+#include <linux/blkdev.h>
#include <libcfs/linux/linux-fs.h>
#include <lustre_patchless_compat.h>
path_put(&old_pwd);
}
-/*
- * set ATTR_BLOCKS to a high value to avoid any risk of collision with other
- * ATTR_* attributes (see bug 13828)
- */
-#define ATTR_BLOCKS (1 << 27)
-
#define current_ngroups current_cred()->group_info->ngroups
#define current_groups current_cred()->group_info->small_block
#define MODULE_ALIAS_FS(name)
#endif
-#define LTIME_S(time) (time.tv_sec)
-
#ifdef HAVE_GENERIC_PERMISSION_2ARGS
# define ll_generic_permission(inode, mask, flags, check_acl) \
generic_permission(inode, mask)
#define simple_setattr(dentry, ops) inode_setattr((dentry)->d_inode, ops)
#endif
-#ifndef SLAB_DESTROY_BY_RCU
-#define SLAB_DESTROY_BY_RCU 0
+#ifndef HAVE_INIT_LIST_HEAD_RCU
+static inline void INIT_LIST_HEAD_RCU(struct list_head *list)
+{
+ WRITE_ONCE(list->next, list);
+ WRITE_ONCE(list->prev, list);
+}
#endif
#ifndef HAVE_DQUOT_SUSPEND
#define bvl_to_page(bvl) (bvl->bv_page)
#endif
+#ifdef HAVE_BVEC_ITER
+#define bio_start_sector(bio) (bio->bi_iter.bi_sector)
+#else
+#define bio_start_sector(bio) (bio->bi_sector)
+#endif
+
#ifndef HAVE_BLK_QUEUE_MAX_SEGMENTS
#define blk_queue_max_segments(rq, seg) \
do { blk_queue_max_phys_segments(rq, seg); \
#define DECLARE_LL_D_HLIST_NODE_PTR(name) /* nothing */
#endif /* !DATA_FOR_LLITE_IS_LIST */
+#ifndef HAVE_D_IN_LOOKUP
+static inline int d_in_lookup(struct dentry *dentry)
+{
+ return false;
+}
+#endif
+
#ifndef QUOTA_OK
# define QUOTA_OK 0
#endif
static inline void truncate_inode_pages_final(struct address_space *map)
{
truncate_inode_pages(map, 0);
- /* Workaround for LU-118 */
- if (map->nrpages) {
- spin_lock_irq(&map->tree_lock);
- spin_unlock_irq(&map->tree_lock);
- } /* Workaround end */
}
#endif
#define alloc_workqueue(name, flags, max_active) create_workqueue(name)
#endif
+#ifndef smp_store_mb
+#define smp_store_mb(var, value) set_mb(var, value)
+#endif
+
#ifndef READ_ONCE
#define READ_ONCE ACCESS_ONCE
#endif
+#if IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY)
+static inline unsigned short blk_integrity_interval(struct blk_integrity *bi)
+{
+#ifdef HAVE_INTERVAL_EXP_BLK_INTEGRITY
+ return bi->interval_exp ? 1 << bi->interval_exp : 0;
+#elif defined(HAVE_INTERVAL_BLK_INTEGRITY)
+ return bi->interval;
+#else
+ return bi->sector_size;
+#endif /* !HAVE_INTERVAL_EXP_BLK_INTEGRITY */
+}
+
+static inline const char *blk_integrity_name(struct blk_integrity *bi)
+{
+#ifdef HAVE_INTERVAL_EXP_BLK_INTEGRITY
+ return bi->profile->name;
+#else
+ return bi->name;
+#endif
+}
+
+static inline unsigned int bip_size(struct bio_integrity_payload *bip)
+{
+#ifdef HAVE_BIP_ITER_BIO_INTEGRITY_PAYLOAD
+ return bip->bip_iter.bi_size;
+#else
+ return bip->bip_size;
+#endif
+}
+#else /* !CONFIG_BLK_DEV_INTEGRITY */
+static inline unsigned short blk_integrity_interval(struct blk_integrity *bi)
+{
+ return 0;
+}
+static inline const char *blk_integrity_name(struct blk_integrity *bi)
+{
+ /* gcc8 dislikes when strcmp() is called against NULL */
+ return "";
+}
+#endif /* !CONFIG_BLK_DEV_INTEGRITY */
+
+#ifndef INTEGRITY_FLAG_READ
+#define INTEGRITY_FLAG_READ BLK_INTEGRITY_VERIFY
+#endif
+
+#ifndef INTEGRITY_FLAG_WRITE
+#define INTEGRITY_FLAG_WRITE BLK_INTEGRITY_GENERATE
+#endif
+
+static inline bool bdev_integrity_enabled(struct block_device *bdev, int rw)
+{
+#if IS_ENABLED(CONFIG_BLK_DEV_INTEGRITY)
+ struct blk_integrity *bi = bdev_get_integrity(bdev);
+
+ if (bi == NULL)
+ return false;
+
+#ifdef HAVE_INTERVAL_EXP_BLK_INTEGRITY
+ if (rw == 0 && bi->profile->verify_fn != NULL &&
+ (bi->flags & INTEGRITY_FLAG_READ))
+ return true;
+
+ if (rw == 1 && bi->profile->generate_fn != NULL &&
+ (bi->flags & INTEGRITY_FLAG_WRITE))
+ return true;
+#else
+ if (rw == 0 && bi->verify_fn != NULL &&
+ (bi->flags & INTEGRITY_FLAG_READ))
+ return true;
+
+ if (rw == 1 && bi->generate_fn != NULL &&
+ (bi->flags & INTEGRITY_FLAG_WRITE))
+ return true;
+#endif /* !HAVE_INTERVAL_EXP_BLK_INTEGRITY */
+#endif /* !CONFIG_BLK_DEV_INTEGRITY */
+
+ return false;
+}
+
+#ifdef HAVE_PAGEVEC_INIT_ONE_PARAM
+#define ll_pagevec_init(pvec, n) pagevec_init(pvec)
+#else
+#define ll_pagevec_init(pvec, n) pagevec_init(pvec, n)
+#endif
+
+#ifdef HAVE_I_PAGES
+#define page_tree i_pages
+#else
+#define i_pages tree_lock
+#define xa_lock_irq(lockp) spin_lock_irq(lockp)
+#define xa_unlock_irq(lockp) spin_unlock_irq(lockp)
+#endif
+
#endif /* _LUSTRE_COMPAT_H */