svn commit: r332005 - user/pho/stress2/misc

Peter Holm pho at FreeBSD.org
Wed Apr 4 11:05:36 UTC 2018


Author: pho
Date: Wed Apr  4 11:05:35 2018
New Revision: 332005
URL: https://svnweb.freebsd.org/changeset/base/332005

Log:
  Added a regression test for seekdir/telldir.
  
  Sponsored by:	Dell EMC Isilon

Added:
  user/pho/stress2/misc/seekdir.sh   (contents, props changed)

Added: user/pho/stress2/misc/seekdir.sh
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ user/pho/stress2/misc/seekdir.sh	Wed Apr  4 11:05:35 2018	(r332005)
@@ -0,0 +1,160 @@
+#!/bin/sh
+
+# A regression test for seekdir/telldir
+# submitted by julian at freebsd.org
+# https://reviews.freebsd.org/D2410.
+# Fixed by r282485
+
+# $FreeBSD$
+
+. ../default.cfg
+
+odir=`pwd`
+cd /tmp
+sed '1,/^EOF/d' < $odir/$0 > seekdir.c
+rm -f /tmp/seekdir
+mycc -o seekdir -O2 seekdir.c || exit 1
+rm -f seekdir.c
+cd $odir
+
+mount | grep -q "$mntpoint " && umount -f $mntpoint
+mount -o size=1g -t tmpfs tmpfs $mntpoint
+
+cd $mntpoint
+mkdir test2
+/tmp/seekdir > /dev/null
+[ `echo $mntpoint/test2/* | wc -w` -eq 1 ] ||
+    { echo FAIL; status=1; }
+cd $odir
+
+while mount | grep $mntpoint | grep -q /dev/md; do
+	umount $mntpoint || sleep 1
+done
+rm -f /tmp/seekdir
+exit $status
+EOF
+#include <stdio.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sysexits.h>
+#include <err.h>
+
+#define CHUNKSIZE 5
+#define TOTALFILES 40
+
+static void
+SeekDir(DIR *dirp, long loc)
+{
+    printf("Seeking back to location %ld\n", loc);
+    seekdir(dirp, loc);
+}
+
+static long
+TellDir(DIR *dirp)
+{
+    long loc;
+
+    loc = telldir(dirp);
+    printf("telldir assigned location %ld\n", loc);
+    return (loc);
+}
+
+int
+main(int argc, char *argv[])
+{
+    DIR            *dirp;
+    int        i;
+    int        j;
+    long        offset = 0, prev_offset = 0;
+    char           *files[100];
+    char        filename[100];
+    int        fd;
+    struct dirent  *dp = NULL;
+
+    if (chdir("./test2") != 0) {
+        err(EX_OSERR, "chdir");
+    }
+
+    /*****************************************************/
+    /* Put a set of sample files in the target directory */
+    /*****************************************************/
+
+    for (i=1; i < TOTALFILES ; i++)
+    {
+        sprintf(filename, "file-%d", i);
+        fd = open(filename, O_CREAT, 0666);
+        if (fd == -1) {
+            err(EX_OSERR, "open");
+        }
+        close(fd);
+    }
+    dirp = opendir(".");
+    offset = TellDir(dirp);
+    for (i = 0; i < 20; i++)
+        files[i] = malloc(20);
+
+    /*******************************************************/
+    /* enumerate and delete small sets of files, one group */
+    /* at a time.                                          */
+    /*******************************************************/
+    do {
+
+        /*****************************************/
+        /* Read in up to CHUNKSIZE file names    */
+        /* i will be the number of files we hold */
+        /*****************************************/
+        for (i = 0; i < CHUNKSIZE; i++) {
+            if ((dp = readdir(dirp)) != NULL) {
+                strcpy(files[i], dp->d_name);
+
+                printf("readdir (%ld) returned file %s\n",
+                    offset, files[i]);
+
+                prev_offset = offset;
+                offset = TellDir(dirp);
+
+            } else {
+                printf("readdir returned null\n");
+                break;
+            }
+        }
+
+
+/****************************************************************/
+        /* Simuate the last entry not fitting into our (samba's) buffer */
+        /* If we read someting in on the last slot, push it back        */
+        /* Pretend it didn't fit. This is approximately what SAMBA does.*/
+/****************************************************************/
+        if (dp != NULL) {
+            /* Step back */
+            SeekDir(dirp, prev_offset);
+            offset = TellDir(dirp);
+            i--;
+            printf("file %s returned\n", files[i]);
+        }
+
+        /*****************************************/
+        /* i is the number of names we have left.*/
+        /*  Delete them.                         */
+        /*****************************************/
+        for (j = 0; j < i; j++) {
+            if (*files[j] == '.') {
+                printf ("skipping %s\n", files[j]);
+            } else {
+                printf("Unlinking file %s\n", files[j]);
+                if (unlink(files[j]) != 0) {
+                    err(EX_OSERR, "unlink");
+                }
+            }
+        }
+    } while (dp != NULL);
+
+    closedir(dirp);
+    //chdir("..");
+
+}


More information about the svn-src-user mailing list