|
@@ -511,8 +511,12 @@ void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *d,
|
|
memcpy(d->filename[bit_pos], name->name, name->len);
|
|
memcpy(d->filename[bit_pos], name->name, name->len);
|
|
de->ino = cpu_to_le32(ino);
|
|
de->ino = cpu_to_le32(ino);
|
|
set_de_type(de, mode);
|
|
set_de_type(de, mode);
|
|
- for (i = 0; i < slots; i++)
|
|
|
|
|
|
+ for (i = 0; i < slots; i++) {
|
|
test_and_set_bit_le(bit_pos + i, (void *)d->bitmap);
|
|
test_and_set_bit_le(bit_pos + i, (void *)d->bitmap);
|
|
|
|
+ /* avoid wrong garbage data for readdir */
|
|
|
|
+ if (i)
|
|
|
|
+ (de + i)->name_len = 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -792,6 +796,12 @@ bool f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d,
|
|
break;
|
|
break;
|
|
|
|
|
|
de = &d->dentry[bit_pos];
|
|
de = &d->dentry[bit_pos];
|
|
|
|
+ if (de->name_len == 0) {
|
|
|
|
+ bit_pos++;
|
|
|
|
+ ctx->pos = start_pos + bit_pos;
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
if (de->file_type < F2FS_FT_MAX)
|
|
if (de->file_type < F2FS_FT_MAX)
|
|
d_type = f2fs_filetype_table[de->file_type];
|
|
d_type = f2fs_filetype_table[de->file_type];
|
|
else
|
|
else
|