Merge tag 'for-linus-v3.11-rc1' of git://oss.sgi.com/xfs/xfs
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Jul 2013 19:29:12 +0000 (12:29 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Jul 2013 19:29:12 +0000 (12:29 -0700)
Pull xfs update from Ben Myers:
 "This includes several bugfixes, part of the work for project quotas
  and group quotas to be used together, performance improvements for
  inode creation/deletion, buffer readahead, and bulkstat,
  implementation of the inode change count, an inode create transaction,
  and the removal of a bunch of dead code.

  There are also some duplicate commits that you already have from the
  3.10-rc series.

   - part of the work to allow project quotas and group quotas to be
     used together
   - inode change count
   - inode create transaction
   - block queue plugging in buffer readahead and bulkstat
   - ordered log vector support
   - removal of dead code in and around xfs_sync_inode_grab,
     xfs_ialloc_get_rec, XFS_MOUNT_RETERR, XFS_ALLOCFREE_LOG_RES,
     XFS_DIROP_LOG_RES, xfs_chash, ctl_table, and
     xfs_growfs_data_private
   - don't keep silent if sunit/swidth can not be changed via mount
   - fix a leak of remote symlink blocks into the filesystem when xattrs
     are used on symlinks
   - fix for fiemap to return FIEMAP_EXTENT_UNKOWN flag on delay extents
   - part of a fix for xfs_fsr
   - disable speculative preallocation with small files
   - performance improvements for inode creates and deletes"

* tag 'for-linus-v3.11-rc1' of git://oss.sgi.com/xfs/xfs: (61 commits)
  xfs: Remove incore use of XFS_OQUOTA_ENFD and XFS_OQUOTA_CHKD
  xfs: Change xfs_dquot_acct to be a 2-dimensional array
  xfs: Code cleanup and removal of some typedef usage
  xfs: Replace macro XFS_DQ_TO_QIP with a function
  xfs: Replace macro XFS_DQUOT_TREE with a function
  xfs: Define a new function xfs_is_quota_inode()
  xfs: implement inode change count
  xfs: Use inode create transaction
  xfs: Inode create item recovery
  xfs: Inode create transaction reservations
  xfs: Inode create log items
  xfs: Introduce an ordered buffer item
  xfs: Introduce ordered log vector support
  xfs: xfs_ifree doesn't need to modify the inode buffer
  xfs: don't do IO when creating an new inode
  xfs: don't use speculative prealloc for small files
  xfs: plug directory buffer readahead
  xfs: add pluging for bulkstat readahead
  xfs: Remove dead function prototype xfs_sync_inode_grab()
  xfs: Remove the left function variable from xfs_ialloc_get_rec()
  ...

1  2 
fs/xfs/xfs_dir2_leaf.c
fs/xfs/xfs_trace.h

diff --combined fs/xfs/xfs_dir2_leaf.c
@@@ -1108,6 -1108,7 +1108,7 @@@ xfs_dir2_leaf_readbuf
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_buf          *bp = *bpp;
        struct xfs_bmbt_irec    *map = mip->map;
+       struct blk_plug         plug;
        int                     error = 0;
        int                     length;
        int                     i;
        /*
         * Do we need more readahead?
         */
+       blk_start_plug(&plug);
        for (mip->ra_index = mip->ra_offset = i = 0;
             mip->ra_want > mip->ra_current && i < mip->map_blocks;
             i += mp->m_dirblkfsbs) {
                        }
                }
        }
+       blk_finish_plug(&plug);
  
  out:
        *bpp = bp;
  int                                           /* error */
  xfs_dir2_leaf_getdents(
        xfs_inode_t             *dp,            /* incore directory inode */
 -      void                    *dirent,
 -      size_t                  bufsize,
 -      xfs_off_t               *offset,
 -      filldir_t               filldir)
 +      struct dir_context      *ctx,
 +      size_t                  bufsize)
  {
        struct xfs_buf          *bp = NULL;     /* data block buffer */
        xfs_dir2_data_hdr_t     *hdr;           /* data block header */
         * If the offset is at or past the largest allowed value,
         * give up right away.
         */
 -      if (*offset >= XFS_DIR2_MAX_DATAPTR)
 +      if (ctx->pos >= XFS_DIR2_MAX_DATAPTR)
                return 0;
  
        mp = dp->i_mount;
         * Inside the loop we keep the main offset value as a byte offset
         * in the directory file.
         */
 -      curoff = xfs_dir2_dataptr_to_byte(mp, *offset);
 +      curoff = xfs_dir2_dataptr_to_byte(mp, ctx->pos);
  
        /*
         * Force this conversion through db so we truncate the offset
                dep = (xfs_dir2_data_entry_t *)ptr;
                length = xfs_dir2_data_entsize(dep->namelen);
  
 -              if (filldir(dirent, (char *)dep->name, dep->namelen,
 -                          xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff,
 +              ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff;
 +              if (!dir_emit(ctx, (char *)dep->name, dep->namelen,
                            be64_to_cpu(dep->inumber), DT_UNKNOWN))
                        break;
  
         * All done.  Set output offset value to current offset.
         */
        if (curoff > xfs_dir2_dataptr_to_byte(mp, XFS_DIR2_MAX_DATAPTR))
 -              *offset = XFS_DIR2_MAX_DATAPTR & 0x7fffffff;
 +              ctx->pos = XFS_DIR2_MAX_DATAPTR & 0x7fffffff;
        else
 -              *offset = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff;
 +              ctx->pos = xfs_dir2_byte_to_dataptr(mp, curoff) & 0x7fffffff;
        kmem_free(map_info);
        if (bp)
                xfs_trans_brelse(NULL, bp);
diff --combined fs/xfs/xfs_trace.h
@@@ -486,9 -486,12 +486,12 @@@ DEFINE_EVENT(xfs_buf_item_class, name, 
        TP_PROTO(struct xfs_buf_log_item *bip), \
        TP_ARGS(bip))
  DEFINE_BUF_ITEM_EVENT(xfs_buf_item_size);
+ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_size_ordered);
  DEFINE_BUF_ITEM_EVENT(xfs_buf_item_size_stale);
  DEFINE_BUF_ITEM_EVENT(xfs_buf_item_format);
+ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_format_ordered);
  DEFINE_BUF_ITEM_EVENT(xfs_buf_item_format_stale);
+ DEFINE_BUF_ITEM_EVENT(xfs_buf_item_ordered);
  DEFINE_BUF_ITEM_EVENT(xfs_buf_item_pin);
  DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unpin);
  DEFINE_BUF_ITEM_EVENT(xfs_buf_item_unpin_stale);
@@@ -508,6 -511,7 +511,7 @@@ DEFINE_BUF_ITEM_EVENT(xfs_trans_bjoin)
  DEFINE_BUF_ITEM_EVENT(xfs_trans_bhold);
  DEFINE_BUF_ITEM_EVENT(xfs_trans_bhold_release);
  DEFINE_BUF_ITEM_EVENT(xfs_trans_binval);
+ DEFINE_BUF_ITEM_EVENT(xfs_trans_buf_ordered);
  
  DECLARE_EVENT_CLASS(xfs_lock_class,
        TP_PROTO(struct xfs_inode *ip, unsigned lock_flags,
@@@ -571,6 -575,7 +575,7 @@@ DEFINE_INODE_EVENT(xfs_iget_miss)
  DEFINE_INODE_EVENT(xfs_getattr);
  DEFINE_INODE_EVENT(xfs_setattr);
  DEFINE_INODE_EVENT(xfs_readlink);
+ DEFINE_INODE_EVENT(xfs_inactive_symlink);
  DEFINE_INODE_EVENT(xfs_alloc_file_space);
  DEFINE_INODE_EVENT(xfs_free_file_space);
  DEFINE_INODE_EVENT(xfs_readdir);
@@@ -974,16 -979,14 +979,16 @@@ DEFINE_RW_EVENT(xfs_file_splice_read)
  DEFINE_RW_EVENT(xfs_file_splice_write);
  
  DECLARE_EVENT_CLASS(xfs_page_class,
 -      TP_PROTO(struct inode *inode, struct page *page, unsigned long off),
 -      TP_ARGS(inode, page, off),
 +      TP_PROTO(struct inode *inode, struct page *page, unsigned long off,
 +               unsigned int len),
 +      TP_ARGS(inode, page, off, len),
        TP_STRUCT__entry(
                __field(dev_t, dev)
                __field(xfs_ino_t, ino)
                __field(pgoff_t, pgoff)
                __field(loff_t, size)
                __field(unsigned long, offset)
 +              __field(unsigned int, length)
                __field(int, delalloc)
                __field(int, unwritten)
        ),
                __entry->pgoff = page_offset(page);
                __entry->size = i_size_read(inode);
                __entry->offset = off;
 +              __entry->length = len;
                __entry->delalloc = delalloc;
                __entry->unwritten = unwritten;
        ),
        TP_printk("dev %d:%d ino 0x%llx pgoff 0x%lx size 0x%llx offset %lx "
 -                "delalloc %d unwritten %d",
 +                "length %x delalloc %d unwritten %d",
                  MAJOR(__entry->dev), MINOR(__entry->dev),
                  __entry->ino,
                  __entry->pgoff,
                  __entry->size,
                  __entry->offset,
 +                __entry->length,
                  __entry->delalloc,
                  __entry->unwritten)
  )
  
  #define DEFINE_PAGE_EVENT(name)               \
  DEFINE_EVENT(xfs_page_class, name,    \
 -      TP_PROTO(struct inode *inode, struct page *page, unsigned long off),    \
 -      TP_ARGS(inode, page, off))
 +      TP_PROTO(struct inode *inode, struct page *page, unsigned long off, \
 +               unsigned int len),     \
 +      TP_ARGS(inode, page, off, len))
  DEFINE_PAGE_EVENT(xfs_writepage);
  DEFINE_PAGE_EVENT(xfs_releasepage);
  DEFINE_PAGE_EVENT(xfs_invalidatepage);