linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* why is i_ino unsigned long, anyway?
@ 2013-09-12 16:03 J. Bruce Fields
  2013-09-12 19:33 ` Al Viro
  0 siblings, 1 reply; 24+ messages in thread
From: J. Bruce Fields @ 2013-09-12 16:03 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: Al Viro, linux-nfs, sandeen

Somebody noticed an "ls -l" over nfs failing on entries with inode
numbers greater than 2^32 on a 32-bit NFS server.  The cause is some
code that tries to compare i_ino to the full 64-bit inode number.

I think the following will fix it, but I'm curious: why is i_ino
"unsigned long", anyway?  Is there something know that depends on that,
or is it just that the sheer number of users makes it too scary to
change?

--b.

commit 0cc784eb430285535ae7a79dd5133ab66e9ce839
Author: J. Bruce Fields <bfields@redhat.com>
Date:   Tue Sep 10 11:41:12 2013 -0400

    exportfs: fix 32-bit nfsd handling of 64-bit inode numbers
    
    Symptoms were spurious -ENOENTs on stat of an NFS filesystem from a
    32-bit NFS server exporting a very large XFS filesystem, when the
    server's cache is cold (so the inodes in question are not in cache).
    
    Signed-off-by: J. Bruce Fields <bfields@redhat.com>

diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c
index 293bc2e..6a79bb8 100644
--- a/fs/exportfs/expfs.c
+++ b/fs/exportfs/expfs.c
@@ -215,7 +215,7 @@ struct getdents_callback {
 	struct dir_context ctx;
 	char *name;		/* name that was found. It already points to a
 				   buffer NAME_MAX+1 is size */
-	unsigned long ino;	/* the inum we are looking for */
+	u64 ino;		/* the inum we are looking for */
 	int found;		/* inode matched? */
 	int sequence;		/* sequence counter */
 };
@@ -255,10 +255,10 @@ static int get_name(const struct path *path, char *name, struct dentry *child)
 	struct inode *dir = path->dentry->d_inode;
 	int error;
 	struct file *file;
+	struct kstat stat;
 	struct getdents_callback buffer = {
 		.ctx.actor = filldir_one,
 		.name = name,
-		.ino = child->d_inode->i_ino
 	};
 
 	error = -ENOTDIR;
@@ -268,6 +268,16 @@ static int get_name(const struct path *path, char *name, struct dentry *child)
 	if (!dir->i_fop)
 		goto out;
 	/*
+	 * inode->i_ino is unsigned long, kstat->ino is u64, so the
+	 * former would be insufficient on 32-bit hosts when the
+	 * filesystem supports 64-bit inode numbers.  So we need to
+	 * actually call ->getattr, not just read i_ino:
+	 */
+	error = vfs_getattr(path, &stat);
+	if (error)
+		return error;
+	buffer.ino = stat.ino;
+	/*
 	 * Open the directory ...
 	 */
 	file = dentry_open(path, O_RDONLY, cred);

^ permalink raw reply related	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2013-10-13 22:53 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-12 16:03 why is i_ino unsigned long, anyway? J. Bruce Fields
2013-09-12 19:33 ` Al Viro
     [not found]   ` <20130912193328.GP13318-3bDd1+5oDREiFSDQTTA3OLVCufUGDwFn@public.gmane.org>
2013-09-29 11:54     ` Christoph Hellwig
     [not found]       ` <20130929115454.GA3953-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2013-10-02 14:25         ` J. Bruce Fields
     [not found]           ` <20131002142527.GD14808-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2013-10-02 15:43             ` J. Bruce Fields
     [not found]               ` <20131002154320.GE14808-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2013-10-02 16:04                 ` Christoph Hellwig
2013-10-02 18:14                   ` J. Bruce Fields
2013-10-02 16:05             ` Christoph Hellwig
     [not found]               ` <20131002160527.GB23875-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2013-10-02 17:53                 ` J. Bruce Fields
     [not found]                   ` <20131002175328.GF14808-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2013-10-02 17:57                     ` Christoph Hellwig
2013-10-02 21:07                       ` J. Bruce Fields
     [not found]                         ` <20131002210736.GA20598-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2013-10-02 21:28                           ` [PATCH 1/2] vfs: split out vfs_getattr_nosec J. Bruce Fields
2013-10-02 21:28                             ` [PATCH 2/2] exportfs: fix 32-bit nfsd handling of 64-bit inode numbers J. Bruce Fields
     [not found]                               ` <1380749295-20854-2-git-send-email-bfields-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2013-10-04 22:12                                 ` J. Bruce Fields
     [not found]                                   ` <20131004221216.GC18051-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2013-10-04 22:15                                     ` J. Bruce Fields
2013-10-08 21:56                                       ` J. Bruce Fields
2013-10-09  0:16                                         ` Dave Chinner
2013-10-09 14:53                                           ` J. Bruce Fields
2013-10-10 22:28                                             ` Dave Chinner
2013-10-11 21:53                                               ` J. Bruce Fields
2013-10-13 22:52                                                 ` Dave Chinner
2013-10-02 18:47                   ` why is i_ino unsigned long, anyway? Sage Weil
     [not found]                     ` <alpine.DEB.2.00.1310021130280.7765-vIokxiIdD2AQNTJnQDzGJqxOck334EZe@public.gmane.org>
2013-10-02 19:00                       ` J. Bruce Fields
     [not found]                         ` <20131002190034.GH14808-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>
2013-10-02 19:04                           ` Sage Weil

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).