]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'xfs/for-next'
authorThierry Reding <treding@nvidia.com>
Fri, 25 Oct 2013 09:29:58 +0000 (11:29 +0200)
committerThierry Reding <treding@nvidia.com>
Fri, 25 Oct 2013 09:29:58 +0000 (11:29 +0200)
1  2 
fs/xfs/xfs_aops.c
fs/xfs/xfs_file.c

diff --combined fs/xfs/xfs_aops.c
index 6fad7b55953839ecdad75164789dc9cd48451353,eb310caf13b11e48ea5bc6f3a379af174070ecd1..20ba95e6096689e0f8c1dcf9b938696f53ab2b53
   * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
   */
  #include "xfs.h"
- #include "xfs_log.h"
+ #include "xfs_shared.h"
+ #include "xfs_format.h"
+ #include "xfs_log_format.h"
+ #include "xfs_trans_resv.h"
  #include "xfs_sb.h"
  #include "xfs_ag.h"
- #include "xfs_trans.h"
  #include "xfs_mount.h"
- #include "xfs_bmap_btree.h"
- #include "xfs_dinode.h"
  #include "xfs_inode.h"
+ #include "xfs_trans.h"
  #include "xfs_inode_item.h"
  #include "xfs_alloc.h"
  #include "xfs_error.h"
@@@ -31,6 -32,8 +32,8 @@@
  #include "xfs_trace.h"
  #include "xfs_bmap.h"
  #include "xfs_bmap_util.h"
+ #include "xfs_bmap_btree.h"
+ #include "xfs_dinode.h"
  #include <linux/aio.h>
  #include <linux/gfp.h>
  #include <linux/mpage.h>
@@@ -333,7 -336,7 +336,7 @@@ xfs_map_blocks
  
        if (type == XFS_IO_DELALLOC &&
            (!nimaps || isnullstartblock(imap->br_startblock))) {
-               error = xfs_iomap_write_allocate(ip, offset, count, imap);
+               error = xfs_iomap_write_allocate(ip, offset, imap);
                if (!error)
                        trace_xfs_map_blocks_alloc(ip, offset, count, type, imap);
                return -XFS_ERROR(error);
@@@ -1413,8 -1416,9 +1416,8 @@@ STATIC ssize_
  xfs_vm_direct_IO(
        int                     rw,
        struct kiocb            *iocb,
 -      const struct iovec      *iov,
 -      loff_t                  offset,
 -      unsigned long           nr_segs)
 +      struct iov_iter         *iter,
 +      loff_t                  offset)
  {
        struct inode            *inode = iocb->ki_filp->f_mapping->host;
        struct block_device     *bdev = xfs_find_bdev_for_inode(inode);
        ssize_t                 ret;
  
        if (rw & WRITE) {
 -              size_t size = iov_length(iov, nr_segs);
 +              size_t size = iov_iter_count(iter);
  
                /*
                 * We cannot preallocate a size update transaction here as we
                if (offset + size > XFS_I(inode)->i_d.di_size)
                        ioend->io_isdirect = 1;
  
 -              ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov,
 -                                          offset, nr_segs,
 +              ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iter, offset,
                                            xfs_get_blocks_direct,
                                            xfs_end_io_direct_write, NULL, 0);
                if (ret != -EIOCBQUEUED && iocb->private)
                        goto out_destroy_ioend;
        } else {
 -              ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iov,
 -                                          offset, nr_segs,
 +              ret = __blockdev_direct_IO(rw, iocb, inode, bdev, iter, offset,
                                            xfs_get_blocks_direct,
                                            NULL, NULL, 0);
        }
diff --combined fs/xfs/xfs_file.c
index 818c6230bb35540f61e824c124f4bae4ed8207c2,52c91e1437255c60d1f56041d4eceea4601f6265..e6035bd58294d1a03c50933ec113c46b0465d4aa
   */
  #include "xfs.h"
  #include "xfs_fs.h"
- #include "xfs_log.h"
+ #include "xfs_shared.h"
+ #include "xfs_format.h"
+ #include "xfs_log_format.h"
+ #include "xfs_trans_resv.h"
  #include "xfs_sb.h"
  #include "xfs_ag.h"
- #include "xfs_trans.h"
  #include "xfs_mount.h"
- #include "xfs_bmap_btree.h"
- #include "xfs_alloc.h"
- #include "xfs_dinode.h"
+ #include "xfs_da_format.h"
+ #include "xfs_da_btree.h"
  #include "xfs_inode.h"
+ #include "xfs_trans.h"
  #include "xfs_inode_item.h"
  #include "xfs_bmap.h"
  #include "xfs_bmap_util.h"
  #include "xfs_error.h"
- #include "xfs_da_btree.h"
- #include "xfs_dir2_format.h"
  #include "xfs_dir2.h"
  #include "xfs_dir2_priv.h"
  #include "xfs_ioctl.h"
  #include "xfs_trace.h"
+ #include "xfs_log.h"
+ #include "xfs_dinode.h"
  
  #include <linux/aio.h>
  #include <linux/dcache.h>
@@@ -227,9 -229,10 +229,9 @@@ xfs_file_fsync
  }
  
  STATIC ssize_t
 -xfs_file_aio_read(
 +xfs_file_read_iter(
        struct kiocb            *iocb,
 -      const struct iovec      *iovp,
 -      unsigned long           nr_segs,
 +      struct iov_iter         *iter,
        loff_t                  pos)
  {
        struct file             *file = iocb->ki_filp;
        if (file->f_mode & FMODE_NOCMTIME)
                ioflags |= IO_INVIS;
  
 -      ret = generic_segment_checks(iovp, &nr_segs, &size, VERIFY_WRITE);
 -      if (ret < 0)
 -              return ret;
 +      size = iov_iter_count(iter);
  
        if (unlikely(ioflags & IO_ISDIRECT)) {
                xfs_buftarg_t   *target =
  
        trace_xfs_file_read(ip, size, pos, ioflags);
  
 -      ret = generic_file_aio_read(iocb, iovp, nr_segs, pos);
 +      ret = generic_file_read_iter(iocb, iter, pos);
        if (ret > 0)
                XFS_STATS_ADD(xs_read_bytes, ret);
  
@@@ -619,9 -624,10 +621,9 @@@ restart
  STATIC ssize_t
  xfs_file_dio_aio_write(
        struct kiocb            *iocb,
 -      const struct iovec      *iovp,
 -      unsigned long           nr_segs,
 +      struct iov_iter         *iter,
        loff_t                  pos,
 -      size_t                  ocount)
 +      size_t                  count)
  {
        struct file             *file = iocb->ki_filp;
        struct address_space    *mapping = file->f_mapping;
        struct xfs_inode        *ip = XFS_I(inode);
        struct xfs_mount        *mp = ip->i_mount;
        ssize_t                 ret = 0;
 -      size_t                  count = ocount;
        int                     unaligned_io = 0;
        int                     iolock;
        struct xfs_buftarg      *target = XFS_IS_REALTIME_INODE(ip) ?
        }
  
        trace_xfs_file_direct_write(ip, count, iocb->ki_pos, 0);
 -      ret = generic_file_direct_write(iocb, iovp,
 -                      &nr_segs, pos, &iocb->ki_pos, count, ocount);
 +      ret = generic_file_direct_write_iter(iocb, iter,
 +                      pos, &iocb->ki_pos, count);
  
  out:
        xfs_rw_iunlock(ip, iolock);
  STATIC ssize_t
  xfs_file_buffered_aio_write(
        struct kiocb            *iocb,
 -      const struct iovec      *iovp,
 -      unsigned long           nr_segs,
 +      struct iov_iter         *iter,
        loff_t                  pos,
 -      size_t                  ocount)
 +      size_t                  count)
  {
        struct file             *file = iocb->ki_filp;
        struct address_space    *mapping = file->f_mapping;
        ssize_t                 ret;
        int                     enospc = 0;
        int                     iolock = XFS_IOLOCK_EXCL;
 -      size_t                  count = ocount;
  
        xfs_rw_ilock(ip, iolock);
  
  
  write_retry:
        trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0);
 -      ret = generic_file_buffered_write(iocb, iovp, nr_segs,
 +      ret = generic_file_buffered_write_iter(iocb, iter,
                        pos, &iocb->ki_pos, count, 0);
  
        /*
@@@ -746,9 -755,10 +748,9 @@@ out
  }
  
  STATIC ssize_t
 -xfs_file_aio_write(
 +xfs_file_write_iter(
        struct kiocb            *iocb,
 -      const struct iovec      *iovp,
 -      unsigned long           nr_segs,
 +      struct iov_iter         *iter,
        loff_t                  pos)
  {
        struct file             *file = iocb->ki_filp;
        struct inode            *inode = mapping->host;
        struct xfs_inode        *ip = XFS_I(inode);
        ssize_t                 ret;
 -      size_t                  ocount = 0;
 +      size_t                  count = 0;
  
        XFS_STATS_INC(xs_write_calls);
  
        BUG_ON(iocb->ki_pos != pos);
  
 -      ret = generic_segment_checks(iovp, &nr_segs, &ocount, VERIFY_READ);
 -      if (ret)
 -              return ret;
 +      count = iov_iter_count(iter);
  
 -      if (ocount == 0)
 +      if (count == 0)
                return 0;
  
        if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
        }
  
        if (unlikely(file->f_flags & O_DIRECT))
 -              ret = xfs_file_dio_aio_write(iocb, iovp, nr_segs, pos, ocount);
 +              ret = xfs_file_dio_aio_write(iocb, iter, pos, count);
        else
 -              ret = xfs_file_buffered_aio_write(iocb, iovp, nr_segs, pos,
 -                                                ocount);
 +              ret = xfs_file_buffered_aio_write(iocb, iter, pos, count);
  
        if (ret > 0) {
                ssize_t err;
@@@ -794,44 -807,64 +796,64 @@@ out
  
  STATIC long
  xfs_file_fallocate(
-       struct file     *file,
-       int             mode,
-       loff_t          offset,
-       loff_t          len)
+       struct file             *file,
+       int                     mode,
+       loff_t                  offset,
+       loff_t                  len)
  {
-       struct inode    *inode = file_inode(file);
-       long            error;
-       loff_t          new_size = 0;
-       xfs_flock64_t   bf;
-       xfs_inode_t     *ip = XFS_I(inode);
-       int             cmd = XFS_IOC_RESVSP;
-       int             attr_flags = XFS_ATTR_NOLOCK;
+       struct inode            *inode = file_inode(file);
+       struct xfs_inode        *ip = XFS_I(inode);
+       struct xfs_trans        *tp;
+       long                    error;
+       loff_t                  new_size = 0;
  
+       if (!S_ISREG(inode->i_mode))
+               return -EINVAL;
        if (mode & ~(FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE))
                return -EOPNOTSUPP;
  
-       bf.l_whence = 0;
-       bf.l_start = offset;
-       bf.l_len = len;
        xfs_ilock(ip, XFS_IOLOCK_EXCL);
+       if (mode & FALLOC_FL_PUNCH_HOLE) {
+               error = xfs_free_file_space(ip, offset, len);
+               if (error)
+                       goto out_unlock;
+       } else {
+               if (!(mode & FALLOC_FL_KEEP_SIZE) &&
+                   offset + len > i_size_read(inode)) {
+                       new_size = offset + len;
+                       error = -inode_newsize_ok(inode, new_size);
+                       if (error)
+                               goto out_unlock;
+               }
  
-       if (mode & FALLOC_FL_PUNCH_HOLE)
-               cmd = XFS_IOC_UNRESVSP;
-       /* check the new inode size is valid before allocating */
-       if (!(mode & FALLOC_FL_KEEP_SIZE) &&
-           offset + len > i_size_read(inode)) {
-               new_size = offset + len;
-               error = inode_newsize_ok(inode, new_size);
+               error = xfs_alloc_file_space(ip, offset, len,
+                                            XFS_BMAPI_PREALLOC);
                if (error)
                        goto out_unlock;
        }
  
-       if (file->f_flags & O_DSYNC)
-               attr_flags |= XFS_ATTR_SYNC;
+       tp = xfs_trans_alloc(ip->i_mount, XFS_TRANS_WRITEID);
+       error = xfs_trans_reserve(tp, &M_RES(ip->i_mount)->tr_writeid, 0, 0);
+       if (error) {
+               xfs_trans_cancel(tp, 0);
+               goto out_unlock;
+       }
  
-       error = -xfs_change_file_space(ip, cmd, &bf, 0, attr_flags);
+       xfs_ilock(ip, XFS_ILOCK_EXCL);
+       xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
+       ip->i_d.di_mode &= ~S_ISUID;
+       if (ip->i_d.di_mode & S_IXGRP)
+               ip->i_d.di_mode &= ~S_ISGID;
+       if (!(mode & FALLOC_FL_PUNCH_HOLE))
+               ip->i_d.di_flags |= XFS_DIFLAG_PREALLOC;
+       xfs_trans_ichgtime(tp, ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
+       xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
+       if (file->f_flags & O_DSYNC)
+               xfs_trans_set_sync(tp);
+       error = xfs_trans_commit(tp, 0);
        if (error)
                goto out_unlock;
  
  
                iattr.ia_valid = ATTR_SIZE;
                iattr.ia_size = new_size;
-               error = -xfs_setattr_size(ip, &iattr, XFS_ATTR_NOLOCK);
+               error = xfs_setattr_size(ip, &iattr);
        }
  
  out_unlock:
        xfs_iunlock(ip, XFS_IOLOCK_EXCL);
-       return error;
+       return -error;
  }
  
  
@@@ -1400,8 -1433,8 +1422,8 @@@ const struct file_operations xfs_file_o
        .llseek         = xfs_file_llseek,
        .read           = do_sync_read,
        .write          = do_sync_write,
 -      .aio_read       = xfs_file_aio_read,
 -      .aio_write      = xfs_file_aio_write,
 +      .read_iter      = xfs_file_read_iter,
 +      .write_iter     = xfs_file_write_iter,
        .splice_read    = xfs_file_splice_read,
        .splice_write   = xfs_file_splice_write,
        .unlocked_ioctl = xfs_file_ioctl,