diff options
Diffstat (limited to 'fs/btrfs/inode.c')
| -rw-r--r-- | fs/btrfs/inode.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 5440bab23635..b330e27c2d8b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
| @@ -3796,6 +3796,12 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry) | |||
| 3796 | 3796 | ||
| 3797 | if (location.type == BTRFS_INODE_ITEM_KEY) { | 3797 | if (location.type == BTRFS_INODE_ITEM_KEY) { |
| 3798 | inode = btrfs_iget(dir->i_sb, &location, root); | 3798 | inode = btrfs_iget(dir->i_sb, &location, root); |
| 3799 | if (unlikely(root->clean_orphans) && | ||
| 3800 | !(inode->i_sb->s_flags & MS_RDONLY)) { | ||
| 3801 | down_read(&root->fs_info->cleanup_work_sem); | ||
| 3802 | btrfs_orphan_cleanup(root); | ||
| 3803 | up_read(&root->fs_info->cleanup_work_sem); | ||
| 3804 | } | ||
| 3799 | return inode; | 3805 | return inode; |
| 3800 | } | 3806 | } |
| 3801 | 3807 | ||
| @@ -3995,7 +4001,11 @@ skip: | |||
| 3995 | 4001 | ||
| 3996 | /* Reached end of directory/root. Bump pos past the last item. */ | 4002 | /* Reached end of directory/root. Bump pos past the last item. */ |
| 3997 | if (key_type == BTRFS_DIR_INDEX_KEY) | 4003 | if (key_type == BTRFS_DIR_INDEX_KEY) |
| 3998 | filp->f_pos = INT_LIMIT(off_t); | 4004 | /* |
| 4005 | * 32-bit glibc will use getdents64, but then strtol - | ||
| 4006 | * so the last number we can serve is this. | ||
| 4007 | */ | ||
| 4008 | filp->f_pos = 0x7fffffff; | ||
| 3999 | else | 4009 | else |
| 4000 | filp->f_pos++; | 4010 | filp->f_pos++; |
| 4001 | nopos: | 4011 | nopos: |
