NFSv4 client's BUG?

Ellard, Daniel Daniel.Ellard at netapp.com
Tue Jul 1 09:08:51 EDT 2008


You're never closing filedes[i], and eventually you're running out of
file descriptors.

Add 

	close(filedes[i]);

After

	write(filedes[i], "...

-Dan 

-----Original Message-----
From: Wei Yongjun [mailto:yjwei at cn.fujitsu.com] 
Sent: Tuesday, July 01, 2008 6:08 AM
To: nfsv4 at linux-nfs.org
Subject: NFSv4 client's BUG?

I have the following test program, but when it run, fopen may return
EIO, is this a bug of NFSv4 client?
NFSv4 client is 2.6.26-rc6.

-------------------------tstfopen.c-------------------------------------

#include <stdio.h>
#include <error.h>
#include <stdlib.h>
#include <string.h>

char * fname;
#define TEMPLATE "HighInodeXXXXXX"
int main(int argc, char *argv[]) {
        FILE *fp;
        char filename[4096];
        int filedes[4096];
        int i;

        if (argc != 2) {
                printf("Usage: %s filename\n", argv[0]);
                exit(1);
        }

        fname = argv[1];

        for (i = 0; i < 4096; i++) {
                if (i % 100 == 0)
                        printf("i = %d\n", i);

                strcpy(filename, TEMPLATE);
                if ((filedes[i] = mkstemp(filename)) == -1) {
                        perror("mkstemp");
                        exit(0);
                }

                if ((fp = fopen(fname, "w+")) == NULL) {
                        perror("fopen");
                        exit(0);
                }

                if (fprintf(fp, "this is a test %d\n", i) == 0) {
                        perror("fprintf");
                        exit(0);
                }

                fclose(fp);
                write(filedes[i], "abcdef!!!\n",23);
        }

        return 0;
}


---------------------------tstmain.sh------------------------------
umount /mnt
killall /root/tstfopen

ulimit -n 5000

mount -t nfs4 NFS4SERVER:/ /mnt

cd /mnt

/root/tstfopen debug_file &

CNT=1
while [ $CNT -lt 1000 ];
do
        cat debug_file
        TSTR=`cat debug_file`
        if [ "$TSTR" = "$LTSTR" ]; then
                break
        fi
        LTSTR=$TSTR
        sleep 1
        CNT=$((CNT+1))
done

rm -rf /mnt/*

cd -

umount /mnt
-----------------------------------end----------------------------


Usage:
    #cd /root
    #gcc tstfopen.c -o tstfopen
    #sh tstmain.sh

The output may be like this:
i = 0
this is a test 0
this is a test 63
...
i = 1400
this is a test 1410
this is a test 1415
this is a test 1438
fopen: Input/output error

_______________________________________________
NFSv4 mailing list
NFSv4 at linux-nfs.org
http://linux-nfs.org/cgi-bin/mailman/listinfo/nfsv4


More information about the NFSv4 mailing list