Merge branch 'for-linus-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs

Pull btrfs updates from Chris Mason:
"Some fixes that we've collected from the list.

We still have one more pending to nail down a regression in lzo
compression, but I wanted to get this batch out the door"

* 'for-linus-4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
Btrfs: remove ->{get, set}_acl() from btrfs_dir_ro_inode_operations
Btrfs: disable xattr operations on subvolume directories
Btrfs: remove old tree_root case in btrfs_read_locked_inode()
Btrfs: fix truncate down when no_holes feature is enabled
Btrfs: Fix deadlock between direct IO and fast fsync
btrfs: fix false enospc error when truncating heavily reflinked file

+17 -9
+17 -9
fs/btrfs/inode.c
··· 3835 3835 break; 3836 3836 case S_IFDIR: 3837 3837 inode->i_fop = &btrfs_dir_file_operations; 3838 - if (root == fs_info->tree_root) 3839 - inode->i_op = &btrfs_dir_ro_inode_operations; 3840 - else 3841 - inode->i_op = &btrfs_dir_inode_operations; 3838 + inode->i_op = &btrfs_dir_inode_operations; 3842 3839 break; 3843 3840 case S_IFLNK: 3844 3841 inode->i_op = &btrfs_symlink_inode_operations; ··· 4502 4505 if (found_type > min_type) { 4503 4506 del_item = 1; 4504 4507 } else { 4505 - if (item_end < new_size) 4508 + if (item_end < new_size) { 4509 + /* 4510 + * With NO_HOLES mode, for the following mapping 4511 + * 4512 + * [0-4k][hole][8k-12k] 4513 + * 4514 + * if truncating isize down to 6k, it ends up 4515 + * isize being 8k. 4516 + */ 4517 + if (btrfs_fs_incompat(root->fs_info, NO_HOLES)) 4518 + last_size = new_size; 4506 4519 break; 4520 + } 4507 4521 if (found_key.offset >= new_size) 4508 4522 del_item = 1; 4509 4523 else ··· 5718 5710 5719 5711 inode->i_ino = BTRFS_EMPTY_SUBVOL_DIR_OBJECTID; 5720 5712 inode->i_op = &btrfs_dir_ro_inode_operations; 5713 + inode->i_opflags &= ~IOP_XATTR; 5721 5714 inode->i_fop = &simple_dir_operations; 5722 5715 inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO; 5723 5716 inode->i_mtime = current_time(inode); ··· 7224 7215 struct extent_map *em = NULL; 7225 7216 int ret; 7226 7217 7227 - down_read(&BTRFS_I(inode)->dio_sem); 7228 7218 if (type != BTRFS_ORDERED_NOCOW) { 7229 7219 em = create_pinned_em(inode, start, len, orig_start, 7230 7220 block_start, block_len, orig_block_len, ··· 7242 7234 em = ERR_PTR(ret); 7243 7235 } 7244 7236 out: 7245 - up_read(&BTRFS_I(inode)->dio_sem); 7246 7237 7247 7238 return em; 7248 7239 } ··· 8699 8692 dio_data.unsubmitted_oe_range_start = (u64)offset; 8700 8693 dio_data.unsubmitted_oe_range_end = (u64)offset; 8701 8694 current->journal_info = &dio_data; 8695 + down_read(&BTRFS_I(inode)->dio_sem); 8702 8696 } else if (test_bit(BTRFS_INODE_READDIO_NEED_LOCK, 8703 8697 &BTRFS_I(inode)->runtime_flags)) { 8704 8698 inode_dio_end(inode); ··· 8712 8704 iter, btrfs_get_blocks_direct, NULL, 8713 8705 btrfs_submit_direct, flags); 8714 8706 if (iov_iter_rw(iter) == WRITE) { 8707 + up_read(&BTRFS_I(inode)->dio_sem); 8715 8708 current->journal_info = NULL; 8716 8709 if (ret < 0 && ret != -EIOCBQUEUED) { 8717 8710 if (dio_data.reserve) ··· 9221 9212 break; 9222 9213 } 9223 9214 9215 + btrfs_block_rsv_release(fs_info, rsv, -1); 9224 9216 ret = btrfs_block_rsv_migrate(&fs_info->trans_block_rsv, 9225 9217 rsv, min_size, 0); 9226 9218 BUG_ON(ret); /* shouldn't happen */ ··· 10589 10579 static const struct inode_operations btrfs_dir_ro_inode_operations = { 10590 10580 .lookup = btrfs_lookup, 10591 10581 .permission = btrfs_permission, 10592 - .get_acl = btrfs_get_acl, 10593 - .set_acl = btrfs_set_acl, 10594 10582 .update_time = btrfs_update_time, 10595 10583 }; 10596 10584