X-Git-Url: http://git.openafs.org/?p=openafs.git;a=blobdiff_plain;f=src%2Fafs%2FLINUX%2Fosi_compat.h;h=d236081431d613999fc6222344785245329fb97a;hp=e9e5076da12101909431d3ea8e520fe53dbb0c33;hb=02d82275c17284d04629282aa374bb39f511c989;hpb=d40ed7391670010db0df2202d770341b2ca82f32 diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h index e9e5076..d236081 100644 --- a/src/afs/LINUX/osi_compat.h +++ b/src/afs/LINUX/osi_compat.h @@ -37,7 +37,25 @@ typedef struct vfs_path afs_linux_path_t; typedef struct path afs_linux_path_t; #endif -#ifndef HAVE_LINUX_DO_SYNC_READ +#if defined(STRUCT_DENTRY_HAS_D_U_D_ALIAS) +# define d_alias d_u.d_alias +#endif + +#if defined(STRUCT_FILE_HAS_F_PATH) +# if !defined(f_dentry) +# define f_dentry f_path.dentry +# endif +#endif + +#ifndef HAVE_LINUX_FILE_DENTRY +#define file_dentry(file) ((file)->f_dentry) +#endif + +#if defined(HAVE_LINUX_LOCKS_LOCK_FILE_WAIT) +# define flock_lock_file_wait locks_lock_file_wait +#endif + +#if !defined(HAVE_LINUX_DO_SYNC_READ) && !defined(STRUCT_FILE_OPERATIONS_HAS_READ_ITER) static inline int do_sync_read(struct file *fp, char *buf, size_t count, loff_t *offp) { return generic_file_read(fp, buf, count, offp); @@ -176,7 +194,9 @@ static inline struct key * afs_linux_key_alloc(struct key_type *type, const char *desc, afs_kuid_t uid, afs_kgid_t gid, key_perm_t perm, unsigned long flags) { -# if defined(KEY_ALLOC_NEEDS_STRUCT_TASK) +# if defined(KEY_ALLOC_BYPASS_RESTRICTION) + return key_alloc(type, desc, uid, gid, current_cred(), perm, flags, NULL); +# elif defined(KEY_ALLOC_NEEDS_STRUCT_TASK) return key_alloc(type, desc, uid, gid, current, perm, flags); # elif defined(KEY_ALLOC_NEEDS_CRED) return key_alloc(type, desc, uid, gid, current_cred(), perm, flags); @@ -202,9 +222,15 @@ afs_linux_search_keyring(afs_ucred_t *cred, struct key_type *type) key_ref_t key_ref; if (afs_session_keyring(cred)) { +# if defined(KEYRING_SEARCH_TAKES_RECURSE) + key_ref = keyring_search( + make_key_ref(afs_session_keyring(cred), 1), + type, "_pag", 1); +# else key_ref = keyring_search( make_key_ref(afs_session_keyring(cred), 1), type, "_pag"); +# endif if (IS_ERR(key_ref)) return ERR_CAST(key_ref); @@ -260,7 +286,7 @@ afs_linux_cred_is_current(afs_ucred_t *cred) static inline loff_t page_offset(struct page *pp) { - return (((loff_t) pp->index) << PAGE_CACHE_SHIFT); + return (((loff_t) pp->index) << PAGE_SHIFT); } #endif @@ -431,7 +457,9 @@ afs_init_sb_export_ops(struct super_block *sb) { static inline void afs_linux_lock_inode(struct inode *ip) { -#ifdef STRUCT_INODE_HAS_I_MUTEX +#if defined(HAVE_LINUX_INODE_LOCK) + inode_lock(ip); +#elif defined(STRUCT_INODE_HAS_I_MUTEX) mutex_lock(&ip->i_mutex); #else down(&ip->i_sem); @@ -440,13 +468,42 @@ afs_linux_lock_inode(struct inode *ip) { static inline void afs_linux_unlock_inode(struct inode *ip) { -#ifdef STRUCT_INODE_HAS_I_MUTEX +#if defined(HAVE_LINUX_INODE_LOCK) + inode_unlock(ip); +#elif defined(STRUCT_INODE_HAS_I_MUTEX) mutex_unlock(&ip->i_mutex); #else up(&ip->i_sem); #endif } +/* Use these to lock or unlock an inode for processing + * its dentry aliases en masse. + */ +#if defined(HAVE_DCACHE_LOCK) +#define afs_d_alias_lock(ip) spin_lock(&dcache_lock) +#define afs_d_alias_unlock(ip) spin_unlock(&dcache_lock) +#else +#define afs_d_alias_lock(ip) spin_lock(&(ip)->i_lock) +#define afs_d_alias_unlock(ip) spin_unlock(&(ip)->i_lock) +#endif + + +/* Use this instead of dget for dentry operations + * that occur under a higher lock (e.g. alias processing). + * Requires that the higher lock (e.g. dcache_lock or + * inode->i_lock) is already held. + */ +static inline void +afs_linux_dget(struct dentry *dp) { +#if defined(HAVE_DCACHE_LOCK) + dget_locked(dp); +#else + dget(dp); +#endif +} + + static inline int afs_inode_setattr(struct osi_file *afile, struct iattr *newattrs) { @@ -483,23 +540,23 @@ afs_get_dentry_ref(struct nameidata *nd, struct vfsmount **mnt, struct dentry ** #else afs_get_dentry_ref(afs_linux_path_t *path, struct vfsmount **mnt, struct dentry **dpp) { #endif -#if defined(STRUCT_NAMEIDATA_HAS_PATH) -# if defined(HAVE_LINUX_PATH_LOOKUP) +#if defined(HAVE_LINUX_PATH_LOOKUP) +# if defined(STRUCT_NAMEIDATA_HAS_PATH) *dpp = dget(nd->path.dentry); if (mnt) *mnt = mntget(nd->path.mnt); path_put(&nd->path); # else - *dpp = dget(path->dentry); - if (mnt) - *mnt = mntget(path->mnt); - path_put(path); -# endif -#else *dpp = dget(nd->dentry); if (mnt) *mnt = mntget(nd->mnt); path_release(nd); +# endif +#else + *dpp = dget(path->dentry); + if (mnt) + *mnt = mntget(path->mnt); + path_put(path); #endif } @@ -610,4 +667,55 @@ afs_maybe_shrink_dcache(struct dentry *dp) #endif } +static inline int +afs_d_invalidate(struct dentry *dp) +{ +#if defined(D_INVALIDATE_IS_VOID) + d_invalidate(dp); + return 0; +#else + return d_invalidate(dp); +#endif +} + +#if defined(HAVE_LINUX___VFS_WRITE) +# define AFS_FILE_NEEDS_SET_FS 1 +#elif defined(HAVE_LINUX_KERNEL_WRITE) +/* #undef AFS_FILE_NEEDS_SET_FS */ +#else +# define AFS_FILE_NEEDS_SET_FS 1 +#endif + +static inline int +afs_file_read(struct file *filp, char __user *buf, size_t len, loff_t *pos) +{ +#if defined(HAVE_LINUX___VFS_WRITE) + return __vfs_read(filp, buf, len, pos); +#elif defined(HAVE_LINUX_KERNEL_WRITE) +# if defined(KERNEL_READ_OFFSET_IS_LAST) + return kernel_read(filp, buf, len, pos); +# else + return kernel_read(filp, *pos, buf, len); +# endif +#else + return filp->f_op->read(filp, buf, len, pos); +#endif +} + +static inline int +afs_file_write(struct file *filp, char __user *buf, size_t len, loff_t *pos) +{ +#if defined(HAVE_LINUX___VFS_WRITE) + return __vfs_write(filp, buf, len, pos); +#elif defined(HAVE_LINUX_KERNEL_WRITE) +# if defined(KERNEL_READ_OFFSET_IS_LAST) + return kernel_write(filp, buf, len, pos); +# else + return kernel_write(filp, buf, len, *pos); +# endif +#else + return filp->f_op->write(filp, buf, len, pos); +#endif +} + #endif /* AFS_LINUX_OSI_COMPAT_H */