linux/fs/btrfs
Jeff Mahoney d2fbb2b589 btrfs: increment ctx->pos for every emitted or skipped dirent in readdir
If we process the last item in the leaf and hit an I/O error while
reading the next leaf, we return -EIO without having adjusted the
position.  Since we have emitted dirents, getdents() will return
the byte count to the user instead of the error.  Subsequent callers
will emit the last successful dirent again, and return -EIO again,
with the same result.  Callers loop forever.

Instead, if we always increment ctx->pos after emitting or skipping
the dirent, we'll be sure that we won't hit the same one again.  When
we go to process the next leaf, we won't have emitted any dirents
and the -EIO will be returned to the user properly.  We also don't
need to track if we've emitted a dirent already or if we've changed
the position yet.

Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
2016-11-30 13:45:19 +01:00
..
tests btrfs: remove constant parameter to memset_extent_buffer and rename it 2016-11-30 13:45:17 +01:00
acl.c posix_acl: Clear SGID bit when setting file permissions 2016-09-22 10:55:32 +02:00
async-thread.c btrfs: plumb fs_info into btrfs_work 2016-07-26 13:53:15 +02:00
async-thread.h btrfs: plumb fs_info into btrfs_work 2016-07-26 13:53:15 +02:00
backref.c btrfs: convert pr_* to btrfs_* where possible 2016-09-26 19:37:04 +02:00
backref.h
btrfs_inode.h Btrfs: add a flags field to btrfs_fs_info 2016-09-26 17:59:49 +02:00
check-integrity.c btrfs: don't abuse REQ_OP_* flags for btrfs_map_block 2016-11-29 14:10:38 +01:00
check-integrity.h
compression.c btrfs: change btrfs_csum_final result param type to u8 2016-11-30 13:45:18 +01:00
compression.h
ctree.c btrfs: add optimized version of eb to eb copy 2016-11-30 13:45:17 +01:00
ctree.h btrfs: store and load values of stripes_min/stripes_max in balance status item 2016-11-30 13:45:18 +01:00
dedupe.h btrfs: expand cow_file_range() to support in-band dedup and subpage-blocksize 2016-07-26 13:52:25 +02:00
delayed-inode.c btrfs: increment ctx->pos for every emitted or skipped dirent in readdir 2016-11-30 13:45:19 +01:00
delayed-inode.h btrfs: increment ctx->pos for every emitted or skipped dirent in readdir 2016-11-30 13:45:19 +01:00
delayed-ref.c btrfs: convert pr_* to btrfs_* where possible 2016-09-26 19:37:04 +02:00
delayed-ref.h Btrfs: remove unused function btrfs_add_delayed_qgroup_reserve() 2016-08-03 11:02:51 +01:00
dev-replace.c btrfs: convert pr_* to btrfs_* where possible 2016-09-26 19:37:04 +02:00
dev-replace.h
dir-item.c btrfs: unsplit printed strings 2016-09-26 18:08:44 +02:00
disk-io.c btrfs: change btrfs_csum_final result param type to u8 2016-11-30 13:45:18 +01:00
disk-io.h btrfs: change btrfs_csum_final result param type to u8 2016-11-30 13:45:18 +01:00
export.c
export.h
extent_io.c btrfs: add optimized version of eb to eb copy 2016-11-30 13:45:17 +01:00
extent_io.h btrfs: add optimized version of eb to eb copy 2016-11-30 13:45:17 +01:00
extent_map.c btrfs: Fix slab accounting flags 2016-07-26 13:52:25 +02:00
extent_map.h
extent-tree.c btrfs: remove constant parameter to memset_extent_buffer and rename it 2016-11-30 13:45:17 +01:00
file-item.c btrfs: remove constant parameter to memset_extent_buffer and rename it 2016-11-30 13:45:17 +01:00
file.c btrfs: remove unused headers, statfs.h 2016-11-30 13:45:14 +01:00
free-space-cache.c btrfs: remove redundant check of btrfs_iget return value 2016-11-30 13:45:18 +01:00
free-space-cache.h btrfs: convert pr_* to btrfs_* where possible 2016-09-26 19:37:04 +02:00
free-space-tree.c Merge branch 'fst-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux into for-linus-4.9 2016-10-12 13:16:00 -07:00
free-space-tree.h
hash.c
hash.h
inode-item.c
inode-map.c btrfs: convert pr_* to btrfs_* where possible 2016-09-26 19:37:04 +02:00
inode-map.h
inode.c btrfs: increment ctx->pos for every emitted or skipped dirent in readdir 2016-11-30 13:45:19 +01:00
ioctl.c btrfs: return early from failed memory allocations in ioctl handlers 2016-11-30 13:45:18 +01:00
Kconfig
locking.c
locking.h
lzo.c btrfs: convert printk(KERN_* to use pr_* calls 2016-09-26 18:08:44 +02:00
Makefile
math.h
ordered-data.c btrfs: unsplit printed strings 2016-09-26 18:08:44 +02:00
ordered-data.h
orphan.c
print-tree.c btrfs: convert printk(KERN_* to use pr_* calls 2016-09-26 18:08:44 +02:00
print-tree.h
props.c btrfs: simpilify btrfs_subvol_inherit_props 2016-07-26 13:54:22 +02:00
props.h
qgroup.c btrfs: rename helper macros for qgroup and aux data casts 2016-11-30 13:45:15 +01:00
qgroup.h btrfs: qgroup: Refactor btrfs_qgroup_insert_dirty_extent() 2016-08-25 03:58:21 -07:00
raid56.c Btrfs: remove BUG() in raid56 2016-09-26 17:59:49 +02:00
raid56.h
rcu-string.h
reada.c btrfs: reada, remove pointless BUG_ON check for fs_info 2016-11-30 13:45:16 +01:00
relocation.c btrfs: remove constant parameter to memset_extent_buffer and rename it 2016-11-30 13:45:17 +01:00
root-tree.c btrfs: unsplit printed strings 2016-09-26 18:08:44 +02:00
scrub.c btrfs: don't abuse REQ_OP_* flags for btrfs_map_block 2016-11-29 14:10:38 +01:00
send.c Merge branch 'for-linus-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs 2016-10-28 10:07:35 -07:00
send.h
struct-funcs.c
super.c btrfs: remove stale comment from btrfs_statfs 2016-11-30 13:45:15 +01:00
sysfs.c btrfs: convert printk(KERN_* to use pr_* calls 2016-09-26 18:08:44 +02:00
sysfs.h
transaction.c Merge branch 'for-linus-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs 2016-10-11 11:23:06 -07:00
transaction.h btrfs: convert pr_* to btrfs_* where possible 2016-09-26 19:37:04 +02:00
tree-defrag.c
tree-log.c Merge branch 'for-linus-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs 2016-10-28 10:07:35 -07:00
tree-log.h Btrfs: fix lockdep warning on deadlock against an inode's log mutex 2016-08-25 03:58:32 -07:00
ulist.c
ulist.h
uuid-tree.c btrfs: unsplit printed strings 2016-09-26 18:08:44 +02:00
volumes.c btrfs: remove constant parameter to memset_extent_buffer and rename it 2016-11-30 13:45:17 +01:00
volumes.h btrfs: don't abuse REQ_OP_* flags for btrfs_map_block 2016-11-29 14:10:38 +01:00
xattr.c fs: Replace current_fs_time() with current_time() 2016-09-27 21:06:22 -04:00
xattr.h
zlib.c btrfs: Call kunmap if zlib_inflateInit2 fails 2016-11-30 13:45:18 +01:00