Merge branch 'for-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2016 03:08:16 +0000 (20:08 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 5 Nov 2016 03:08:16 +0000 (20:08 -0700)
Pull btrfs fixes from Chris Mason:
 "Some fixes that Dave Sterba collected.  We held off on these last week
  because I was focused on the memory corruption testing"

* 'for-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
  btrfs: fix WARNING in btrfs_select_ref_head()
  Btrfs: remove some no-op casts
  btrfs: pass correct args to btrfs_async_run_delayed_refs()
  btrfs: make file clone aware of fatal signals
  btrfs: qgroup: Prevent qgroup->reserved from going subzero
  Btrfs: kill BUG_ON in do_relocation

1  2 
fs/btrfs/inode.c
fs/btrfs/ioctl.c

diff --combined fs/btrfs/inode.c
index 2b790bda79988002403f6fe326dcc5535e9f079d,1f980efbb2e8d653c7544d7fe130b02c5f392547..8e3a5a266917c0fac9da9f41ee080262f3394779
@@@ -4071,7 -4071,7 +4071,7 @@@ err
        inode_inc_iversion(inode);
        inode_inc_iversion(dir);
        inode->i_ctime = dir->i_mtime =
 -              dir->i_ctime = current_fs_time(inode->i_sb);
 +              dir->i_ctime = current_time(inode);
        ret = btrfs_update_inode(trans, root, dir);
  out:
        return ret;
@@@ -4214,7 -4214,7 +4214,7 @@@ int btrfs_unlink_subvol(struct btrfs_tr
  
        btrfs_i_size_write(dir, dir->i_size - name_len * 2);
        inode_inc_iversion(dir);
 -      dir->i_mtime = dir->i_ctime = current_fs_time(dir->i_sb);
 +      dir->i_mtime = dir->i_ctime = current_time(dir);
        ret = btrfs_update_inode_fallback(trans, root, dir);
        if (ret)
                btrfs_abort_transaction(trans, ret);
@@@ -4605,8 -4605,8 +4605,8 @@@ delete
                        BUG_ON(ret);
                        if (btrfs_should_throttle_delayed_refs(trans, root))
                                btrfs_async_run_delayed_refs(root,
-                                                            trans->transid,
-                                       trans->delayed_ref_updates * 2, 0);
+                                       trans->delayed_ref_updates * 2,
+                                       trans->transid, 0);
                        if (be_nice) {
                                if (truncate_space_check(trans, root,
                                                         extent_num_bytes)) {
@@@ -4977,7 -4977,7 +4977,7 @@@ static int btrfs_setsize(struct inode *
                inode_inc_iversion(inode);
                if (!(mask & (ATTR_CTIME | ATTR_MTIME)))
                        inode->i_ctime = inode->i_mtime =
 -                              current_fs_time(inode->i_sb);
 +                              current_time(inode);
        }
  
        if (newsize > oldsize) {
@@@ -5084,7 -5084,7 +5084,7 @@@ static int btrfs_setattr(struct dentry 
        if (btrfs_root_readonly(root))
                return -EROFS;
  
 -      err = inode_change_ok(inode, attr);
 +      err = setattr_prepare(dentry, attr);
        if (err)
                return err;
  
@@@ -5684,7 -5684,7 +5684,7 @@@ static struct inode *new_simple_dir(str
        inode->i_op = &btrfs_dir_ro_inode_operations;
        inode->i_fop = &simple_dir_operations;
        inode->i_mode = S_IFDIR | S_IRUGO | S_IWUSR | S_IXUGO;
 -      inode->i_mtime = current_fs_time(inode->i_sb);
 +      inode->i_mtime = current_time(inode);
        inode->i_atime = inode->i_mtime;
        inode->i_ctime = inode->i_mtime;
        BTRFS_I(inode)->i_otime = inode->i_mtime;
@@@ -6270,7 -6270,7 +6270,7 @@@ static struct inode *btrfs_new_inode(st
        inode_init_owner(inode, dir, mode);
        inode_set_bytes(inode, 0);
  
 -      inode->i_mtime = current_fs_time(inode->i_sb);
 +      inode->i_mtime = current_time(inode);
        inode->i_atime = inode->i_mtime;
        inode->i_ctime = inode->i_mtime;
        BTRFS_I(inode)->i_otime = inode->i_mtime;
@@@ -6384,7 -6384,7 +6384,7 @@@ int btrfs_add_link(struct btrfs_trans_h
                           name_len * 2);
        inode_inc_iversion(parent_inode);
        parent_inode->i_mtime = parent_inode->i_ctime =
 -              current_fs_time(parent_inode->i_sb);
 +              current_time(parent_inode);
        ret = btrfs_update_inode(trans, root, parent_inode);
        if (ret)
                btrfs_abort_transaction(trans, ret);
@@@ -6602,7 -6602,7 +6602,7 @@@ static int btrfs_link(struct dentry *ol
        BTRFS_I(inode)->dir_index = 0ULL;
        inc_nlink(inode);
        inode_inc_iversion(inode);
 -      inode->i_ctime = current_fs_time(inode->i_sb);
 +      inode->i_ctime = current_time(inode);
        ihold(inode);
        set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags);
  
@@@ -8427,7 -8427,7 +8427,7 @@@ static int btrfs_submit_direct_hook(str
        if (!bio)
                return -ENOMEM;
  
 -      bio_set_op_attrs(bio, bio_op(orig_bio), orig_bio->bi_opf);
 +      bio_set_op_attrs(bio, bio_op(orig_bio), bio_flags(orig_bio));
        bio->bi_private = dip;
        bio->bi_end_io = btrfs_end_dio_bio;
        btrfs_io_bio(bio)->logical = file_offset;
@@@ -8465,8 -8465,7 +8465,8 @@@ next_block
                                                  start_sector, GFP_NOFS);
                        if (!bio)
                                goto out_err;
 -                      bio_set_op_attrs(bio, bio_op(orig_bio), orig_bio->bi_opf);
 +                      bio_set_op_attrs(bio, bio_op(orig_bio),
 +                                       bio_flags(orig_bio));
                        bio->bi_private = dip;
                        bio->bi_end_io = btrfs_end_dio_bio;
                        btrfs_io_bio(bio)->logical = file_offset;
@@@ -8634,7 -8633,7 +8634,7 @@@ static ssize_t check_direct_IO(struct b
                goto out;
  
        /* If this is a write we don't need to check anymore */
 -      if (iov_iter_rw(iter) == WRITE)
 +      if (iov_iter_rw(iter) != READ || !iter_is_iovec(iter))
                return 0;
        /*
         * Check to make sure we don't have duplicate iov_base's in this
@@@ -8931,9 -8930,14 +8931,14 @@@ again
         *    So even we call qgroup_free_data(), it won't decrease reserved
         *    space.
         * 2) Not written to disk
-        *    This means the reserved space should be freed here.
+        *    This means the reserved space should be freed here. However,
+        *    if a truncate invalidates the page (by clearing PageDirty)
+        *    and the page is accounted for while allocating extent
+        *    in btrfs_check_data_free_space() we let delayed_ref to
+        *    free the entire extent.
         */
-       btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE);
+       if (PageDirty(page))
+               btrfs_qgroup_free_data(inode, page_start, PAGE_SIZE);
        if (!inode_evicting) {
                clear_extent_bit(tree, page_start, page_end,
                                 EXTENT_LOCKED | EXTENT_DIRTY |
@@@ -9509,7 -9513,7 +9514,7 @@@ static int btrfs_rename_exchange(struc
        struct btrfs_root *dest = BTRFS_I(new_dir)->root;
        struct inode *new_inode = new_dentry->d_inode;
        struct inode *old_inode = old_dentry->d_inode;
 -      struct timespec ctime = CURRENT_TIME;
 +      struct timespec ctime = current_time(old_inode);
        struct dentry *parent;
        u64 old_ino = btrfs_ino(old_inode);
        u64 new_ino = btrfs_ino(new_inode);
@@@ -9877,7 -9881,7 +9882,7 @@@ static int btrfs_rename(struct inode *o
        inode_inc_iversion(old_inode);
        old_dir->i_ctime = old_dir->i_mtime =
        new_dir->i_ctime = new_dir->i_mtime =
 -      old_inode->i_ctime = current_fs_time(old_dir->i_sb);
 +      old_inode->i_ctime = current_time(old_dir);
  
        if (old_dentry->d_parent != new_dentry->d_parent)
                btrfs_record_unlink_dir(trans, old_dir, old_inode, 1);
  
        if (new_inode) {
                inode_inc_iversion(new_inode);
 -              new_inode->i_ctime = current_fs_time(new_inode->i_sb);
 +              new_inode->i_ctime = current_time(new_inode);
                if (unlikely(btrfs_ino(new_inode) ==
                             BTRFS_EMPTY_SUBVOL_DIR_OBJECTID)) {
                        root_objectid = BTRFS_I(new_inode)->location.objectid;
@@@ -10420,7 -10424,7 +10425,7 @@@ next
                *alloc_hint = ins.objectid + ins.offset;
  
                inode_inc_iversion(inode);
 -              inode->i_ctime = current_fs_time(inode->i_sb);
 +              inode->i_ctime = current_time(inode);
                BTRFS_I(inode)->flags |= BTRFS_INODE_PREALLOC;
                if (!(mode & FALLOC_FL_KEEP_SIZE) &&
                    (actual_len > inode->i_size) &&
@@@ -10560,6 -10564,21 +10565,6 @@@ out_inode
  
  }
  
 -/* Inspired by filemap_check_errors() */
 -int btrfs_inode_check_errors(struct inode *inode)
 -{
 -      int ret = 0;
 -
 -      if (test_bit(AS_ENOSPC, &inode->i_mapping->flags) &&
 -          test_and_clear_bit(AS_ENOSPC, &inode->i_mapping->flags))
 -              ret = -ENOSPC;
 -      if (test_bit(AS_EIO, &inode->i_mapping->flags) &&
 -          test_and_clear_bit(AS_EIO, &inode->i_mapping->flags))
 -              ret = -EIO;
 -
 -      return ret;
 -}
 -
  static const struct inode_operations btrfs_dir_inode_operations = {
        .getattr        = btrfs_getattr,
        .lookup         = btrfs_lookup,
        .link           = btrfs_link,
        .mkdir          = btrfs_mkdir,
        .rmdir          = btrfs_rmdir,
 -      .rename2        = btrfs_rename2,
 +      .rename         = btrfs_rename2,
        .symlink        = btrfs_symlink,
        .setattr        = btrfs_setattr,
        .mknod          = btrfs_mknod,
 -      .setxattr       = generic_setxattr,
 -      .getxattr       = generic_getxattr,
        .listxattr      = btrfs_listxattr,
 -      .removexattr    = generic_removexattr,
        .permission     = btrfs_permission,
        .get_acl        = btrfs_get_acl,
        .set_acl        = btrfs_set_acl,
@@@ -10646,7 -10668,10 +10651,7 @@@ static const struct address_space_opera
  static const struct inode_operations btrfs_file_inode_operations = {
        .getattr        = btrfs_getattr,
        .setattr        = btrfs_setattr,
 -      .setxattr       = generic_setxattr,
 -      .getxattr       = generic_getxattr,
        .listxattr      = btrfs_listxattr,
 -      .removexattr    = generic_removexattr,
        .permission     = btrfs_permission,
        .fiemap         = btrfs_fiemap,
        .get_acl        = btrfs_get_acl,
@@@ -10657,7 -10682,10 +10662,7 @@@ static const struct inode_operations bt
        .getattr        = btrfs_getattr,
        .setattr        = btrfs_setattr,
        .permission     = btrfs_permission,
 -      .setxattr       = generic_setxattr,
 -      .getxattr       = generic_getxattr,
        .listxattr      = btrfs_listxattr,
 -      .removexattr    = generic_removexattr,
        .get_acl        = btrfs_get_acl,
        .set_acl        = btrfs_set_acl,
        .update_time    = btrfs_update_time,
@@@ -10668,7 -10696,10 +10673,7 @@@ static const struct inode_operations bt
        .getattr        = btrfs_getattr,
        .setattr        = btrfs_setattr,
        .permission     = btrfs_permission,
 -      .setxattr       = generic_setxattr,
 -      .getxattr       = generic_getxattr,
        .listxattr      = btrfs_listxattr,
 -      .removexattr    = generic_removexattr,
        .update_time    = btrfs_update_time,
  };
  
diff --combined fs/btrfs/ioctl.c
index 18e1aa0f85f5764aa28de59e148a96f49fdacf04,71634570943cf3ed67e4dd5e50da763fb392e7e8..7acbd2cf6192ee8d967236f4b3aeecf1bfc98658
@@@ -349,7 -349,7 +349,7 @@@ static int btrfs_ioctl_setflags(struct 
  
        btrfs_update_iflags(inode);
        inode_inc_iversion(inode);
 -      inode->i_ctime = current_fs_time(inode->i_sb);
 +      inode->i_ctime = current_time(inode);
        ret = btrfs_update_inode(trans, root, inode);
  
        btrfs_end_transaction(trans, root);
@@@ -445,7 -445,7 +445,7 @@@ static noinline int create_subvol(struc
        struct btrfs_root *root = BTRFS_I(dir)->root;
        struct btrfs_root *new_root;
        struct btrfs_block_rsv block_rsv;
 -      struct timespec cur_time = current_fs_time(dir->i_sb);
 +      struct timespec cur_time = current_time(dir);
        struct inode *inode;
        int ret;
        int err;
@@@ -3292,7 -3292,7 +3292,7 @@@ static int clone_finish_inode_update(st
  
        inode_inc_iversion(inode);
        if (!no_time_update)
 -              inode->i_mtime = inode->i_ctime = current_fs_time(inode->i_sb);
 +              inode->i_mtime = inode->i_ctime = current_time(inode);
        /*
         * We round up to the block size at eof when determining which
         * extents to clone above, but shouldn't round up the file size.
@@@ -3814,6 -3814,11 +3814,11 @@@ process_slot
                }
                btrfs_release_path(path);
                key.offset = next_key_min_offset;
+               if (fatal_signal_pending(current)) {
+                       ret = -EINTR;
+                       goto out;
+               }
        }
        ret = 0;
  
@@@ -5107,7 -5112,7 +5112,7 @@@ static long _btrfs_ioctl_set_received_s
        struct btrfs_root *root = BTRFS_I(inode)->root;
        struct btrfs_root_item *root_item = &root->root_item;
        struct btrfs_trans_handle *trans;
 -      struct timespec ct = current_fs_time(inode->i_sb);
 +      struct timespec ct = current_time(inode);
        int ret = 0;
        int received_uuid_changed;