aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2009-03-17 13:02:35 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-03-17 13:02:35 -0400
commitee568b25ee9e160b32d1aef73d8b2ee9c05d34db (patch)
treea29f070d82e6f787570213161c4c46c16ca6ef8a /fs/proc
parent30390880debce4a68fd23e87a787f27609e4bf4a (diff)
Avoid 64-bit "switch()" statements on 32-bit architectures
Commit ee6f779b9e0851e2f7da292a9f58e0095edf615a ("filp->f_pos not correctly updated in proc_task_readdir") changed the proc code to use filp->f_pos directly, rather than through a temporary variable. In the process, that caused the operations to be done on the full 64 bits, even though the offset is never that big. That's all fine and dandy per se, but for some unfathomable reason gcc generates absolutely horrid code when using 64-bit values in switch() statements. To the point of actually calling out to gcc helper functions like __cmpdi2 rather than just doing the trivial comparisons directly the way gcc does for normal compares. At which point we get link failures, because we really don't want to support that kind of crazy code. Fix this by just casting the f_pos value to "unsigned long", which is plenty big enough for /proc, and avoids the gcc code generation issue. Reported-by: Alexey Dobriyan <adobriyan@gmail.com> Cc: Zhang Le <r0bertz@gentoo.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/proc')
-rw-r--r--fs/proc/base.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c
index cc6ea2329e71..beaa0ce3b82e 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -3082,7 +3082,7 @@ static int proc_task_readdir(struct file * filp, void * dirent, filldir_t filldi
3082 goto out_no_task; 3082 goto out_no_task;
3083 retval = 0; 3083 retval = 0;
3084 3084
3085 switch (filp->f_pos) { 3085 switch ((unsigned long)filp->f_pos) {
3086 case 0: 3086 case 0:
3087 ino = inode->i_ino; 3087 ino = inode->i_ino;
3088 if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) < 0) 3088 if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) < 0)