struct inode *inode = filp->f_dentry->d_inode;
struct ll_inode_info *info = ll_i2info(inode);
__u64 pos = filp->f_pos;
+ struct ll_sb_info *sbi = ll_i2sbi(inode);
struct page *page;
struct ll_dir_chain chain;
- int rc;
+ int rc, need_32bit;
int done;
int shift;
__u16 type;
ENTRY;
- CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p) pos %lu/%llu\n",
+ need_32bit = ll_need_32bit_api(sbi);
+ CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p) pos %lu/%llu 32bit_api %d\n",
inode->i_ino, inode->i_generation, inode,
- (unsigned long)pos, i_size_read(inode));
+ (unsigned long)pos, i_size_read(inode), need_32bit);
if (pos == DIR_END_OFF)
/*
fid = ent->lde_fid;
name = ent->lde_name;
fid_le_to_cpu(&fid, &fid);
- if (cfs_curproc_is_32bit())
+ if (need_32bit)
ino = cl_fid_build_ino32(&fid);
else
ino = cl_fid_build_ino(&fid);
return res;
stat->dev = inode->i_sb->s_dev;
- if (cfs_curproc_is_32bit())
+ if (ll_need_32bit_api(ll_i2sbi(inode)))
stat->ino = cl_fid_build_ino32(&lli->lli_fid);
else
stat->ino = inode->i_ino;
#define LL_SBI_LRU_RESIZE 0x400 /* lru resize support */
#define LL_SBI_LAZYSTATFS 0x800 /* lazystatfs mount option */
#define LL_SBI_SOM_PREVIEW 0x1000 /* SOM preview mount option */
+#define LL_SBI_32BIT_API 0x2000 /* generate 32 bit inodes. */
/* default value for ll_sb_info->contention_time */
#define SBI_DEFAULT_CONTENTION_SECONDS 60
__u32 ll_i2suppgid(struct inode *i);
void ll_i2gids(__u32 *suppgids, struct inode *i1,struct inode *i2);
+static inline int ll_need_32bit_api(struct ll_sb_info *sbi)
+{
+#if BITS_PER_LONG == 32
+ return 1;
+#else
+ return unlikely(cfs_curproc_is_32bit() || (sbi->ll_flags & LL_SBI_32BIT_API));
+#endif
+}
+
#define LLAP_MAGIC 98764321
extern cfs_mem_cache_t *ll_async_page_slab;
*flags |= tmp;
goto next;
}
+ tmp = ll_set_opt("32bitapi", s1, LL_SBI_32BIT_API);
+ if (tmp) {
+ *flags |= tmp;
+ goto next;
+ }
LCONSOLE_ERROR_MSG(0x152, "Unknown option '%s', won't mount.\n",
s1);