Merge tag 'xfs-5.5-merge-16' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 2 Dec 2019 22:46:22 +0000 (14:46 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 2 Dec 2019 22:46:22 +0000 (14:46 -0800)
Pull XFS updates from Darrick Wong:
 "For this release, we changed quite a few things.

  Highlights:

   - Fixed some long tail latency problems in the block allocator

   - Removed some long deprecated (and for the past several years no-op)
     mount options and ioctls

   - Strengthened the extended attribute and directory verifiers

   - Audited and fixed all the places where we could return EFSCORRUPTED
     without logging anything

   - Refactored the old SGI space allocation ioctls to make the
     equivalent fallocate calls

   - Fixed a race between fallocate and directio

   - Fixed an integer overflow when files have more than a few
     billion(!) extents

   - Fixed a longstanding bug where quota accounting could be incorrect
     when performing unwritten extent conversion on a freshly mounted fs

   - Fixed various complaints in scrub about soft lockups and
     unresponsiveness to signals

   - De-vtable'd the directory handling code, which should make it
     faster

   - Converted to the new mount api, for better or for worse

   - Cleaned up some memory leaks

  and quite a lot of other smaller fixes and cleanups.

  A more detailed summary:

   - Fill out the build string

   - Prevent inode fork extent count overflows

   - Refactor the allocator to reduce long tail latency

   - Rework incore log locking a little to reduce spinning

   - Break up the xfs_iomap_begin functions into smaller more cohesive
     parts

   - Fix allocation alignment being dropped too early when the
     allocation request is for more blocks than an AG is large

   - Other small cleanups

   - Clean up file buftarg retrieval helpers

   - Hoist the resvsp and unresvsp ioctls to the vfs

   - Remove the undocumented biosize mount option, since it has never
     been mentioned as existing or supported on linux

   - Clean up some of the mount option printing and parsing

   - Enhance attr leaf verifier to check block structure

   - Check dirent and attr names for invalid characters before passing
     them to the vfs

   - Refactor open-coded bmbt walking

   - Fix a few places where we return EIO instead of EFSCORRUPTED after
     failing metadata sanity checks

   - Fix a synchronization problem between fallocate and aio dio
     corrupting the file length

   - Clean up various loose ends in the iomap and bmap code

   - Convert to the new mount api

   - Make sure we always log something when returning EFSCORRUPTED

   - Fix some problems where long running scrub loops could trigger soft
     lockup warnings and/or fail to exit due to fatal signals pending

   - Fix various Coverity complaints

   - Remove most of the function pointers from the directory code to
     reduce indirection penalties

   - Ensure that dquots are attached to the inode when performing
     unwritten extent conversion after io

   - Deuglify incore projid and crtime types

   - Fix another AGI/AGF locking order deadlock when renaming

   - Clean up some quota typedefs

   - Remove the FSSETDM ioctls which haven't done anything in 20 years

   - Fix some memory leaks when mounting the log fails

   - Fix an underflow when updating an xattr leaf freemap

   - Remove some trivial wrappers

   - Report metadata corruption as an error, not a (potentially) fatal
     assertion

   - Clean up the dir/attr buffer mapping code

   - Allow fatal signals to kill scrub during parent pointer checks"

* tag 'xfs-5.5-merge-16' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: (198 commits)
  xfs: allow parent directory scans to be interrupted with fatal signals
  xfs: remove the mappedbno argument to xfs_da_get_buf
  xfs: remove the mappedbno argument to xfs_da_read_buf
  xfs: split xfs_da3_node_read
  xfs: remove the mappedbno argument to xfs_dir3_leafn_read
  xfs: remove the mappedbno argument to xfs_dir3_leaf_read
  xfs: remove the mappedbno argument to xfs_attr3_leaf_read
  xfs: remove the mappedbno argument to xfs_da_reada_buf
  xfs: improve the xfs_dabuf_map calling conventions
  xfs: refactor xfs_dabuf_map
  xfs: simplify mappedbno handling in xfs_da_{get,read}_buf
  xfs: report corruption only as a regular error
  xfs: Remove kmem_zone_free() wrapper
  xfs: Remove kmem_zone_destroy() wrapper
  xfs: Remove slab init wrappers
  xfs: fix attr leaf header freemap.size underflow
  xfs: fix some memory leaks in log recovery
  xfs: fix another missing include
  xfs: remove XFS_IOC_FSSETDM and XFS_IOC_FSSETDM_BY_HANDLE
  xfs: remove duplicated include from xfs_dir2_data.c
  ...

1  2 
fs/compat_ioctl.c
fs/ioctl.c
fs/xfs/libxfs/xfs_fs.h
include/linux/falloc.h
include/linux/fs.h

@@@ -165,38 -1020,51 +165,50 @@@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned 
        case FIONBIO:
        case FIOASYNC:
        case FIOQSIZE:
 -              break;
 -
 -#if defined(CONFIG_IA64) || defined(CONFIG_X86_64)
 +      case FS_IOC_FIEMAP:
 +      case FIGETBSZ:
 +      case FICLONERANGE:
 +      case FIDEDUPERANGE:
 +              goto found_handler;
 +      /*
 +       * The next group is the stuff handled inside file_ioctl().
 +       * For regular files these never reach ->ioctl(); for
 +       * devices, sockets, etc. they do and one (FIONREAD) is
 +       * even accepted in some cases.  In all those cases
 +       * argument has the same type, so we can handle these
 +       * here, shunting them towards do_vfs_ioctl().
 +       * ->compat_ioctl() will never see any of those.
 +       */
 +      /* pointer argument, never actually handled by ->ioctl() */
 +      case FIBMAP:
 +              goto found_handler;
 +      /* handled by some ->ioctl(); always a pointer to int */
 +      case FIONREAD:
 +              goto found_handler;
-       /* these two get messy on amd64 due to alignment differences */
++      /* these get messy on amd64 due to alignment differences */
 +#if defined(CONFIG_X86_64)
        case FS_IOC_RESVSP_32:
        case FS_IOC_RESVSP64_32:
-               error = compat_ioctl_preallocate(f.file, compat_ptr(arg));
+               error = compat_ioctl_preallocate(f.file, 0, compat_ptr(arg));
+               goto out_fput;
+       case FS_IOC_UNRESVSP_32:
+       case FS_IOC_UNRESVSP64_32:
+               error = compat_ioctl_preallocate(f.file, FALLOC_FL_PUNCH_HOLE,
+                               compat_ptr(arg));
+               goto out_fput;
+       case FS_IOC_ZERO_RANGE_32:
+               error = compat_ioctl_preallocate(f.file, FALLOC_FL_ZERO_RANGE,
+                               compat_ptr(arg));
                goto out_fput;
  #else
        case FS_IOC_RESVSP:
        case FS_IOC_RESVSP64:
 -              error = ioctl_preallocate(f.file, 0, compat_ptr(arg));
 -              goto out_fput;
+       case FS_IOC_UNRESVSP:
+       case FS_IOC_UNRESVSP64:
 -              error = ioctl_preallocate(f.file, FALLOC_FL_PUNCH_HOLE,
 -                              compat_ptr(arg));
 -              goto out_fput;
+       case FS_IOC_ZERO_RANGE:
 -              error = ioctl_preallocate(f.file, FALLOC_FL_ZERO_RANGE,
 -                              compat_ptr(arg));
 -              goto out_fput;
 +              goto found_handler;
  #endif
  
 -      case FICLONE:
 -      case FICLONERANGE:
 -      case FIDEDUPERANGE:
 -      case FS_IOC_FIEMAP:
 -              goto do_ioctl;
 -
 -      case FIBMAP:
 -      case FIGETBSZ:
 -      case FIONREAD:
 -              if (S_ISREG(file_inode(f.file)->i_mode))
 -                      break;
 -              /*FALL THROUGH*/
 -
        default:
                if (f.file->f_op->compat_ioctl) {
                        error = f.file->f_op->compat_ioctl(f.file, cmd, arg);
diff --cc fs/ioctl.c
@@@ -488,38 -487,10 +488,39 @@@ int ioctl_preallocate(struct file *filp
                return -EINVAL;
        }
  
-       return vfs_fallocate(filp, FALLOC_FL_KEEP_SIZE, sr.l_start, sr.l_len);
+       return vfs_fallocate(filp, mode | FALLOC_FL_KEEP_SIZE, sr.l_start,
+                       sr.l_len);
  }
  
- int compat_ioctl_preallocate(struct file *file,
 +/* on ia32 l_start is on a 32-bit boundary */
 +#if defined CONFIG_COMPAT && defined(CONFIG_X86_64)
 +/* just account for different alignment */
-       return vfs_fallocate(file, FALLOC_FL_KEEP_SIZE, sr.l_start, sr.l_len);
++int compat_ioctl_preallocate(struct file *file, int mode,
 +                              struct space_resv_32 __user *argp)
 +{
 +      struct inode *inode = file_inode(file);
 +      struct space_resv_32 sr;
 +
 +      if (copy_from_user(&sr, argp, sizeof(sr)))
 +              return -EFAULT;
 +
 +      switch (sr.l_whence) {
 +      case SEEK_SET:
 +              break;
 +      case SEEK_CUR:
 +              sr.l_start += file->f_pos;
 +              break;
 +      case SEEK_END:
 +              sr.l_start += i_size_read(inode);
 +              break;
 +      default:
 +              return -EINVAL;
 +      }
 +
++      return vfs_fallocate(file, mode | FALLOC_FL_KEEP_SIZE, sr.l_start, sr.l_len);
 +}
 +#endif
 +
  static int file_ioctl(struct file *filp, unsigned int cmd,
                unsigned long arg)
  {
Simple merge
@@@ -29,24 -32,4 +32,27 @@@ struct space_resv 
                                         FALLOC_FL_INSERT_RANGE |       \
                                         FALLOC_FL_UNSHARE_RANGE)
  
- #define FS_IOC_RESVSP_32              _IOW ('X', 40, struct space_resv_32)
 +/* on ia32 l_start is on a 32-bit boundary */
 +#if defined(CONFIG_X86_64)
 +struct space_resv_32 {
 +      __s16           l_type;
 +      __s16           l_whence;
 +      __s64           l_start __attribute__((packed));
 +                      /* len == 0 means until end of file */
 +      __s64           l_len __attribute__((packed));
 +      __s32           l_sysid;
 +      __u32           l_pid;
 +      __s32           l_pad[4];       /* reserve area */
 +};
 +
- int compat_ioctl_preallocate(struct file *, struct space_resv_32 __user *);
++#define FS_IOC_RESVSP_32      _IOW ('X', 40, struct space_resv_32)
++#define FS_IOC_UNRESVSP_32    _IOW ('X', 41, struct space_resv_32)
 +#define FS_IOC_RESVSP64_32    _IOW ('X', 42, struct space_resv_32)
++#define FS_IOC_UNRESVSP64_32  _IOW ('X', 43, struct space_resv_32)
++#define FS_IOC_ZERO_RANGE_32  _IOW ('X', 57, struct space_resv_32)
 +
++int compat_ioctl_preallocate(struct file *, int, struct space_resv_32 __user *);
 +
 +#endif
 +
  #endif /* _FALLOC_H_ */
Simple merge