+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,7))
+#define ll_set_dflags(dentry, flags) do { dentry->d_vfs_flags |= flags; } while(0)
+#define ll_vfs_symlink(dir, dentry, path, mode) vfs_symlink(dir, dentry, path)
+#else
+#define ll_set_dflags(dentry, flags) do { \
+ spin_lock(&dentry->d_lock); \
+ dentry->d_flags |= flags; \
+ spin_unlock(&dentry->d_lock); \
+ } while(0)
+#ifdef HAVE_SECURITY_PLUG
+#define ll_vfs_symlink(dir, dentry, mnt, path, mode) \
+ vfs_symlink(dir, dentry, mnt, path, mode)
+#else
+#define ll_vfs_symlink(dir, dentry, mnt, path, mode) \
+ vfs_symlink(dir, dentry, path, mode)
+#endif
+#endif
+
+#ifndef container_of
+#define container_of(ptr, type, member) ({ \
+ const typeof( ((type *)0)->member ) *__mptr = (ptr); \
+ (type *)( (char *)__mptr - offsetof(type,member) );})
+#endif
+
+#ifdef HAVE_I_ALLOC_SEM
+#define UP_WRITE_I_ALLOC_SEM(i) do { up_write(&(i)->i_alloc_sem); } while (0)
+#define DOWN_WRITE_I_ALLOC_SEM(i) do { down_write(&(i)->i_alloc_sem); } while(0)
+#define LASSERT_I_ALLOC_SEM_WRITE_LOCKED(i) LASSERT(down_read_trylock(&(i)->i_alloc_sem) == 0)
+
+#define UP_READ_I_ALLOC_SEM(i) do { up_read(&(i)->i_alloc_sem); } while (0)
+#define DOWN_READ_I_ALLOC_SEM(i) do { down_read(&(i)->i_alloc_sem); } while (0)
+#define LASSERT_I_ALLOC_SEM_READ_LOCKED(i) LASSERT(down_write_trylock(&(i)->i_alloc_sem) == 0)
+#else
+#define UP_READ_I_ALLOC_SEM(i) do { } while (0)
+#define DOWN_READ_I_ALLOC_SEM(i) do { } while (0)
+#define LASSERT_I_ALLOC_SEM_READ_LOCKED(i) do { } while (0)
+
+#define UP_WRITE_I_ALLOC_SEM(i) do { } while (0)
+#define DOWN_WRITE_I_ALLOC_SEM(i) do { } while (0)
+#define LASSERT_I_ALLOC_SEM_WRITE_LOCKED(i) do { } while (0)
+#endif
+
+#ifndef HAVE_GRAB_CACHE_PAGE_NOWAIT_GFP
+#define grab_cache_page_nowait_gfp(x, y, z) grab_cache_page_nowait((x), (y))
+#endif
+
+#ifndef HAVE_FILEMAP_FDATAWRITE
+#define filemap_fdatawrite(mapping) filemap_fdatasync(mapping)
+#endif
+
+#ifdef HAVE_VFS_KERN_MOUNT
+static inline
+struct vfsmount *
+ll_kern_mount(const char *fstype, int flags, const char *name, void *data)
+{
+ struct file_system_type *type = get_fs_type(fstype);
+ struct vfsmount *mnt;
+ if (!type)
+ return ERR_PTR(-ENODEV);
+ mnt = vfs_kern_mount(type, flags, name, data);
+ module_put(type->owner);
+ return mnt;
+}
+#else
+#define ll_kern_mount(fstype, flags, name, data) do_kern_mount((fstype), (flags), (name), (data))
+#endif
+
+#ifndef HAVE_GENERIC_FILE_READ
+static inline
+ssize_t
+generic_file_read(struct file *filp, char __user *buf, size_t len, loff_t *ppos)
+{
+ struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
+ struct kiocb kiocb;
+ ssize_t ret;
+
+ init_sync_kiocb(&kiocb, filp);
+ kiocb.ki_pos = *ppos;
+ kiocb.ki_left = len;
+
+ ret = generic_file_aio_read(&kiocb, &iov, 1, kiocb.ki_pos);
+ *ppos = kiocb.ki_pos;
+ return ret;
+}
+#endif
+
+#ifndef HAVE_GENERIC_FILE_WRITE
+static inline
+ssize_t
+generic_file_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
+{
+ struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
+ struct kiocb kiocb;
+ ssize_t ret;
+
+ init_sync_kiocb(&kiocb, filp);
+ kiocb.ki_pos = *ppos;
+ kiocb.ki_left = len;
+
+ ret = generic_file_aio_write(&kiocb, &iov, 1, kiocb.ki_pos);
+ *ppos = kiocb.ki_pos;
+
+ return ret;
+}
+#endif
+
+#ifdef HAVE_STATFS_DENTRY_PARAM
+#define ll_do_statfs(sb, sfs) (sb)->s_op->statfs((sb)->s_root, (sfs))
+#else
+#define ll_do_statfs(sb, sfs) (sb)->s_op->statfs((sb), (sfs))
+#endif
+
+/* task_struct */
+#ifndef HAVE_TASK_PPTR
+#define p_pptr parent
+#endif
+
+#ifndef HAVE_SB_TIME_GRAN
+#ifndef HAVE_S_TIME_GRAN
+#error Need s_time_gran patch!
+#endif
+static inline u32 get_sb_time_gran(struct super_block *sb)
+{
+ return sb->s_time_gran;
+}
+#endif
+
+#ifdef HAVE_RW_TREE_LOCK
+#define TREE_READ_LOCK_IRQ(mapping) read_lock_irq(&(mapping)->tree_lock)
+#define TREE_READ_UNLOCK_IRQ(mapping) read_unlock_irq(&(mapping)->tree_lock)
+#else
+#define TREE_READ_LOCK_IRQ(mapping) spin_lock_irq(&(mapping)->tree_lock)
+#define TREE_READ_UNLOCK_IRQ(mapping) spin_unlock_irq(&(mapping)->tree_lock)
+#endif
+
+#ifdef HAVE_UNREGISTER_BLKDEV_RETURN_INT
+#define ll_unregister_blkdev(a,b) unregister_blkdev((a),(b))
+#else
+static inline
+int ll_unregister_blkdev(unsigned int dev, const char *name)
+{
+ unregister_blkdev(dev, name);
+ return 0;
+}
+#endif
+
+#ifdef HAVE_INVALIDATE_BDEV_2ARG
+#define ll_invalidate_bdev(a,b) invalidate_bdev((a),(b))
+#else
+#define ll_invalidate_bdev(a,b) invalidate_bdev((a))
+#endif
+
+#ifdef HAVE_INODE_BLKSIZE
+#define ll_inode_blksize(a) (a)->i_blksize
+#else
+#define ll_inode_blksize(a) (1<<(a)->i_blkbits)
+#endif
+
+#ifdef HAVE_FS_RENAME_DOES_D_MOVE
+#define LL_RENAME_DOES_D_MOVE FS_RENAME_DOES_D_MOVE
+#else
+#define LL_RENAME_DOES_D_MOVE FS_ODD_RENAME