+#define ll_call_writepage(inode, page) \
+ (inode)->i_mapping->a_ops->writepage(page)
+#define ll_invalidate_inode_pages(inode) invalidate_inode_pages(inode)
+#define ll_truncate_complete_page(page) truncate_complete_page(page)
+
+static inline void clear_page_dirty(struct page *page)
+{
+ if (PageDirty(page))
+ ClearPageDirty(page);
+}
+
+static inline int clear_page_dirty_for_io(struct page *page)
+{
+ struct address_space *mapping = page->mapping;
+
+ if (page->mapping && PageDirty(page)) {
+ ClearPageDirty(page);
+ ll_pgcache_lock(mapping);
+ list_del(&page->list);
+ list_add(&page->list, &mapping->locked_pages);
+ ll_pgcache_unlock(mapping);
+ return 1;
+ }
+ return 0;
+}
+
+static inline void ll_redirty_page(struct page *page)
+{
+ SetPageDirty(page);
+ ClearPageLaunder(page);
+}
+
+static inline void __d_drop(struct dentry *dentry)
+{
+ list_del_init(&dentry->d_hash);
+}
+
+static inline int cleanup_group_info(void)
+{
+ /* Get rid of unneeded supplementary groups */
+ current->ngroups = 0;
+ memset(current->groups, 0, sizeof(current->groups));
+ return 0;
+}
+
+#ifndef HAVE_COND_RESCHED
+static inline void cond_resched(void)
+{
+ if (unlikely(need_resched())) {
+ set_current_state(TASK_RUNNING);
+ schedule();
+ }
+}
+#endif
+
+/* to find proc_dir_entry from inode. 2.6 has native one -bzzz */
+#ifndef HAVE_PDE
+#define PDE(ii) ((ii)->u.generic_ip)
+#endif
+
+#define __set_page_ll_data(page, llap) set_page_private(page, (unsigned long)llap)
+#define __clear_page_ll_data(page) set_page_private(page, 0)
+#define PageWriteback(page) 0
+#define CheckWriteback(page, cmd) 1
+#define set_page_writeback(page) do {} while (0)
+#define end_page_writeback(page) do {} while (0)
+
+static inline int mapping_mapped(struct address_space *mapping)
+{
+ if (mapping->i_mmap_shared)
+ return 1;
+ if (mapping->i_mmap)
+ return 1;
+ return 0;
+}
+
+#ifdef ZAP_PAGE_RANGE_VMA
+#define ll_zap_page_range(vma, addr, len) zap_page_range(vma, addr, len)
+#else
+#define ll_zap_page_range(vma, addr, len) zap_page_range(vma->vm_mm, addr, len)
+#endif
+
+#ifndef HAVE_PAGE_MAPPED
+/* Poor man's page_mapped. substract from page count, counts from
+ buffers/pagecache and our own count (we are supposed to hold one reference).
+ What is left are user mappings and also others who work with this page now,
+ but there are supposedly none. */
+static inline int page_mapped(struct page *page)
+{
+ return page_count(page) - !!page->mapping - !!page->buffers - 1;
+}
+#endif /* !HAVE_PAGE_MAPPED */
+
+static inline void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
+{
+ update_atime(dentry->d_inode);
+}
+
+static inline void file_accessed(struct file *file)
+{
+#ifdef O_NOATIME
+ if (file->f_flags & O_NOATIME)
+ return;
+#endif
+ touch_atime(file->f_vfsmnt, file->f_dentry);
+}
+
+#ifndef typecheck
+/*
+ * Check at compile time that something is of a particular type.
+ * Always evaluates to 1 so you may use it easily in comparisons.
+ */
+#define typecheck(type,x) \
+({ type __dummy; \
+ typeof(x) __dummy2; \
+ (void)(&__dummy == &__dummy2); \
+ 1; \
+})
+#endif