]> Pileus Git - ~andy/linux/blobdiff - fs/xfs/xfs_trans_buf.c
Input: bcm5974 - add support for the 2013 MacBook Air
[~andy/linux] / fs / xfs / xfs_trans_buf.c
index 3edf5dbee001c60239a11254dbd697c7602e9b06..73a5fa457e16ddd72c4a45631cda8a5ae05fdbf6 100644 (file)
@@ -659,6 +659,7 @@ xfs_trans_binval(
                ASSERT(XFS_BUF_ISSTALE(bp));
                ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY)));
                ASSERT(!(bip->__bli_format.blf_flags & XFS_BLF_INODE_BUF));
+               ASSERT(!(bip->__bli_format.blf_flags & XFS_BLFT_MASK));
                ASSERT(bip->__bli_format.blf_flags & XFS_BLF_CANCEL);
                ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY);
                ASSERT(tp->t_flags & XFS_TRANS_DIRTY);
@@ -671,6 +672,7 @@ xfs_trans_binval(
        bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY);
        bip->__bli_format.blf_flags &= ~XFS_BLF_INODE_BUF;
        bip->__bli_format.blf_flags |= XFS_BLF_CANCEL;
+       bip->__bli_format.blf_flags &= ~XFS_BLFT_MASK;
        for (i = 0; i < bip->bli_format_count; i++) {
                memset(bip->bli_formats[i].blf_data_map, 0,
                       (bip->bli_formats[i].blf_map_size * sizeof(uint)));
@@ -702,12 +704,13 @@ xfs_trans_inode_buf(
        ASSERT(atomic_read(&bip->bli_refcount) > 0);
 
        bip->bli_flags |= XFS_BLI_INODE_BUF;
+       xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DINO_BUF);
 }
 
 /*
  * This call is used to indicate that the buffer is going to
  * be staled and was an inode buffer. This means it gets
- * special processing during unpin - where any inodes 
+ * special processing during unpin - where any inodes
  * associated with the buffer should be removed from ail.
  * There is also special processing during recovery,
  * any replay of the inodes in the buffer needs to be
@@ -726,6 +729,7 @@ xfs_trans_stale_inode_buf(
 
        bip->bli_flags |= XFS_BLI_STALE_INODE;
        bip->bli_item.li_cb = xfs_buf_iodone;
+       xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DINO_BUF);
 }
 
 /*
@@ -749,8 +753,43 @@ xfs_trans_inode_alloc_buf(
        ASSERT(atomic_read(&bip->bli_refcount) > 0);
 
        bip->bli_flags |= XFS_BLI_INODE_ALLOC_BUF;
+       xfs_trans_buf_set_type(tp, bp, XFS_BLFT_DINO_BUF);
 }
 
+/*
+ * Set the type of the buffer for log recovery so that it can correctly identify
+ * and hence attach the correct buffer ops to the buffer after replay.
+ */
+void
+xfs_trans_buf_set_type(
+       struct xfs_trans        *tp,
+       struct xfs_buf          *bp,
+       enum xfs_blft           type)
+{
+       struct xfs_buf_log_item *bip = bp->b_fspriv;
+
+       if (!tp)
+               return;
+
+       ASSERT(bp->b_transp == tp);
+       ASSERT(bip != NULL);
+       ASSERT(atomic_read(&bip->bli_refcount) > 0);
+
+       xfs_blft_to_flags(&bip->__bli_format, type);
+}
+
+void
+xfs_trans_buf_copy_type(
+       struct xfs_buf          *dst_bp,
+       struct xfs_buf          *src_bp)
+{
+       struct xfs_buf_log_item *sbip = src_bp->b_fspriv;
+       struct xfs_buf_log_item *dbip = dst_bp->b_fspriv;
+       enum xfs_blft           type;
+
+       type = xfs_blft_from_flags(&sbip->__bli_format);
+       xfs_blft_to_flags(&dbip->__bli_format, type);
+}
 
 /*
  * Similar to xfs_trans_inode_buf(), this marks the buffer as a cluster of
@@ -769,14 +808,28 @@ xfs_trans_dquot_buf(
        xfs_buf_t       *bp,
        uint            type)
 {
-       xfs_buf_log_item_t      *bip = bp->b_fspriv;
+       struct xfs_buf_log_item *bip = bp->b_fspriv;
 
-       ASSERT(bp->b_transp == tp);
-       ASSERT(bip != NULL);
        ASSERT(type == XFS_BLF_UDQUOT_BUF ||
               type == XFS_BLF_PDQUOT_BUF ||
               type == XFS_BLF_GDQUOT_BUF);
-       ASSERT(atomic_read(&bip->bli_refcount) > 0);
 
        bip->__bli_format.blf_flags |= type;
+
+       switch (type) {
+       case XFS_BLF_UDQUOT_BUF:
+               type = XFS_BLFT_UDQUOT_BUF;
+               break;
+       case XFS_BLF_PDQUOT_BUF:
+               type = XFS_BLFT_PDQUOT_BUF;
+               break;
+       case XFS_BLF_GDQUOT_BUF:
+               type = XFS_BLFT_GDQUOT_BUF;
+               break;
+       default:
+               type = XFS_BLFT_UNKNOWN_BUF;
+               break;
+       }
+
+       xfs_trans_buf_set_type(tp, bp, type);
 }