Skip to content

Commit

Permalink
orangefs: skip forward to the next directory entry if seek is short
Browse files Browse the repository at this point in the history
If userspace seeks to a position in the stream which is not correct, it
would have returned EIO because the data in the buffer at that offset
would be incorrect.  This and the userspace daemon returning a corrupt
directory are indistinguishable.

Now if the data does not look right, skip forward to the next chunk and
try again.  The motivation is that if the directory changes, an
application may seek to a position that was valid and no longer is valid.

It is not yet possible for a directory to change.

Signed-off-by: Martin Brandenburg <[email protected]>
Signed-off-by: Mike Marshall <[email protected]>
  • Loading branch information
Martin Brandenburg authored and hubcapsc committed May 4, 2017
1 parent 907bfcd commit bf15ba7
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions fs/orangefs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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),
Expand All @@ -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;
}
Expand Down

0 comments on commit bf15ba7

Please sign in to comment.