diff options
Diffstat (limited to 'kernel/fs/fat')
-rw-r--r-- | kernel/fs/fat/dir.c | 16 | ||||
-rw-r--r-- | kernel/fs/fat/file.c | 1 | ||||
-rw-r--r-- | kernel/fs/fat/inode.c | 1 |
3 files changed, 13 insertions, 5 deletions
diff --git a/kernel/fs/fat/dir.c b/kernel/fs/fat/dir.c index 4afc4d9d2..8b2127ffb 100644 --- a/kernel/fs/fat/dir.c +++ b/kernel/fs/fat/dir.c @@ -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; } diff --git a/kernel/fs/fat/file.c b/kernel/fs/fat/file.c index 442d50a0e..a08f10399 100644 --- a/kernel/fs/fat/file.c +++ b/kernel/fs/fat/file.c @@ -11,6 +11,7 @@ #include <linux/compat.h> #include <linux/mount.h> #include <linux/blkdev.h> +#include <linux/backing-dev.h> #include <linux/fsnotify.h> #include <linux/security.h> #include "fat.h" diff --git a/kernel/fs/fat/inode.c b/kernel/fs/fat/inode.c index c06774658..509411dd3 100644 --- a/kernel/fs/fat/inode.c +++ b/kernel/fs/fat/inode.c @@ -18,6 +18,7 @@ #include <linux/parser.h> #include <linux/uio.h> #include <linux/blkdev.h> +#include <linux/backing-dev.h> #include <asm/unaligned.h> #include "fat.h" |