/* * Implement readdir. */ static int /* error */ xfs_dir_getdents(xfs_trans_t *trans, xfs_inode_t *dp, uio_t *uio, int *eofp) { dirent_t *dbp; int locklen = 0, alignment, retval, is32; xfs_dir_put_t put; int error; XFS_STATS_INC(xs_dir_getdents); ASSERT((dp->i_d.di_mode & IFMT) == IFDIR); /* * If our caller has given us a single contiguous memory buffer, * just work directly within that buffer. If it's in user memory, * lock it down first. */ is32 = ABI_IS_IRIX5(GETDENTS_ABI(get_current_abi(), uio)); alignment = (is32 ? sizeof(xfs32_off_t) : sizeof(xfs_off_t)) - 1; if ((uio->uio_iovcnt == 1) && #if CELL_CAPABLE !KT_CUR_ISXTHREAD() && #endif (((__psint_t)uio->uio_iov[0].iov_base & alignment) == 0) && ((uio->uio_iov[0].iov_len & alignment) == 0)) { dbp = NULL; if (uio->uio_segflag == UIO_SYSSPACE) { put = xfs_dir_put_dirent64_direct; } else { put = is32 ? xfs_dir_put_dirent32_direct : xfs_dir_put_dirent64_direct; } } else { dbp = kmem_alloc(sizeof(*dbp) + MAXNAMELEN, KM_SLEEP); put = is32 ? xfs_dir_put_dirent32_uio : xfs_dir_put_dirent64_uio; } /* * Decide on what work routines to call based on the inode size. */ *eofp = 0; if (dp->i_d.di_format == XFS_DINODE_FMT_LOCAL) { retval = xfs_dir_shortform_getdents(dp, uio, eofp, dbp, put); } else if (xfs_bmap_one_block(dp, XFS_DATA_FORK)) { retval = xfs_dir_leaf_getdents(trans, dp, uio, eofp, dbp, put); } else { retval = xfs_dir_node_getdents(trans, dp, uio, eofp, dbp, put); } if (dbp != NULL) kmem_free(dbp, sizeof(*dbp) + MAXNAMELEN); return(retval); }
copyin_afs_ioctl(caddr_t cmarg, struct afs_ioctl *dst) #endif { int code; #if defined(AFS_DARWIN100_ENV) struct afs_ioctl32 dst32; if (!proc_is64bit(current_proc())) { AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code); if (!code) afs_ioctl32_to_afs_ioctl(&dst32, dst); return code; } #endif #if defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL) struct afs_ioctl32 dst32; if (!(IS64U)) { AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code); if (!code) afs_ioctl32_to_afs_ioctl(&dst32, dst); return code; } #endif /* defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL) */ #if defined(AFS_HPUX_64BIT_ENV) struct afs_ioctl32 dst32; if (is_32bit(u.u_procp)) { /* is_32bit() in proc_iface.h */ AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code); if (!code) afs_ioctl32_to_afs_ioctl(&dst32, dst); return code; } #endif /* defined(AFS_HPUX_64BIT_ENV) */ #if defined(AFS_SUN5_64BIT_ENV) struct afs_ioctl32 dst32; if (get_udatamodel() == DATAMODEL_ILP32) { AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code); if (!code) afs_ioctl32_to_afs_ioctl(&dst32, dst); return code; } #endif /* defined(AFS_SUN5_64BIT_ENV) */ #if defined(AFS_SGI_ENV) && (_MIPS_SZLONG==64) struct afs_ioctl32 dst32; if (!ABI_IS_64BIT(get_current_abi())) { AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code); if (!code) afs_ioctl32_to_afs_ioctl(&dst32, dst); return code; } #endif /* defined(AFS_SGI_ENV) && (_MIPS_SZLONG==64) */ #if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV) struct afs_ioctl32 dst32; #ifdef AFS_SPARC64_LINUX26_ENV if (test_thread_flag(TIF_32BIT)) #elif defined(AFS_SPARC64_LINUX24_ENV) if (current->thread.flags & SPARC_FLAG_32BIT) #elif defined(AFS_SPARC64_LINUX20_ENV) if (current->tss.flags & SPARC_FLAG_32BIT) #elif defined(AFS_AMD64_LINUX26_ENV) if (test_thread_flag(TIF_IA32)) #elif defined(AFS_AMD64_LINUX20_ENV) if (current->thread.flags & THREAD_IA32) #elif defined(AFS_PPC64_LINUX26_ENV) #if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO) if (current->thread_info->flags & _TIF_32BIT) #else if (task_thread_info(current)->flags & _TIF_32BIT) #endif #elif defined(AFS_PPC64_LINUX20_ENV) if (current->thread.flags & PPC_FLAG_32BIT) #elif defined(AFS_S390X_LINUX26_ENV) if (test_thread_flag(TIF_31BIT)) #elif defined(AFS_S390X_LINUX20_ENV) if (current->thread.flags & S390_FLAG_31BIT) #else #error pioctl32 not done for this linux #endif { AFS_COPYIN(cmarg, (caddr_t) & dst32, sizeof dst32, code); if (!code) afs_ioctl32_to_afs_ioctl(&dst32, dst); return code; } #endif /* defined(AFS_LINUX_64BIT_KERNEL) */ AFS_COPYIN(cmarg, (caddr_t) dst, sizeof *dst, code); return code; }