|
@@ -610,9 +610,9 @@ parse_record:
|
|
|
int status = fat_parse_long(inode, &cpos, &bh, &de,
|
|
|
&unicode, &nr_slots);
|
|
|
if (status < 0) {
|
|
|
- ctx->pos = cpos;
|
|
|
+ bh = NULL;
|
|
|
ret = status;
|
|
|
- goto out;
|
|
|
+ goto end_of_dir;
|
|
|
} else if (status == PARSE_INVALID)
|
|
|
goto record_end;
|
|
|
else if (status == PARSE_NOT_LONGNAME)
|
|
@@ -654,8 +654,9 @@ parse_record:
|
|
|
fill_len = short_len;
|
|
|
|
|
|
start_filldir:
|
|
|
- if (!fake_offset)
|
|
|
- ctx->pos = cpos - (nr_slots + 1) * sizeof(struct msdos_dir_entry);
|
|
|
+ ctx->pos = cpos - (nr_slots + 1) * sizeof(struct msdos_dir_entry);
|
|
|
+ if (fake_offset && ctx->pos < 2)
|
|
|
+ ctx->pos = 2;
|
|
|
|
|
|
if (!memcmp(de->name, MSDOS_DOT, MSDOS_NAME)) {
|
|
|
if (!dir_emit_dot(file, ctx))
|
|
@@ -681,14 +682,19 @@ record_end:
|
|
|
fake_offset = 0;
|
|
|
ctx->pos = cpos;
|
|
|
goto get_new;
|
|
|
+
|
|
|
end_of_dir:
|
|
|
- ctx->pos = cpos;
|
|
|
+ if (fake_offset && cpos < 2)
|
|
|
+ ctx->pos = 2;
|
|
|
+ else
|
|
|
+ ctx->pos = cpos;
|
|
|
fill_failed:
|
|
|
brelse(bh);
|
|
|
if (unicode)
|
|
|
__putname(unicode);
|
|
|
out:
|
|
|
mutex_unlock(&sbi->s_lock);
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|