[Bugs] [Bug 1223890] New: readdirp return 64bits inodes even if enable-ino32 is set
bugzilla at redhat.com
bugzilla at redhat.com
Thu May 21 15:52:38 UTC 2015
https://bugzilla.redhat.com/show_bug.cgi?id=1223890
Bug ID: 1223890
Summary: readdirp return 64bits inodes even if enable-ino32 is
set
Product: GlusterFS
Version: 3.7.0
Component: fuse
Keywords: Patch, Triaged
Severity: high
Assignee: ndevos at redhat.com
Reporter: ndevos at redhat.com
CC: bugs at gluster.org, gluster-bugs at redhat.com
Depends On: 1223889
Blocks: 1219955 (glusterfs-3.7.1)
+++ This bug was initially created as a clone of Bug #1223889 +++
Description of problem:
No issue using nfs only with fuse.
For 32bits applications on 64bits systems, ino32 is mandadory but the readdirp
optimisation still return 64 bits inodes when getdent syscall is triggerd.
Version-Release number of selected component (if applicable):
How reproducible:
Always
Steps to Reproduce:
1. Have a 32 bits application listing directories on a 64 bits system
2. Run it
3. Cry
Actual results:
open("/usr/global/lib/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC)
= 5
getdents(5, 0x9b27308, 32768) = -1 EOVERFLOW (Value too large for
defined data type)
Expected results:
open("/usr/global/lib/", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC)
= 5
getdents(5, /* 1 entries */, 32768) = 88
Additional info:
use use-readdirp=off when mounting the volume as a workaround but impact
performaces.
--- Additional comment from Niels de Vos on 2015-05-20 22:48:16 CEST ---
Compile tested only, needs real functional test and maybe a test-case too.
This bug needs to get cloned for the mainline version and the patch needs
review+merging in the master branch before it can get included in 3.5.
--- Additional comment from Cyril Peponnet on 2015-05-21 01:22:27 CEST ---
I gave a try with RPMs generated through
http://koji.fedoraproject.org/koji/taskinfo?taskID=9810286
Seems to work fine with enable-ino32 to mount options and use 32bit binary to
call getdents syscall.
Thanks !
For the record to test it you can compile:
/*
* * List directories using getdents() because ls, find and Python libraries
* * use readdir() which is slower (but uses getdents() underneath.
* *
* * Compile with
* * ]$ gcc getdents.c -o getdents
* */
#define _GNU_SOURCE
#include <dirent.h> /* Defines DT_* constants */
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
struct linux_dirent {
long d_ino;
off_t d_off;
unsigned short d_reclen;
char d_name[];
};
#define BUF_SIZE 1024*1024*5
int
main(int argc, char *argv[])
{
int fd, nread;
char buf[BUF_SIZE];
struct
with gcc -m32 getdents getdents.c
And run it like ./getdents /path/
Before the patch:
strace -e getdents ./getdents /mnt/test/
[ Process PID=15906 runs in 32 bit mode. ]
getdents(3, /* 1 entries */, 5242880) = 16
getdents(3, 0xff8f65bf, 5242880) = -1 EOVERFLOW (Value too large for
defined data type)
getdents: Value too large for defined data type
+++ exited with 1 +++
Referenced Bugs:
https://bugzilla.redhat.com/show_bug.cgi?id=1219955
[Bug 1219955] GlusterFS 3.7.1 tracker
https://bugzilla.redhat.com/show_bug.cgi?id=1223889
[Bug 1223889] readdirp return 64bits inodes even if enable-ino32 is set
--
You are receiving this mail because:
You are on the CC list for the bug.
Unsubscribe from this bug https://bugzilla.redhat.com/token.cgi?t=ZFJPQqFZbO&a=cc_unsubscribe
More information about the Bugs
mailing list