spd_readdir progress report/questions
Ross Boylan
RossBoylan at stanfordalumni.org
Sun May 18 19:15:22 UTC 2008
I've been trying to use Ted's spd_readdir.c to accelerate extremely slow
directory traversal on backup. For some reason, using it seems to stop
the backup entirely. I'm still investigating; I suspect it may be an
issue with use LD_PRELOAD with a program running as root (but not
setuid) when the library is not root.
1. There was a missing #ifdef in the original code. I have revised it
to be
#ifdef DEBUG
if (do_debug) {
int i;
printf("After sorting.\n");
for (i=0; i<dirstruct->num; i++)
printf("%lu %s\n",
(unsigned long) dirstruct->dp[i].d_ino, dirstruct->dp[i].d_name);
}
#endif
I commented out the #define DEBUG statement before building the module
I'm trying to load. That was how I discovered the need to the guards
shown above.
2. I concocted the following Makefile:
SDIR = /usr/local/src/kernel/ext3-patch
#CFLAGS=-O0 -g
LDFLAGS=-ldl
go2: tester libsd_readdir.so.1
LD_LIBRARY_PATH=./ LD_PRELOAD=libsd_readdir.so.1 ./tester Makefile
tester: tester.o
spd_readdir.o: spd_readdir.c
tester.o: tester.c
foo: foo.o
foo.o: foo.c
go: libsd_readdir.so.1
LD_LIBRARY_PATH=./ LD_PRELOAD=libsd_readdir.so.1 tar cf /dev/null
$(SDIR)
libsd_readdir.so.1: spd_readdir.c
$(CC) -shared -fpic -o $@ $^ ${LDFLAGS}
clean:
rm tester spd_readdir.o libsd_readdir.so.1
Peculiarly, when I didn't use the LDFLAGS argument for the
libsd_readdir.so.1 target, I seemed to be able to start the program, but
when I tried to stop it I got
# LD_LIBRARY_PATH=/usr/local/src/kernel/ext3-patch \
LD_PRELOAD=libsd_readdir.so.1 start-stop-daemon --stop -v \
--exec /usr/sbin/bacula-fd -- -c /etc/bacula/bacula-fd.conf \
start-stop-daemon: symbol lookup
error: /usr/local/src/kernel/ext3-patch/libsd_readdir.so.1: undefined
symbol: dlsym
tester is a little test program I wrote to verify I was picking up the
new code. The test with tar (target go:) didn't show any acceleration,
but apparently tar doesn't use the right calls to benefit for the
library.
3. Originally I was concerned that environment variables set on the
command line for start-stop-daemon would not effect the executable.
However, it seems to work. Using a non-root test program I was able to
echo the variables from the test program started via start-stop-daemon.
Also, the fact that the deamon (bacula-fd) stops working properly shows
the outer variable setting is having some effect.
4. start-stop-daemon is part of Debian's infrastructure for launching
deamon processes. bacula-fd is part of the backup system:
$ ls -l /usr/sbin/bacula-fd
-rwxr-xr-x 1 root root 347212 2008-04-15 14:19 /usr/sbin/bacula-fd
I believe this means it is not setuid; the docs say setuid programs have
a restricted interpretation of LD_PRELOAD.
The library I am loading is
$ ls -l /usr/local/src/kernel/ext3-patch/libsd_readdir*
-rwxr-xr-x 1 ross staff 9083 2008-05-17
23:56 /usr/local/src/kernel/ext3-patch/libsd_readdir.so.1
5. I have the source for bacula-fd. However, I assume that if I simply
try to add spd_readdir.c to the build I will get multiply defined symbol
conflicts with the calls it shadows.
If anyone has any suggestions for how to make it work, or to diagnose
the problems, I'd love to hear them.
Thanks.
Ross Boylan
More information about the Ext3-users
mailing list