aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs/orangefs/dir.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/fs/orangefs/dir.c b/fs/orangefs/dir.c
index d5ec9ba82cef..4cfb3e5b597e 100644
--- a/fs/orangefs/dir.c
+++ b/fs/orangefs/dir.c
@@ -194,11 +194,18 @@ static int fill_from_part(struct orangefs_dir_part *part,
/* The file offset from userspace is too large. */
if (i > part->len)
- return -EIO;
+ return 1;
+
+ /*
+ * If the seek pointer is positioned just before an entry it
+ * should find the next entry.
+ */
+ if (i % 8)
+ i = i + (8 - i%8)%8;
while (i < part->len) {
if (part->len < i + sizeof *len)
- return -EIO;
+ break;
len = (void *)part + offset + i;
/*
* len is the size of the string itself. padlen is the
@@ -207,10 +214,10 @@ static int fill_from_part(struct orangefs_dir_part *part,
padlen = (sizeof *len + *len + 1) +
(8 - (sizeof *len + *len + 1)%8)%8;
if (part->len < i + padlen + sizeof *khandle)
- return -EIO;
+ goto next;
s = (void *)part + offset + i + sizeof *len;
if (s[*len] != 0)
- return -EIO;
+ goto next;
khandle = (void *)part + offset + i + padlen;
if (!dir_emit(ctx, s, *len,
orangefs_khandle_to_ino(khandle),
@@ -220,6 +227,9 @@ static int fill_from_part(struct orangefs_dir_part *part,
i = i + (8 - i%8)%8;
BUG_ON(i > part->len);
ctx->pos = (ctx->pos & PART_MASK) | i;
+ continue;
+next:
+ i += 8;
}
return 1;
}