The patch titled NFS: Represent 64-bit fileids as 64-bit inode numbers on 32-bit systems has been added to the -mm tree. Its filename is nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: NFS: Represent 64-bit fileids as 64-bit inode numbers on 32-bit systems From: David Howells <dhowells@xxxxxxxxxx> Building on the previous patch that expanded the inode numbers in struct kstat and filldir_t to an obligate 64-bits, make NFS represent 64-bit fileids as 64-bit inode numbers rather than compressing them down to 32-bits. Signed-off-by: David Howells <dhowells@xxxxxxxxxx> Cc: Trond Myklebust <trond.myklebust@xxxxxxxxxx> Cc: Al Viro <viro@xxxxxxxxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- fs/nfs/dir.c | 6 +++--- fs/nfs/inode.c | 21 ++++++++++----------- include/linux/nfs_fs.h | 9 --------- 3 files changed, 13 insertions(+), 23 deletions(-) diff -puN fs/nfs/dir.c~nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems fs/nfs/dir.c --- a/fs/nfs/dir.c~nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems +++ a/fs/nfs/dir.c @@ -397,7 +397,7 @@ int nfs_do_filldir(nfs_readdir_descripto struct file *file = desc->file; struct nfs_entry *entry = desc->entry; struct dentry *dentry = NULL; - unsigned long fileid; + u64 fileid; int loop_count = 0, res; @@ -408,7 +408,7 @@ int nfs_do_filldir(nfs_readdir_descripto unsigned d_type = DT_UNKNOWN; /* Note: entry->prev_cookie contains the cookie for * retrieving the current dirent on the server */ - fileid = nfs_fileid_to_ino_t(entry->ino); + fileid = entry->ino; /* Get a dentry if we have one */ if (dentry != NULL) @@ -418,7 +418,7 @@ int nfs_do_filldir(nfs_readdir_descripto /* Use readdirplus info */ if (dentry != NULL && dentry->d_inode != NULL) { d_type = dt_type(dentry->d_inode); - fileid = dentry->d_inode->i_ino; + fileid = NFS_FILEID(dentry->d_inode); } res = filldir(dirent, entry->name, entry->len, diff -puN fs/nfs/inode.c~nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems fs/nfs/inode.c --- a/fs/nfs/inode.c~nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems +++ a/fs/nfs/inode.c @@ -57,12 +57,6 @@ static void nfs_zap_acl_cache(struct ino static kmem_cache_t * nfs_inode_cachep; -static inline unsigned long -nfs_fattr_to_ino_t(struct nfs_fattr *fattr) -{ - return nfs_fileid_to_ino_t(fattr->fileid); -} - int nfs_write_inode(struct inode *inode, int sync) { int flags = sync ? FLUSH_SYNC : 0; @@ -220,7 +214,9 @@ nfs_fhget(struct super_block *sb, struct goto out_no_inode; } - hash = nfs_fattr_to_ino_t(fattr); + hash = fattr->fileid; + if (sizeof(hash) < sizeof(u64)) + hash ^= fattr->fileid >> (sizeof(u64) - sizeof(ino_t)) * 8; inode = iget5_locked(sb, hash, nfs_find_actor, nfs_init_locked, &desc); if (inode == NULL) { @@ -231,9 +227,10 @@ nfs_fhget(struct super_block *sb, struct if (inode->i_state & I_NEW) { struct nfs_inode *nfsi = NFS_I(inode); - /* We set i_ino for the few things that still rely on it, - * such as stat(2) */ - inode->i_ino = hash; + /* We set i_ino for the few things that still rely on it, such + * as printing messages; stat and filldir use the fileid + * directly since i_ino may not be large enough */ + inode->i_ino = fattr->fileid; /* We can't support update_atime(), since the server will reset it */ inode->i_flags |= S_NOATIME|S_NOCMTIME; @@ -440,8 +437,10 @@ int nfs_getattr(struct vfsmount *mnt, st err = __nfs_revalidate_inode(NFS_SERVER(inode), inode); else err = nfs_revalidate_inode(NFS_SERVER(inode), inode); - if (!err) + if (!err) { generic_fillattr(inode, stat); + stat->ino = NFS_FILEID(inode); + } return err; } diff -puN include/linux/nfs_fs.h~nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems include/linux/nfs_fs.h --- a/include/linux/nfs_fs.h~nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems +++ a/include/linux/nfs_fs.h @@ -546,15 +546,6 @@ nfs_size_to_loff_t(__u64 size) return (loff_t) size; } -static inline ino_t -nfs_fileid_to_ino_t(u64 fileid) -{ - ino_t ino = (ino_t) fileid; - if (sizeof(ino_t) < sizeof(u64)) - ino ^= fileid >> (sizeof(u64)-sizeof(ino_t)) * 8; - return ino; -} - /* NFS root */ extern void * nfs_root_data(void); _ Patches currently in -mm which might be from dhowells@xxxxxxxxxx are git-gfs2.patch git-nfs.patch binfmt_elf-consistently-use-loff_t.patch afs-add-lock-annotations-to-afs_proc_cell_servers_startstop.patch elf_fdpic_core_dump-dont-take-tasklist_lock.patch reiserfs-make-sure-all-dentries-refs-are-released-before-calling-kill_block_super-try-2.patch fs-cache-provide-a-filesystem-specific-syncable-page-bit.patch fs-cache-generic-filesystem-caching-facility.patch fs-cache-release-page-private-in-failed-readahead.patch fs-cache-make-kafs-use-fs-cache.patch fs-cache-make-kafs-use-fs-cache-fix.patch fs-cache-make-kafs-use-fs-cache-vs-streamline-generic_file_-interfaces-and-filemap.patch nfs-use-local-caching.patch fs-cache-cachefiles-ia64-missing-copy_page-export.patch fs-cache-cachefiles-a-cache-that-backs-onto-a-mounted-filesystem.patch fs-cache-cachefiles-a-cache-that-backs-onto-a-mounted-filesystem-cachefiles-printk-format-warning.patch autofs-make-sure-all-dentries-refs-are-released-before-calling-kill_anon_super.patch vfs-destroy-the-dentries-contributed-by-a-superblock-on-unmounting.patch vfs-make-filldir_t-and-struct-kstat-deal-in-64-bit-inode-numbers.patch nfs-represent-64-bit-fileids-as-64-bit-inode-numbers-on-32-bit-systems.patch ecryptfs-get_sb_dev-fix.patch reiser4-get_sb_dev-fix.patch mutex-subsystem-synchro-test-module.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html