X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Finclude%2Flinux%2Flustre_compat25.h;h=48ba509b43bae64b1885f47d0d8f81538a11c0f5;hb=7bb892f4f3de837a940d867b97fe14013ad67dc6;hp=62bde7c52b5a10e5a82fa03bc1fdcb57a5cee256;hpb=f2800b1ad4754aee1f7fed720c835f91ac1fea28;p=fs%2Flustre-release.git diff --git a/lustre/include/linux/lustre_compat25.h b/lustre/include/linux/lustre_compat25.h index 62bde7c..48ba509 100644 --- a/lustre/include/linux/lustre_compat25.h +++ b/lustre/include/linux/lustre_compat25.h @@ -31,6 +31,72 @@ #include +/* + * groups_info related staff + */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,4) + +#define NGROUPS_SMALL NGROUPS +#define NGROUPS_PER_BLOCK ((int)(EXEC_PAGESIZE / sizeof(gid_t))) +struct group_info { + int ngroups; + atomic_t usage; + gid_t small_block[NGROUPS_SMALL]; + int nblocks; + gid_t *blocks[0]; +}; +#define current_ngroups current->ngroups + +struct group_info *groups_alloc(int gidsetsize); +void groups_free(struct group_info *ginfo); +int groups_search(struct group_info *ginfo, gid_t grp); + +#define get_group_info(group_info) \ + do { \ + atomic_inc(&(group_info)->usage); \ + } while (0) + +#define put_group_info(group_info) \ + do { \ + if (atomic_dec_and_test(&(group_info)->usage)) \ + groups_free(group_info); \ + } while (0) + +#define groups_sort(gi) do {} while (0) + +#define GROUP_AT(gi, i) ((gi)->small_block[(i)]) + +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; +} + +#else /* >= 2.6.4 */ + +#define current_ngroups current->group_info->ngroups + +void groups_sort(struct group_info *ginfo); +int groups_search(struct group_info *ginfo, gid_t grp); + +static inline int cleanup_group_info(void) +{ + struct group_info *ginfo; + + ginfo = groups_alloc(0); + if (!ginfo) + return -ENOMEM; + + set_current_groups(ginfo); + put_group_info(ginfo); + + return 0; +} +#endif /* end of groups_info stuff */ + + #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) /* @@ -38,7 +104,10 @@ * initialization routines must be called after device * driver initialization */ +#ifndef MODULE +#undef module_init #define module_init(a) late_initcall(a) +#endif /* XXX our code should be using the 2.6 calls, not the other way around */ #define TryLockPage(page) TestSetPageLocked(page) @@ -49,10 +118,16 @@ #define LTIME_S(time) (time.tv_sec) #define ll_path_lookup path_lookup -#define ll_permission permission +#define ll_permission(inode,mask,nd) permission(inode,mask,nd) #define ll_pgcache_lock(mapping) spin_lock(&mapping->page_lock) #define ll_pgcache_unlock(mapping) spin_unlock(&mapping->page_lock) +#define ll_call_writepage(inode, page) \ + (inode)->i_mapping->a_ops->writepage(page, NULL) +#define ll_invalidate_inode_pages(inode) \ + invalidate_inode_pages((inode)->i_mapping) +#define ll_truncate_complete_page(page) \ + truncate_complete_page(page->mapping, page) #define ll_vfs_create(a,b,c,d) vfs_create(a,b,c,d) @@ -69,19 +144,21 @@ static inline void lustre_daemonize_helper(void) { LASSERT(current->signal != NULL); current->signal->session = 1; - current->signal->pgrp = 1; + if (current->group_leader) + current->group_leader->signal->pgrp = 1; + else + CERROR("we aren't group leader\n"); current->signal->tty = NULL; } -#define rb_node_s rb_node -#define rb_root_s rb_root -typedef struct rb_root_s rb_root_t; -typedef struct rb_node_s rb_node_t; +#define smp_num_cpus NR_CPUS + +#include #else /* 2.4.. */ #define ll_vfs_create(a,b,c,d) vfs_create(a,b,c) -#define ll_permission(a,b,c) permission(a,b) +#define ll_permission(inode,mask,nd) permission(inode,mask) #define ILOOKUP(sb, ino, test, data) ilookup4(sb, ino, test, data); #define DCACHE_DISCONNECTED DCACHE_NFSD_DISCONNECTED #define ll_dev_t int @@ -110,23 +187,27 @@ static inline void clear_page_dirty(struct page *page) #define try_module_get __MOD_INC_USE_COUNT #define module_put __MOD_DEC_USE_COUNT #define LTIME_S(time) (time) -#ifndef CONFIG_RH_2_4_20 +#if !defined(CONFIG_RH_2_4_20) && !defined(cpu_online) #define cpu_online(cpu) (cpu_online_map & (1<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 __d_drop(struct dentry *dentry) { @@ -141,18 +222,59 @@ static inline void lustre_daemonize_helper(void) current->tty = NULL; } -#ifndef conditional_schedule -#define conditional_schedule() if (unlikely(need_resched())) schedule() +#ifndef HAVE_COND_RESCHED +static inline void cond_resched(void) +{ + if (unlikely(need_resched())) { + set_curret_state(TASK_RUNNING); + schedule(); + } +} #endif -/* 2.6 has the lovely PagePrivate bit for indicating that a filesystem - * has hung state off of page->private. We use it. */ -#define PG_private 9 /* unused in 2.4, apparently. */ -#define SetPagePrivate(page) set_bit(PG_private, &(page)->flags) -#define ClearPagePrivate(page) clear_bit(PG_private, &(page)->flags) -#define PagePrivate(page) test_bit(PG_private, &(page)->flags) +/* to find proc_dir_entry from inode. 2.6 has native one -bzzz */ +#ifndef HAVE_PDE +#define PDE(ii) ((ii)->u.generic_ip) +#endif #endif /* end of 2.4 compat macros */ +#ifdef HAVE_PAGE_LIST +static inline int mapping_has_pages(struct address_space *mapping) +{ + int rc = 1; + + ll_pgcache_lock(mapping); + if (list_empty(&mapping->dirty_pages) && + list_empty(&mapping->clean_pages) && + list_empty(&mapping->locked_pages)) { + rc = 0; + } + ll_pgcache_unlock(mapping); + + return rc; +} + +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; +} +#else +static inline int mapping_has_pages(struct address_space *mapping) +{ + return mapping->nrpages > 0; +} +#endif + #endif /* __KERNEL__ */ #endif /* _COMPAT25_H */