From 2d8ad415e269efd618f96e24d48e75b8fd8da687 Mon Sep 17 00:00:00 2001 From: Robert Read Date: Tue, 15 Jun 2010 08:58:10 -0700 Subject: [PATCH] Revert "b=20563 Increase LUSTRE_SEQ_MAX_WIDTH" This reverts commit 09803193a151902acc39720946b831b90655c4a8. This patch causes several failures replay-vbr test 7. --- lustre/include/lclient.h | 3 +- lustre/include/linux/lustre_compat25.h | 1 + lustre/include/lustre_fid.h | 55 +++++----------------------------- lustre/lclient/lcommon_cl.c | 32 +++++++++++--------- lustre/liblustre/dir.c | 2 +- lustre/llite/dir.c | 7 ++--- lustre/llite/file.c | 7 +---- lustre/llite/llite_nfs.c | 6 ++-- 8 files changed, 35 insertions(+), 78 deletions(-) diff --git a/lustre/include/lclient.h b/lustre/include/lclient.h index 1883df6..7ed3b81 100644 --- a/lustre/include/lclient.h +++ b/lustre/include/lclient.h @@ -354,8 +354,7 @@ void cl_inode_fini(struct inode *inode); int cl_local_size(struct inode *inode); __u16 ll_dirent_type_get(struct lu_dirent *ent); -__u64 cl_fid_build_ino(const struct lu_fid *fid); -__u32 cl_fid_build_ino32(const struct lu_fid *fid); +ino_t cl_fid_build_ino(const struct lu_fid *fid); __u32 cl_fid_build_gen(const struct lu_fid *fid); #ifdef INVARIANT_CHECK diff --git a/lustre/include/linux/lustre_compat25.h b/lustre/include/linux/lustre_compat25.h index 5f0a199..cbb173f 100644 --- a/lustre/include/linux/lustre_compat25.h +++ b/lustre/include/linux/lustre_compat25.h @@ -196,6 +196,7 @@ do {cfs_mutex_lock_nested(&(inode)->i_mutex, I_MUTEX_PARENT); } while(0) #define to_kdev_t(dev) (dev) #define kdev_t_to_nr(dev) (dev) #define val_to_kdev(dev) (dev) +#define ILOOKUP(sb, ino, test, data) ilookup5(sb, ino, test, (void *)(data)); #ifdef HAVE_BLKDEV_PUT_2ARGS #define ll_blkdev_put(a, b) blkdev_put(a, b) diff --git a/lustre/include/lustre_fid.h b/lustre/include/lustre_fid.h index 9311d40..fa742e2 100644 --- a/lustre/include/lustre_fid.h +++ b/lustre/include/lustre_fid.h @@ -67,14 +67,17 @@ extern const struct lu_fid LU_DOT_LUSTRE_FID; enum { /* - * This is how may FIDs may be allocated in one sequence(128k) + * This is how may FIDs may be allocated in one sequence. 16384 for + * now. */ - LUSTRE_SEQ_MAX_WIDTH = 0x0000000000020000ULL, + LUSTRE_SEQ_MAX_WIDTH = 0x0000000000000400ULL, /* - * How many sequences to allocate to a client at once. + * How many sequences may be allocate for meta-sequence (this is 128 + * sequences). */ - LUSTRE_SEQ_META_WIDTH = 0x0000000000000001ULL, + /* changed to 16 to avoid overflow in test11 */ + LUSTRE_SEQ_META_WIDTH = 0x0000000000000010ULL, /* * seq allocation pool size. @@ -327,51 +330,9 @@ fid_build_pdo_res_name(const struct lu_fid *f, return name; } - -/** - * Flatten 128-bit FID values into a 64-bit value for - * use as an inode number. For non-IGIF FIDs this - * starts just over 2^32, and continues without conflict - * until 2^64, at which point we wrap the high 32 bits - * of the SEQ into the range where there may not be many - * OID values in use, to minimize the risk of conflict. - * - * The time between re-used inode numbers is very long - - * 2^32 SEQ numbers, or about 2^32 client mounts. */ static inline __u64 fid_flatten(const struct lu_fid *fid) { - __u64 ino; - __u64 seq; - - if (fid_is_igif(fid)) { - ino = lu_igif_ino(fid); - RETURN(ino); - } - - seq = fid_seq(fid); - - ino = (seq << 24) + ((seq >> (64-8)) & 0xffffff0000ULL) + fid_oid(fid); - - RETURN(ino ? ino : fid_oid(fid)); -} - -/** - * map fid to 32 bit value for ino on 32bit systems. */ -static inline __u32 fid_flatten32(const struct lu_fid *fid) -{ - __u32 ino; - __u64 seq; - - if (fid_is_igif(fid)) { - ino = lu_igif_ino(fid); - RETURN(ino); - } - - seq = fid_seq(fid) - FID_SEQ_START; - - ino = ((seq & 0xfffffULL) << 12) + ((seq >> 8) & 0xfffff000) + - (seq >> (64 - (40-8)) & 0xffffff00) + fid_oid(fid); - RETURN(ino ? ino : fid_oid(fid)); + return (fid_seq(fid) - 1) * LUSTRE_SEQ_MAX_WIDTH + fid_oid(fid); } #define LUSTRE_SEQ_SRV_NAME "seq_srv" diff --git a/lustre/lclient/lcommon_cl.c b/lustre/lclient/lcommon_cl.c index c172e9d..21a52e7 100644 --- a/lustre/lclient/lcommon_cl.c +++ b/lustre/lclient/lcommon_cl.c @@ -1285,22 +1285,26 @@ __u16 ll_dirent_type_get(struct lu_dirent *ent) } /** - * for 32 bit inode numbers directly map seq+oid to 32bit number. - */ -__u32 cl_fid_build_ino32(const struct lu_fid *fid) -{ - RETURN(fid_flatten32(fid)); -} - -/** * build inode number from passed @fid */ -__u64 cl_fid_build_ino(const struct lu_fid *fid) +ino_t cl_fid_build_ino(const struct lu_fid *fid) { -#if BITS_PER_LONG == 32 - RETURN(fid_flatten32(fid)); -#else - RETURN(fid_flatten(fid)); -#endif + ino_t ino; + ENTRY; + + if (fid_is_igif(fid)) { + ino = lu_igif_ino(fid); + RETURN(ino); + } + + /* Very stupid and having many downsides inode allocation algorithm + * based on fid. */ + ino = fid_flatten(fid) & 0xFFFFFFFF; + + if (unlikely(ino == 0)) + /* the first result ino is 0xFFC001, so this is rarely used */ + ino = 0xffbcde; + ino = ino | 0x80000000; + RETURN(ino); } /** diff --git a/lustre/liblustre/dir.c b/lustre/liblustre/dir.c index fb33c35..0e0f8b8 100644 --- a/lustre/liblustre/dir.c +++ b/lustre/liblustre/dir.c @@ -238,7 +238,7 @@ ssize_t llu_iop_filldirentries(struct inode *dir, _SYSIO_OFF_T *basep, char *name; int namelen; struct lu_fid fid; - __u64 ino; + ino_t ino; hash = le64_to_cpu(ent->lde_hash); namelen = le16_to_cpu(ent->lde_namelen); diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index f145b8c..10bd6f5 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -442,7 +442,7 @@ int ll_readdir(struct file *filp, void *cookie, filldir_t filldir) char *name; int namelen; struct lu_fid fid; - __u64 ino; + ino_t ino; /* * XXX: implement correct swabbing here. @@ -467,10 +467,7 @@ int ll_readdir(struct file *filp, void *cookie, filldir_t filldir) fid = ent->lde_fid; name = ent->lde_name; fid_le_to_cpu(&fid, &fid); - if (cfs_curproc_is_32bit()) - ino = cl_fid_build_ino32(&fid); - else - ino = cl_fid_build_ino(&fid); + ino = cl_fid_build_ino(&fid); type = ll_dirent_type_get(ent); done = filldir(cookie, name, namelen, (loff_t)hash, ino, type); diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 693dc35..d327705 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -2212,7 +2212,6 @@ int ll_getattr_it(struct vfsmount *mnt, struct dentry *de, struct lookup_intent *it, struct kstat *stat) { struct inode *inode = de->d_inode; - struct ll_inode_info *lli = ll_i2info(inode); int res = 0; res = ll_inode_revalidate_it(de, it); @@ -2222,11 +2221,7 @@ int ll_getattr_it(struct vfsmount *mnt, struct dentry *de, return res; stat->dev = inode->i_sb->s_dev; - if (cfs_curproc_is_32bit()) - stat->ino = cl_fid_build_ino32(&lli->lli_fid); - else - stat->ino = inode->i_ino; - + stat->ino = inode->i_ino; stat->mode = inode->i_mode; stat->nlink = inode->i_nlink; stat->uid = inode->i_uid; diff --git a/lustre/llite/llite_nfs.c b/lustre/llite/llite_nfs.c index 25352ae..faa5b83 100644 --- a/lustre/llite/llite_nfs.c +++ b/lustre/llite/llite_nfs.c @@ -73,14 +73,14 @@ static struct inode *search_inode_for_lustre(struct super_block *sb, struct ptlrpc_request *req = NULL; struct inode *inode = NULL; int eadatalen = 0; - unsigned long hash = (unsigned long) cl_fid_build_ino(fid); + ino_t ino = cl_fid_build_ino(fid); struct md_op_data *op_data; int rc; ENTRY; - CDEBUG(D_INFO, "searching inode for:(%lu,"DFID")\n", hash, PFID(fid)); + CDEBUG(D_INFO, "searching inode for:(%lu,"DFID")\n", ino, PFID(fid)); - inode = ilookup5(sb, hash, ll_nfs_test_inode, (void *)fid); + inode = ILOOKUP(sb, ino, ll_nfs_test_inode, fid); if (inode) RETURN(inode); -- 1.8.3.1