diff options
| author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-11 14:53:39 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-02-11 14:53:39 -0500 |
| commit | 958b7f37ee0fb2846c8d44310a68ae9605614ff9 (patch) | |
| tree | b1644d08d2e2a8d408c66c6d21a89fd815e16015 | |
| parent | d68798374bcf5cd4a19105b86d96121651b3c8cb (diff) | |
| parent | e7ff6aed8761b2c86cd9ab7083e512de2b8cfa48 (diff) | |
Merge git://oss.sgi.com:8090/xfs/xfs-2.6
* git://oss.sgi.com:8090/xfs/xfs-2.6: (33 commits)
[XFS] Don't use kmap in xfs_iozero.
[XFS] Remove a bunch of unused functions from XFS.
[XFS] Remove unused arguments from the XFS_BTREE_*_ADDR macros.
[XFS] Remove unused header files for MAC and CAP checking functionality.
[XFS] Make freeze code a little cleaner.
[XFS] Remove unused argument to xfs_bmap_finish
[XFS] Clean up use of VFS attr flags
[XFS] Remove useless memory barrier
[XFS] XFS sysctl cleanups
[XFS] Fix assertion in xfs_attr_shortform_remove().
[XFS] Fix callers of xfs_iozero() to zero the correct range.
[XFS] Ensure a frozen filesystem has a clean log before writing the dummy
[XFS] Fix sub-block zeroing for buffered writes into unwritten extents.
[XFS] Re-initialize the per-cpu superblock counters after recovery.
[XFS] Fix block reservation changes for non-SMP systems.
[XFS] Fix block reservation mechanism.
[XFS] Make growfs work for amounts greater than 2TB
[XFS] Fix inode log item use-after-free on forced shutdown
[XFS] Fix attr2 corruption with btree data extents
[XFS] Workaround log space issue by increasing XFS_TRANS_PUSH_AIL_RESTARTS
...
63 files changed, 885 insertions, 1189 deletions
diff --git a/fs/xfs/linux-2.6/mrlock.h b/fs/xfs/linux-2.6/mrlock.h index 32e1ce0f04c9..af168a1a98c1 100644 --- a/fs/xfs/linux-2.6/mrlock.h +++ b/fs/xfs/linux-2.6/mrlock.h | |||
| @@ -31,15 +31,13 @@ typedef struct { | |||
| 31 | do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) | 31 | do { (mrp)->mr_writer = 0; init_rwsem(&(mrp)->mr_lock); } while (0) |
| 32 | #define mrlock_init(mrp, t,n,s) mrinit(mrp, n) | 32 | #define mrlock_init(mrp, t,n,s) mrinit(mrp, n) |
| 33 | #define mrfree(mrp) do { } while (0) | 33 | #define mrfree(mrp) do { } while (0) |
| 34 | #define mraccess(mrp) mraccessf(mrp, 0) | ||
| 35 | #define mrupdate(mrp) mrupdatef(mrp, 0) | ||
| 36 | 34 | ||
| 37 | static inline void mraccessf(mrlock_t *mrp, int flags) | 35 | static inline void mraccess(mrlock_t *mrp) |
| 38 | { | 36 | { |
| 39 | down_read(&mrp->mr_lock); | 37 | down_read(&mrp->mr_lock); |
| 40 | } | 38 | } |
| 41 | 39 | ||
| 42 | static inline void mrupdatef(mrlock_t *mrp, int flags) | 40 | static inline void mrupdate(mrlock_t *mrp) |
| 43 | { | 41 | { |
| 44 | down_write(&mrp->mr_lock); | 42 | down_write(&mrp->mr_lock); |
| 45 | mrp->mr_writer = 1; | 43 | mrp->mr_writer = 1; |
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 7b54461695e2..f3cc4ab20ba0 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
| @@ -249,7 +249,7 @@ xfs_map_blocks( | |||
| 249 | return -error; | 249 | return -error; |
| 250 | } | 250 | } |
| 251 | 251 | ||
| 252 | STATIC inline int | 252 | STATIC_INLINE int |
| 253 | xfs_iomap_valid( | 253 | xfs_iomap_valid( |
| 254 | xfs_iomap_t *iomapp, | 254 | xfs_iomap_t *iomapp, |
| 255 | loff_t offset) | 255 | loff_t offset) |
| @@ -1283,13 +1283,18 @@ __xfs_get_blocks( | |||
| 1283 | bh_result->b_bdev = iomap.iomap_target->bt_bdev; | 1283 | bh_result->b_bdev = iomap.iomap_target->bt_bdev; |
| 1284 | 1284 | ||
| 1285 | /* | 1285 | /* |
| 1286 | * If we previously allocated a block out beyond eof and we are | 1286 | * If we previously allocated a block out beyond eof and we are now |
| 1287 | * now coming back to use it then we will need to flag it as new | 1287 | * coming back to use it then we will need to flag it as new even if it |
| 1288 | * even if it has a disk address. | 1288 | * has a disk address. |
| 1289 | * | ||
| 1290 | * With sub-block writes into unwritten extents we also need to mark | ||
| 1291 | * the buffer as new so that the unwritten parts of the buffer gets | ||
| 1292 | * correctly zeroed. | ||
| 1289 | */ | 1293 | */ |
| 1290 | if (create && | 1294 | if (create && |
| 1291 | ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) || | 1295 | ((!buffer_mapped(bh_result) && !buffer_uptodate(bh_result)) || |
| 1292 | (offset >= i_size_read(inode)) || (iomap.iomap_flags & IOMAP_NEW))) | 1296 | (offset >= i_size_read(inode)) || |
| 1297 | (iomap.iomap_flags & (IOMAP_NEW|IOMAP_UNWRITTEN)))) | ||
| 1293 | set_buffer_new(bh_result); | 1298 | set_buffer_new(bh_result); |
| 1294 | 1299 | ||
| 1295 | if (iomap.iomap_flags & IOMAP_DELAY) { | 1300 | if (iomap.iomap_flags & IOMAP_DELAY) { |
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 4fb01ffdfd1a..e2bea6a661f0 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
| @@ -34,13 +34,13 @@ | |||
| 34 | #include <linux/backing-dev.h> | 34 | #include <linux/backing-dev.h> |
| 35 | #include <linux/freezer.h> | 35 | #include <linux/freezer.h> |
| 36 | 36 | ||
| 37 | STATIC kmem_zone_t *xfs_buf_zone; | 37 | static kmem_zone_t *xfs_buf_zone; |
| 38 | STATIC kmem_shaker_t xfs_buf_shake; | 38 | static kmem_shaker_t xfs_buf_shake; |
| 39 | STATIC int xfsbufd(void *); | 39 | STATIC int xfsbufd(void *); |
| 40 | STATIC int xfsbufd_wakeup(int, gfp_t); | 40 | STATIC int xfsbufd_wakeup(int, gfp_t); |
| 41 | STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); | 41 | STATIC void xfs_buf_delwri_queue(xfs_buf_t *, int); |
| 42 | 42 | ||
| 43 | STATIC struct workqueue_struct *xfslogd_workqueue; | 43 | static struct workqueue_struct *xfslogd_workqueue; |
| 44 | struct workqueue_struct *xfsdatad_workqueue; | 44 | struct workqueue_struct *xfsdatad_workqueue; |
| 45 | 45 | ||
| 46 | #ifdef XFS_BUF_TRACE | 46 | #ifdef XFS_BUF_TRACE |
| @@ -139,7 +139,7 @@ page_region_mask( | |||
| 139 | return mask; | 139 | return mask; |
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | STATIC inline void | 142 | STATIC_INLINE void |
| 143 | set_page_region( | 143 | set_page_region( |
| 144 | struct page *page, | 144 | struct page *page, |
| 145 | size_t offset, | 145 | size_t offset, |
| @@ -151,7 +151,7 @@ set_page_region( | |||
| 151 | SetPageUptodate(page); | 151 | SetPageUptodate(page); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | STATIC inline int | 154 | STATIC_INLINE int |
| 155 | test_page_region( | 155 | test_page_region( |
| 156 | struct page *page, | 156 | struct page *page, |
| 157 | size_t offset, | 157 | size_t offset, |
| @@ -171,9 +171,9 @@ typedef struct a_list { | |||
| 171 | struct a_list *next; | 171 | struct a_list *next; |
| 172 | } a_list_t; | 172 | } a_list_t; |
| 173 | 173 | ||
| 174 | STATIC a_list_t *as_free_head; | 174 | static a_list_t *as_free_head; |
| 175 | STATIC int as_list_len; | 175 | static int as_list_len; |
| 176 | STATIC DEFINE_SPINLOCK(as_lock); | 176 | static DEFINE_SPINLOCK(as_lock); |
| 177 | 177 | ||
| 178 | /* | 178 | /* |
| 179 | * Try to batch vunmaps because they are costly. | 179 | * Try to batch vunmaps because they are costly. |
| @@ -1085,7 +1085,7 @@ xfs_buf_iostart( | |||
| 1085 | return status; | 1085 | return status; |
| 1086 | } | 1086 | } |
| 1087 | 1087 | ||
| 1088 | STATIC __inline__ int | 1088 | STATIC_INLINE int |
| 1089 | _xfs_buf_iolocked( | 1089 | _xfs_buf_iolocked( |
| 1090 | xfs_buf_t *bp) | 1090 | xfs_buf_t *bp) |
| 1091 | { | 1091 | { |
| @@ -1095,7 +1095,7 @@ _xfs_buf_iolocked( | |||
| 1095 | return 0; | 1095 | return 0; |
| 1096 | } | 1096 | } |
| 1097 | 1097 | ||
| 1098 | STATIC __inline__ void | 1098 | STATIC_INLINE void |
| 1099 | _xfs_buf_ioend( | 1099 | _xfs_buf_ioend( |
| 1100 | xfs_buf_t *bp, | 1100 | xfs_buf_t *bp, |
| 1101 | int schedule) | 1101 | int schedule) |
| @@ -1426,8 +1426,8 @@ xfs_free_bufhash( | |||
| 1426 | /* | 1426 | /* |
| 1427 | * buftarg list for delwrite queue processing | 1427 | * buftarg list for delwrite queue processing |
| 1428 | */ | 1428 | */ |
| 1429 | STATIC LIST_HEAD(xfs_buftarg_list); | 1429 | LIST_HEAD(xfs_buftarg_list); |
| 1430 | STATIC DEFINE_SPINLOCK(xfs_buftarg_lock); | 1430 | static DEFINE_SPINLOCK(xfs_buftarg_lock); |
| 1431 | 1431 | ||
| 1432 | STATIC void | 1432 | STATIC void |
| 1433 | xfs_register_buftarg( | 1433 | xfs_register_buftarg( |
| @@ -1679,21 +1679,60 @@ xfsbufd_wakeup( | |||
| 1679 | return 0; | 1679 | return 0; |
| 1680 | } | 1680 | } |
| 1681 | 1681 | ||
| 1682 | /* | ||
| 1683 | * Move as many buffers as specified to the supplied list | ||
| 1684 | * idicating if we skipped any buffers to prevent deadlocks. | ||
| 1685 | */ | ||
| 1686 | STATIC int | ||
| 1687 | xfs_buf_delwri_split( | ||
| 1688 | xfs_buftarg_t *target, | ||
| 1689 | struct list_head *list, | ||
| 1690 | unsigned long age) | ||
| 1691 | { | ||
| 1692 | xfs_buf_t *bp, *n; | ||
| 1693 | struct list_head *dwq = &target->bt_delwrite_queue; | ||
| 1694 | spinlock_t *dwlk = &target->bt_delwrite_lock; | ||
| 1695 | int skipped = 0; | ||
| 1696 | int force; | ||
| 1697 | |||
| 1698 | force = test_and_clear_bit(XBT_FORCE_FLUSH, &target->bt_flags); | ||
| 1699 | INIT_LIST_HEAD(list); | ||
| 1700 | spin_lock(dwlk); | ||
| 1701 | list_for_each_entry_safe(bp, n, dwq, b_list) { | ||
| 1702 | XB_TRACE(bp, "walkq1", (long)xfs_buf_ispin(bp)); | ||
| 1703 | ASSERT(bp->b_flags & XBF_DELWRI); | ||
| 1704 | |||
| 1705 | if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) { | ||
| 1706 | if (!force && | ||
| 1707 | time_before(jiffies, bp->b_queuetime + age)) { | ||
| 1708 | xfs_buf_unlock(bp); | ||
| 1709 | break; | ||
| 1710 | } | ||
| 1711 | |||
| 1712 | bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q| | ||
| 1713 | _XBF_RUN_QUEUES); | ||
| 1714 | bp->b_flags |= XBF_WRITE; | ||
| 1715 | list_move_tail(&bp->b_list, list); | ||
| 1716 | } else | ||
| 1717 | skipped++; | ||
| 1718 | } | ||
| 1719 | spin_unlock(dwlk); | ||
| 1720 | |||
| 1721 | return skipped; | ||
| 1722 | |||
| 1723 | } | ||
| 1724 | |||
| 1682 | STATIC int | 1725 | STATIC int |
| 1683 | xfsbufd( | 1726 | xfsbufd( |
| 1684 | void *data) | 1727 | void *data) |
| 1685 | { | 1728 | { |
| 1686 | struct list_head tmp; | 1729 | struct list_head tmp; |
| 1687 | unsigned long age; | 1730 | xfs_buftarg_t *target = (xfs_buftarg_t *)data; |
| 1688 | xfs_buftarg_t *target = (xfs_buftarg_t *)data; | 1731 | int count; |
| 1689 | xfs_buf_t *bp, *n; | 1732 | xfs_buf_t *bp; |
| 1690 | struct list_head *dwq = &target->bt_delwrite_queue; | ||
| 1691 | spinlock_t *dwlk = &target->bt_delwrite_lock; | ||
| 1692 | int count; | ||
| 1693 | 1733 | ||
| 1694 | current->flags |= PF_MEMALLOC; | 1734 | current->flags |= PF_MEMALLOC; |
| 1695 | 1735 | ||
| 1696 | INIT_LIST_HEAD(&tmp); | ||
| 1697 | do { | 1736 | do { |
| 1698 | if (unlikely(freezing(current))) { | 1737 | if (unlikely(freezing(current))) { |
| 1699 | set_bit(XBT_FORCE_SLEEP, &target->bt_flags); | 1738 | set_bit(XBT_FORCE_SLEEP, &target->bt_flags); |
| @@ -1705,37 +1744,17 @@ xfsbufd( | |||
| 1705 | schedule_timeout_interruptible( | 1744 | schedule_timeout_interruptible( |
| 1706 | xfs_buf_timer_centisecs * msecs_to_jiffies(10)); | 1745 | xfs_buf_timer_centisecs * msecs_to_jiffies(10)); |
| 1707 | 1746 | ||
| 1708 | count = 0; | 1747 | xfs_buf_delwri_split(target, &tmp, |
| 1709 | age = xfs_buf_age_centisecs * msecs_to_jiffies(10); | 1748 | xfs_buf_age_centisecs * msecs_to_jiffies(10)); |
| 1710 | spin_lock(dwlk); | ||
| 1711 | list_for_each_entry_safe(bp, n, dwq, b_list) { | ||
| 1712 | XB_TRACE(bp, "walkq1", (long)xfs_buf_ispin(bp)); | ||
| 1713 | ASSERT(bp->b_flags & XBF_DELWRI); | ||
| 1714 | |||
| 1715 | if (!xfs_buf_ispin(bp) && !xfs_buf_cond_lock(bp)) { | ||
| 1716 | if (!test_bit(XBT_FORCE_FLUSH, | ||
| 1717 | &target->bt_flags) && | ||
| 1718 | time_before(jiffies, | ||
| 1719 | bp->b_queuetime + age)) { | ||
| 1720 | xfs_buf_unlock(bp); | ||
| 1721 | break; | ||
| 1722 | } | ||
| 1723 | |||
| 1724 | bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q| | ||
| 1725 | _XBF_RUN_QUEUES); | ||
| 1726 | bp->b_flags |= XBF_WRITE; | ||
| 1727 | list_move_tail(&bp->b_list, &tmp); | ||
| 1728 | count++; | ||
| 1729 | } | ||
| 1730 | } | ||
| 1731 | spin_unlock(dwlk); | ||
| 1732 | 1749 | ||
| 1750 | count = 0; | ||
| 1733 | while (!list_empty(&tmp)) { | 1751 | while (!list_empty(&tmp)) { |
| 1734 | bp = list_entry(tmp.next, xfs_buf_t, b_list); | 1752 | bp = list_entry(tmp.next, xfs_buf_t, b_list); |
| 1735 | ASSERT(target == bp->b_target); | 1753 | ASSERT(target == bp->b_target); |
| 1736 | 1754 | ||
| 1737 | list_del_init(&bp->b_list); | 1755 | list_del_init(&bp->b_list); |
| 1738 | xfs_buf_iostrategy(bp); | 1756 | xfs_buf_iostrategy(bp); |
| 1757 | count++; | ||
| 1739 | } | 1758 | } |
| 1740 | 1759 | ||
| 1741 | if (as_list_len > 0) | 1760 | if (as_list_len > 0) |
| @@ -1743,7 +1762,6 @@ xfsbufd( | |||
| 1743 | if (count) | 1762 | if (count) |
| 1744 | blk_run_address_space(target->bt_mapping); | 1763 | blk_run_address_space(target->bt_mapping); |
| 1745 | 1764 | ||
| 1746 | clear_bit(XBT_FORCE_FLUSH, &target->bt_flags); | ||
| 1747 | } while (!kthread_should_stop()); | 1765 | } while (!kthread_should_stop()); |
| 1748 | 1766 | ||
| 1749 | return 0; | 1767 | return 0; |
| @@ -1756,40 +1774,24 @@ xfsbufd( | |||
| 1756 | */ | 1774 | */ |
| 1757 | int | 1775 | int |
| 1758 | xfs_flush_buftarg( | 1776 | xfs_flush_buftarg( |
| 1759 | xfs_buftarg_t *target, | 1777 | xfs_buftarg_t *target, |
| 1760 | int wait) | 1778 | int wait) |
| 1761 | { | 1779 | { |
| 1762 | struct list_head tmp; | 1780 | struct list_head tmp; |
| 1763 | xfs_buf_t *bp, *n; | 1781 | xfs_buf_t *bp, *n; |
| 1764 | int pincount = 0; | 1782 | int pincount = 0; |
| 1765 | struct list_head *dwq = &target->bt_delwrite_queue; | ||
| 1766 | spinlock_t *dwlk = &target->bt_delwrite_lock; | ||
| 1767 | 1783 | ||
| 1768 | xfs_buf_runall_queues(xfsdatad_workqueue); | 1784 | xfs_buf_runall_queues(xfsdatad_workqueue); |
| 1769 | xfs_buf_runall_queues(xfslogd_workqueue); | 1785 | xfs_buf_runall_queues(xfslogd_workqueue); |
| 1770 | 1786 | ||
| 1771 | INIT_LIST_HEAD(&tmp); | 1787 | set_bit(XBT_FORCE_FLUSH, &target->bt_flags); |
| 1772 | spin_lock(dwlk); | 1788 | pincount = xfs_buf_delwri_split(target, &tmp, 0); |
| 1773 | list_for_each_entry_safe(bp, n, dwq, b_list) { | ||
| 1774 | ASSERT(bp->b_target == target); | ||
| 1775 | ASSERT(bp->b_flags & (XBF_DELWRI | _XBF_DELWRI_Q)); | ||
| 1776 | XB_TRACE(bp, "walkq2", (long)xfs_buf_ispin(bp)); | ||
| 1777 | if (xfs_buf_ispin(bp)) { | ||
| 1778 | pincount++; | ||
| 1779 | continue; | ||
| 1780 | } | ||
| 1781 | |||
| 1782 | list_move_tail(&bp->b_list, &tmp); | ||
| 1783 | } | ||
| 1784 | spin_unlock(dwlk); | ||
| 1785 | 1789 | ||
| 1786 | /* | 1790 | /* |
| 1787 | * Dropped the delayed write list lock, now walk the temporary list | 1791 | * Dropped the delayed write list lock, now walk the temporary list |
| 1788 | */ | 1792 | */ |
| 1789 | list_for_each_entry_safe(bp, n, &tmp, b_list) { | 1793 | list_for_each_entry_safe(bp, n, &tmp, b_list) { |
| 1790 | xfs_buf_lock(bp); | 1794 | ASSERT(target == bp->b_target); |
| 1791 | bp->b_flags &= ~(XBF_DELWRI|_XBF_DELWRI_Q|_XBF_RUN_QUEUES); | ||
| 1792 | bp->b_flags |= XBF_WRITE; | ||
| 1793 | if (wait) | 1795 | if (wait) |
| 1794 | bp->b_flags &= ~XBF_ASYNC; | 1796 | bp->b_flags &= ~XBF_ASYNC; |
| 1795 | else | 1797 | else |
diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h index 9dd235cb0107..9e8ef8fef39f 100644 --- a/fs/xfs/linux-2.6/xfs_buf.h +++ b/fs/xfs/linux-2.6/xfs_buf.h | |||
| @@ -69,8 +69,8 @@ typedef enum { | |||
| 69 | } xfs_buf_flags_t; | 69 | } xfs_buf_flags_t; |
| 70 | 70 | ||
| 71 | typedef enum { | 71 | typedef enum { |
| 72 | XBT_FORCE_SLEEP = (0 << 1), | 72 | XBT_FORCE_SLEEP = 0, |
| 73 | XBT_FORCE_FLUSH = (1 << 1), | 73 | XBT_FORCE_FLUSH = 1, |
| 74 | } xfs_buftarg_flags_t; | 74 | } xfs_buftarg_flags_t; |
| 75 | 75 | ||
| 76 | typedef struct xfs_bufhash { | 76 | typedef struct xfs_bufhash { |
diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 5fb75d9151f2..e3a5fedac1ba 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c | |||
| @@ -24,7 +24,7 @@ | |||
| 24 | #include "xfs_mount.h" | 24 | #include "xfs_mount.h" |
| 25 | #include "xfs_export.h" | 25 | #include "xfs_export.h" |
| 26 | 26 | ||
| 27 | STATIC struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, }; | 27 | static struct dentry dotdot = { .d_name.name = "..", .d_name.len = 2, }; |
| 28 | 28 | ||
| 29 | /* | 29 | /* |
| 30 | * XFS encodes and decodes the fileid portion of NFS filehandles | 30 | * XFS encodes and decodes the fileid portion of NFS filehandles |
diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c index d26f5cd2ba70..cb51dc961355 100644 --- a/fs/xfs/linux-2.6/xfs_file.c +++ b/fs/xfs/linux-2.6/xfs_file.c | |||
| @@ -46,7 +46,7 @@ static struct vm_operations_struct xfs_file_vm_ops; | |||
| 46 | static struct vm_operations_struct xfs_dmapi_file_vm_ops; | 46 | static struct vm_operations_struct xfs_dmapi_file_vm_ops; |
| 47 | #endif | 47 | #endif |
| 48 | 48 | ||
| 49 | STATIC inline ssize_t | 49 | STATIC_INLINE ssize_t |
| 50 | __xfs_file_read( | 50 | __xfs_file_read( |
| 51 | struct kiocb *iocb, | 51 | struct kiocb *iocb, |
| 52 | const struct iovec *iov, | 52 | const struct iovec *iov, |
| @@ -84,7 +84,7 @@ xfs_file_aio_read_invis( | |||
| 84 | return __xfs_file_read(iocb, iov, nr_segs, IO_ISAIO|IO_INVIS, pos); | 84 | return __xfs_file_read(iocb, iov, nr_segs, IO_ISAIO|IO_INVIS, pos); |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | STATIC inline ssize_t | 87 | STATIC_INLINE ssize_t |
| 88 | __xfs_file_write( | 88 | __xfs_file_write( |
| 89 | struct kiocb *iocb, | 89 | struct kiocb *iocb, |
| 90 | const struct iovec *iov, | 90 | const struct iovec *iov, |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index f011c9cd0d62..ff5c41ff8d40 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
| @@ -41,8 +41,6 @@ | |||
| 41 | #include "xfs_error.h" | 41 | #include "xfs_error.h" |
| 42 | #include "xfs_rw.h" | 42 | #include "xfs_rw.h" |
| 43 | #include "xfs_acl.h" | 43 | #include "xfs_acl.h" |
| 44 | #include "xfs_cap.h" | ||
| 45 | #include "xfs_mac.h" | ||
| 46 | #include "xfs_attr.h" | 44 | #include "xfs_attr.h" |
| 47 | #include "xfs_bmap.h" | 45 | #include "xfs_bmap.h" |
| 48 | #include "xfs_buf_item.h" | 46 | #include "xfs_buf_item.h" |
| @@ -355,7 +353,6 @@ STATIC int | |||
| 355 | xfs_readlink_by_handle( | 353 | xfs_readlink_by_handle( |
| 356 | xfs_mount_t *mp, | 354 | xfs_mount_t *mp, |
| 357 | void __user *arg, | 355 | void __user *arg, |
| 358 | struct file *parfilp, | ||
| 359 | struct inode *parinode) | 356 | struct inode *parinode) |
| 360 | { | 357 | { |
| 361 | int error; | 358 | int error; |
| @@ -388,7 +385,7 @@ xfs_readlink_by_handle( | |||
| 388 | aiov.iov_len = olen; | 385 | aiov.iov_len = olen; |
| 389 | aiov.iov_base = hreq.ohandle; | 386 | aiov.iov_base = hreq.ohandle; |
| 390 | 387 | ||
| 391 | auio.uio_iov = &aiov; | 388 | auio.uio_iov = (struct kvec *)&aiov; |
| 392 | auio.uio_iovcnt = 1; | 389 | auio.uio_iovcnt = 1; |
| 393 | auio.uio_offset = 0; | 390 | auio.uio_offset = 0; |
| 394 | auio.uio_segflg = UIO_USERSPACE; | 391 | auio.uio_segflg = UIO_USERSPACE; |
| @@ -406,7 +403,6 @@ STATIC int | |||
| 406 | xfs_fssetdm_by_handle( | 403 | xfs_fssetdm_by_handle( |
| 407 | xfs_mount_t *mp, | 404 | xfs_mount_t *mp, |
| 408 | void __user *arg, | 405 | void __user *arg, |
| 409 | struct file *parfilp, | ||
| 410 | struct inode *parinode) | 406 | struct inode *parinode) |
| 411 | { | 407 | { |
| 412 | int error; | 408 | int error; |
| @@ -448,7 +444,6 @@ STATIC int | |||
| 448 | xfs_attrlist_by_handle( | 444 | xfs_attrlist_by_handle( |
| 449 | xfs_mount_t *mp, | 445 | xfs_mount_t *mp, |
| 450 | void __user *arg, | 446 | void __user *arg, |
| 451 | struct file *parfilp, | ||
| 452 | struct inode *parinode) | 447 | struct inode *parinode) |
| 453 | { | 448 | { |
| 454 | int error; | 449 | int error; |
| @@ -569,7 +564,6 @@ STATIC int | |||
| 569 | xfs_attrmulti_by_handle( | 564 | xfs_attrmulti_by_handle( |
| 570 | xfs_mount_t *mp, | 565 | xfs_mount_t *mp, |
| 571 | void __user *arg, | 566 | void __user *arg, |
| 572 | struct file *parfilp, | ||
| 573 | struct inode *parinode) | 567 | struct inode *parinode) |
| 574 | { | 568 | { |
| 575 | int error; | 569 | int error; |
| @@ -689,7 +683,6 @@ xfs_ioc_xattr( | |||
| 689 | STATIC int | 683 | STATIC int |
| 690 | xfs_ioc_getbmap( | 684 | xfs_ioc_getbmap( |
| 691 | bhv_desc_t *bdp, | 685 | bhv_desc_t *bdp, |
| 692 | struct file *filp, | ||
| 693 | int flags, | 686 | int flags, |
| 694 | unsigned int cmd, | 687 | unsigned int cmd, |
| 695 | void __user *arg); | 688 | void __user *arg); |
| @@ -788,7 +781,7 @@ xfs_ioctl( | |||
| 788 | 781 | ||
| 789 | case XFS_IOC_GETBMAP: | 782 | case XFS_IOC_GETBMAP: |
| 790 | case XFS_IOC_GETBMAPA: | 783 | case XFS_IOC_GETBMAPA: |
| 791 | return xfs_ioc_getbmap(bdp, filp, ioflags, cmd, arg); | 784 | return xfs_ioc_getbmap(bdp, ioflags, cmd, arg); |
| 792 | 785 | ||
| 793 | case XFS_IOC_GETBMAPX: | 786 | case XFS_IOC_GETBMAPX: |
| 794 | return xfs_ioc_getbmapx(bdp, arg); | 787 | return xfs_ioc_getbmapx(bdp, arg); |
| @@ -802,16 +795,16 @@ xfs_ioctl( | |||
| 802 | return xfs_open_by_handle(mp, arg, filp, inode); | 795 | return xfs_open_by_handle(mp, arg, filp, inode); |
| 803 | 796 | ||
| 804 | case XFS_IOC_FSSETDM_BY_HANDLE: | 797 | case XFS_IOC_FSSETDM_BY_HANDLE: |
| 805 | return xfs_fssetdm_by_handle(mp, arg, filp, inode); | 798 | return xfs_fssetdm_by_handle(mp, arg, inode); |
| 806 | 799 | ||
| 807 | case XFS_IOC_READLINK_BY_HANDLE: | 800 | case XFS_IOC_READLINK_BY_HANDLE: |
| 808 | return xfs_readlink_by_handle(mp, arg, filp, inode); | 801 | return xfs_readlink_by_handle(mp, arg, inode); |
| 809 | 802 | ||
| 810 | case XFS_IOC_ATTRLIST_BY_HANDLE: | 803 | case XFS_IOC_ATTRLIST_BY_HANDLE: |
| 811 | return xfs_attrlist_by_handle(mp, arg, filp, inode); | 804 | return xfs_attrlist_by_handle(mp, arg, inode); |
| 812 | 805 | ||
| 813 | case XFS_IOC_ATTRMULTI_BY_HANDLE: | 806 | case XFS_IOC_ATTRMULTI_BY_HANDLE: |
| 814 | return xfs_attrmulti_by_handle(mp, arg, filp, inode); | 807 | return xfs_attrmulti_by_handle(mp, arg, inode); |
| 815 | 808 | ||
| 816 | case XFS_IOC_SWAPEXT: { | 809 | case XFS_IOC_SWAPEXT: { |
| 817 | error = xfs_swapext((struct xfs_swapext __user *)arg); | 810 | error = xfs_swapext((struct xfs_swapext __user *)arg); |
| @@ -1095,11 +1088,6 @@ xfs_ioc_fsgeometry( | |||
| 1095 | /* | 1088 | /* |
| 1096 | * Linux extended inode flags interface. | 1089 | * Linux extended inode flags interface. |
| 1097 | */ | 1090 | */ |
| 1098 | #define LINUX_XFLAG_SYNC 0x00000008 /* Synchronous updates */ | ||
| 1099 | #define LINUX_XFLAG_IMMUTABLE 0x00000010 /* Immutable file */ | ||
| 1100 | #define LINUX_XFLAG_APPEND 0x00000020 /* writes to file may only append */ | ||
| 1101 | #define LINUX_XFLAG_NODUMP 0x00000040 /* do not dump file */ | ||
| 1102 | #define LINUX_XFLAG_NOATIME 0x00000080 /* do not update atime */ | ||
| 1103 | 1091 | ||
| 1104 | STATIC unsigned int | 1092 | STATIC unsigned int |
| 1105 | xfs_merge_ioc_xflags( | 1093 | xfs_merge_ioc_xflags( |
| @@ -1108,23 +1096,23 @@ xfs_merge_ioc_xflags( | |||
| 1108 | { | 1096 | { |
| 1109 | unsigned int xflags = start; | 1097 | unsigned int xflags = start; |
| 1110 | 1098 | ||
| 1111 | if (flags & LINUX_XFLAG_IMMUTABLE) | 1099 | if (flags & FS_IMMUTABLE_FL) |
| 1112 | xflags |= XFS_XFLAG_IMMUTABLE; | 1100 | xflags |= XFS_XFLAG_IMMUTABLE; |
| 1113 | else | 1101 | else |
| 1114 | xflags &= ~XFS_XFLAG_IMMUTABLE; | 1102 | xflags &= ~XFS_XFLAG_IMMUTABLE; |
| 1115 | if (flags & LINUX_XFLAG_APPEND) | 1103 | if (flags & FS_APPEND_FL) |
| 1116 | xflags |= XFS_XFLAG_APPEND; | 1104 | xflags |= XFS_XFLAG_APPEND; |
| 1117 | else | 1105 | else |
| 1118 | xflags &= ~XFS_XFLAG_APPEND; | 1106 | xflags &= ~XFS_XFLAG_APPEND; |
| 1119 | if (flags & LINUX_XFLAG_SYNC) | 1107 | if (flags & FS_SYNC_FL) |
| 1120 | xflags |= XFS_XFLAG_SYNC; | 1108 | xflags |= XFS_XFLAG_SYNC; |
| 1121 | else | 1109 | else |
| 1122 | xflags &= ~XFS_XFLAG_SYNC; | 1110 | xflags &= ~XFS_XFLAG_SYNC; |
| 1123 | if (flags & LINUX_XFLAG_NOATIME) | 1111 | if (flags & FS_NOATIME_FL) |
| 1124 | xflags |= XFS_XFLAG_NOATIME; | 1112 | xflags |= XFS_XFLAG_NOATIME; |
| 1125 | else | 1113 | else |
| 1126 | xflags &= ~XFS_XFLAG_NOATIME; | 1114 | xflags &= ~XFS_XFLAG_NOATIME; |
| 1127 | if (flags & LINUX_XFLAG_NODUMP) | 1115 | if (flags & FS_NODUMP_FL) |
| 1128 | xflags |= XFS_XFLAG_NODUMP; | 1116 | xflags |= XFS_XFLAG_NODUMP; |
| 1129 | else | 1117 | else |
| 1130 | xflags &= ~XFS_XFLAG_NODUMP; | 1118 | xflags &= ~XFS_XFLAG_NODUMP; |
| @@ -1139,15 +1127,15 @@ xfs_di2lxflags( | |||
| 1139 | unsigned int flags = 0; | 1127 | unsigned int flags = 0; |
| 1140 | 1128 | ||
| 1141 | if (di_flags & XFS_DIFLAG_IMMUTABLE) | 1129 | if (di_flags & XFS_DIFLAG_IMMUTABLE) |
| 1142 | flags |= LINUX_XFLAG_IMMUTABLE; | 1130 | flags |= FS_IMMUTABLE_FL; |
| 1143 | if (di_flags & XFS_DIFLAG_APPEND) | 1131 | if (di_flags & XFS_DIFLAG_APPEND) |
| 1144 | flags |= LINUX_XFLAG_APPEND; | 1132 | flags |= FS_APPEND_FL; |
| 1145 | if (di_flags & XFS_DIFLAG_SYNC) | 1133 | if (di_flags & XFS_DIFLAG_SYNC) |
| 1146 | flags |= LINUX_XFLAG_SYNC; | 1134 | flags |= FS_SYNC_FL; |
| 1147 | if (di_flags & XFS_DIFLAG_NOATIME) | 1135 | if (di_flags & XFS_DIFLAG_NOATIME) |
| 1148 | flags |= LINUX_XFLAG_NOATIME; | 1136 | flags |= FS_NOATIME_FL; |
| 1149 | if (di_flags & XFS_DIFLAG_NODUMP) | 1137 | if (di_flags & XFS_DIFLAG_NODUMP) |
| 1150 | flags |= LINUX_XFLAG_NODUMP; | 1138 | flags |= FS_NODUMP_FL; |
| 1151 | return flags; | 1139 | return flags; |
| 1152 | } | 1140 | } |
| 1153 | 1141 | ||
| @@ -1247,9 +1235,9 @@ xfs_ioc_xattr( | |||
| 1247 | break; | 1235 | break; |
| 1248 | } | 1236 | } |
| 1249 | 1237 | ||
| 1250 | if (flags & ~(LINUX_XFLAG_IMMUTABLE | LINUX_XFLAG_APPEND | \ | 1238 | if (flags & ~(FS_IMMUTABLE_FL | FS_APPEND_FL | \ |
| 1251 | LINUX_XFLAG_NOATIME | LINUX_XFLAG_NODUMP | \ | 1239 | FS_NOATIME_FL | FS_NODUMP_FL | \ |
| 1252 | LINUX_XFLAG_SYNC)) { | 1240 | FS_SYNC_FL)) { |
| 1253 | error = -EOPNOTSUPP; | 1241 | error = -EOPNOTSUPP; |
| 1254 | break; | 1242 | break; |
| 1255 | } | 1243 | } |
| @@ -1281,7 +1269,6 @@ xfs_ioc_xattr( | |||
| 1281 | STATIC int | 1269 | STATIC int |
| 1282 | xfs_ioc_getbmap( | 1270 | xfs_ioc_getbmap( |
| 1283 | bhv_desc_t *bdp, | 1271 | bhv_desc_t *bdp, |
| 1284 | struct file *filp, | ||
| 1285 | int ioflags, | 1272 | int ioflags, |
| 1286 | unsigned int cmd, | 1273 | unsigned int cmd, |
| 1287 | void __user *arg) | 1274 | void __user *arg) |
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 3ba814ae3bba..aa4c3b8cae01 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include "xfs_itable.h" | 43 | #include "xfs_itable.h" |
| 44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 45 | #include "xfs_acl.h" | 45 | #include "xfs_acl.h" |
| 46 | #include "xfs_cap.h" | ||
| 47 | #include "xfs_mac.h" | ||
| 48 | #include "xfs_attr.h" | 46 | #include "xfs_attr.h" |
| 49 | #include "xfs_buf_item.h" | 47 | #include "xfs_buf_item.h" |
| 50 | #include "xfs_utils.h" | 48 | #include "xfs_utils.h" |
| @@ -250,13 +248,13 @@ xfs_init_security( | |||
| 250 | * | 248 | * |
| 251 | * XXX(hch): nfsd is broken, better fix it instead. | 249 | * XXX(hch): nfsd is broken, better fix it instead. |
| 252 | */ | 250 | */ |
| 253 | STATIC inline int | 251 | STATIC_INLINE int |
| 254 | xfs_has_fs_struct(struct task_struct *task) | 252 | xfs_has_fs_struct(struct task_struct *task) |
| 255 | { | 253 | { |
| 256 | return (task->fs != init_task.fs); | 254 | return (task->fs != init_task.fs); |
| 257 | } | 255 | } |
| 258 | 256 | ||
| 259 | STATIC inline void | 257 | STATIC void |
| 260 | xfs_cleanup_inode( | 258 | xfs_cleanup_inode( |
| 261 | bhv_vnode_t *dvp, | 259 | bhv_vnode_t *dvp, |
| 262 | bhv_vnode_t *vp, | 260 | bhv_vnode_t *vp, |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c index 65e79b471d49..ff8d64eba9f8 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.c +++ b/fs/xfs/linux-2.6/xfs_lrw.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include "xfs_itable.h" | 43 | #include "xfs_itable.h" |
| 44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 45 | #include "xfs_acl.h" | 45 | #include "xfs_acl.h" |
| 46 | #include "xfs_cap.h" | ||
| 47 | #include "xfs_mac.h" | ||
| 48 | #include "xfs_attr.h" | 46 | #include "xfs_attr.h" |
| 49 | #include "xfs_inode_item.h" | 47 | #include "xfs_inode_item.h" |
| 50 | #include "xfs_buf_item.h" | 48 | #include "xfs_buf_item.h" |
| @@ -134,13 +132,11 @@ STATIC int | |||
| 134 | xfs_iozero( | 132 | xfs_iozero( |
| 135 | struct inode *ip, /* inode */ | 133 | struct inode *ip, /* inode */ |
| 136 | loff_t pos, /* offset in file */ | 134 | loff_t pos, /* offset in file */ |
| 137 | size_t count, /* size of data to zero */ | 135 | size_t count) /* size of data to zero */ |
| 138 | loff_t end_size) /* max file size to set */ | ||
| 139 | { | 136 | { |
| 140 | unsigned bytes; | 137 | unsigned bytes; |
| 141 | struct page *page; | 138 | struct page *page; |
| 142 | struct address_space *mapping; | 139 | struct address_space *mapping; |
| 143 | char *kaddr; | ||
| 144 | int status; | 140 | int status; |
| 145 | 141 | ||
| 146 | mapping = ip->i_mapping; | 142 | mapping = ip->i_mapping; |
| @@ -158,26 +154,21 @@ xfs_iozero( | |||
| 158 | if (!page) | 154 | if (!page) |
| 159 | break; | 155 | break; |
| 160 | 156 | ||
| 161 | kaddr = kmap(page); | ||
| 162 | status = mapping->a_ops->prepare_write(NULL, page, offset, | 157 | status = mapping->a_ops->prepare_write(NULL, page, offset, |
| 163 | offset + bytes); | 158 | offset + bytes); |
| 164 | if (status) { | 159 | if (status) |
| 165 | goto unlock; | 160 | goto unlock; |
| 166 | } | ||
| 167 | 161 | ||
| 168 | memset((void *) (kaddr + offset), 0, bytes); | 162 | memclear_highpage_flush(page, offset, bytes); |
| 169 | flush_dcache_page(page); | 163 | |
| 170 | status = mapping->a_ops->commit_write(NULL, page, offset, | 164 | status = mapping->a_ops->commit_write(NULL, page, offset, |
| 171 | offset + bytes); | 165 | offset + bytes); |
| 172 | if (!status) { | 166 | if (!status) { |
| 173 | pos += bytes; | 167 | pos += bytes; |
| 174 | count -= bytes; | 168 | count -= bytes; |
| 175 | if (pos > i_size_read(ip)) | ||
| 176 | i_size_write(ip, pos < end_size ? pos : end_size); | ||
| 177 | } | 169 | } |
| 178 | 170 | ||
| 179 | unlock: | 171 | unlock: |
| 180 | kunmap(page); | ||
| 181 | unlock_page(page); | 172 | unlock_page(page); |
| 182 | page_cache_release(page); | 173 | page_cache_release(page); |
| 183 | if (status) | 174 | if (status) |
| @@ -449,8 +440,8 @@ STATIC int /* error (positive) */ | |||
| 449 | xfs_zero_last_block( | 440 | xfs_zero_last_block( |
| 450 | struct inode *ip, | 441 | struct inode *ip, |
| 451 | xfs_iocore_t *io, | 442 | xfs_iocore_t *io, |
| 452 | xfs_fsize_t isize, | 443 | xfs_fsize_t offset, |
| 453 | xfs_fsize_t end_size) | 444 | xfs_fsize_t isize) |
| 454 | { | 445 | { |
| 455 | xfs_fileoff_t last_fsb; | 446 | xfs_fileoff_t last_fsb; |
| 456 | xfs_mount_t *mp = io->io_mount; | 447 | xfs_mount_t *mp = io->io_mount; |
| @@ -459,7 +450,6 @@ xfs_zero_last_block( | |||
| 459 | int zero_len; | 450 | int zero_len; |
| 460 | int error = 0; | 451 | int error = 0; |
| 461 | xfs_bmbt_irec_t imap; | 452 | xfs_bmbt_irec_t imap; |
| 462 | loff_t loff; | ||
| 463 | 453 | ||
| 464 | ASSERT(ismrlocked(io->io_lock, MR_UPDATE) != 0); | 454 | ASSERT(ismrlocked(io->io_lock, MR_UPDATE) != 0); |
| 465 | 455 | ||
| @@ -494,9 +484,10 @@ xfs_zero_last_block( | |||
| 494 | */ | 484 | */ |
| 495 | XFS_IUNLOCK(mp, io, XFS_ILOCK_EXCL| XFS_EXTSIZE_RD); | 485 | XFS_IUNLOCK(mp, io, XFS_ILOCK_EXCL| XFS_EXTSIZE_RD); |
| 496 | 486 | ||
| 497 | loff = XFS_FSB_TO_B(mp, last_fsb); | ||
| 498 | zero_len = mp->m_sb.sb_blocksize - zero_offset; | 487 | zero_len = mp->m_sb.sb_blocksize - zero_offset; |
| 499 | error = xfs_iozero(ip, loff + zero_offset, zero_len, end_size); | 488 | if (isize + zero_len > offset) |
| 489 | zero_len = offset - isize; | ||
| 490 | error = xfs_iozero(ip, isize, zero_len); | ||
| 500 | 491 | ||
| 501 | XFS_ILOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); | 492 | XFS_ILOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); |
| 502 | ASSERT(error >= 0); | 493 | ASSERT(error >= 0); |
| @@ -519,14 +510,15 @@ xfs_zero_eof( | |||
| 519 | bhv_vnode_t *vp, | 510 | bhv_vnode_t *vp, |
| 520 | xfs_iocore_t *io, | 511 | xfs_iocore_t *io, |
| 521 | xfs_off_t offset, /* starting I/O offset */ | 512 | xfs_off_t offset, /* starting I/O offset */ |
| 522 | xfs_fsize_t isize, /* current inode size */ | 513 | xfs_fsize_t isize) /* current inode size */ |
| 523 | xfs_fsize_t end_size) /* terminal inode size */ | ||
| 524 | { | 514 | { |
| 525 | struct inode *ip = vn_to_inode(vp); | 515 | struct inode *ip = vn_to_inode(vp); |
| 526 | xfs_fileoff_t start_zero_fsb; | 516 | xfs_fileoff_t start_zero_fsb; |
| 527 | xfs_fileoff_t end_zero_fsb; | 517 | xfs_fileoff_t end_zero_fsb; |
| 528 | xfs_fileoff_t zero_count_fsb; | 518 | xfs_fileoff_t zero_count_fsb; |
| 529 | xfs_fileoff_t last_fsb; | 519 | xfs_fileoff_t last_fsb; |
| 520 | xfs_fileoff_t zero_off; | ||
| 521 | xfs_fsize_t zero_len; | ||
| 530 | xfs_mount_t *mp = io->io_mount; | 522 | xfs_mount_t *mp = io->io_mount; |
| 531 | int nimaps; | 523 | int nimaps; |
| 532 | int error = 0; | 524 | int error = 0; |
| @@ -540,7 +532,7 @@ xfs_zero_eof( | |||
| 540 | * First handle zeroing the block on which isize resides. | 532 | * First handle zeroing the block on which isize resides. |
| 541 | * We only zero a part of that block so it is handled specially. | 533 | * We only zero a part of that block so it is handled specially. |
| 542 | */ | 534 | */ |
| 543 | error = xfs_zero_last_block(ip, io, isize, end_size); | 535 | error = xfs_zero_last_block(ip, io, offset, isize); |
| 544 | if (error) { | 536 | if (error) { |
| 545 | ASSERT(ismrlocked(io->io_lock, MR_UPDATE)); | 537 | ASSERT(ismrlocked(io->io_lock, MR_UPDATE)); |
| 546 | ASSERT(ismrlocked(io->io_iolock, MR_UPDATE)); | 538 | ASSERT(ismrlocked(io->io_iolock, MR_UPDATE)); |
| @@ -601,10 +593,13 @@ xfs_zero_eof( | |||
| 601 | */ | 593 | */ |
| 602 | XFS_IUNLOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); | 594 | XFS_IUNLOCK(mp, io, XFS_ILOCK_EXCL|XFS_EXTSIZE_RD); |
| 603 | 595 | ||
| 604 | error = xfs_iozero(ip, | 596 | zero_off = XFS_FSB_TO_B(mp, start_zero_fsb); |
| 605 | XFS_FSB_TO_B(mp, start_zero_fsb), | 597 | zero_len = XFS_FSB_TO_B(mp, imap.br_blockcount); |
| 606 | XFS_FSB_TO_B(mp, imap.br_blockcount), | 598 | |
| 607 | end_size); | 599 | if ((zero_off + zero_len) > offset) |
| 600 | zero_len = offset - zero_off; | ||
| 601 | |||
| 602 | error = xfs_iozero(ip, zero_off, zero_len); | ||
| 608 | if (error) { | 603 | if (error) { |
| 609 | goto out_lock; | 604 | goto out_lock; |
| 610 | } | 605 | } |
| @@ -783,8 +778,7 @@ start: | |||
| 783 | */ | 778 | */ |
| 784 | 779 | ||
| 785 | if (pos > isize) { | 780 | if (pos > isize) { |
| 786 | error = xfs_zero_eof(BHV_TO_VNODE(bdp), io, pos, | 781 | error = xfs_zero_eof(BHV_TO_VNODE(bdp), io, pos, isize); |
| 787 | isize, pos + count); | ||
| 788 | if (error) { | 782 | if (error) { |
| 789 | xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); | 783 | xfs_iunlock(xip, XFS_ILOCK_EXCL|iolock); |
| 790 | goto out_unlock_mutex; | 784 | goto out_unlock_mutex; |
diff --git a/fs/xfs/linux-2.6/xfs_lrw.h b/fs/xfs/linux-2.6/xfs_lrw.h index c77e62efb742..7ac51b1d2161 100644 --- a/fs/xfs/linux-2.6/xfs_lrw.h +++ b/fs/xfs/linux-2.6/xfs_lrw.h | |||
| @@ -83,7 +83,7 @@ extern int xfs_bdstrat_cb(struct xfs_buf *); | |||
| 83 | extern int xfs_dev_is_read_only(struct xfs_mount *, char *); | 83 | extern int xfs_dev_is_read_only(struct xfs_mount *, char *); |
| 84 | 84 | ||
| 85 | extern int xfs_zero_eof(struct bhv_vnode *, struct xfs_iocore *, xfs_off_t, | 85 | extern int xfs_zero_eof(struct bhv_vnode *, struct xfs_iocore *, xfs_off_t, |
| 86 | xfs_fsize_t, xfs_fsize_t); | 86 | xfs_fsize_t); |
| 87 | extern ssize_t xfs_read(struct bhv_desc *, struct kiocb *, | 87 | extern ssize_t xfs_read(struct bhv_desc *, struct kiocb *, |
| 88 | const struct iovec *, unsigned int, | 88 | const struct iovec *, unsigned int, |
| 89 | loff_t *, int, struct cred *); | 89 | loff_t *, int, struct cred *); |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index b93265b7c79c..1a4103ca593c 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include "xfs_itable.h" | 43 | #include "xfs_itable.h" |
| 44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 45 | #include "xfs_acl.h" | 45 | #include "xfs_acl.h" |
| 46 | #include "xfs_cap.h" | ||
| 47 | #include "xfs_mac.h" | ||
| 48 | #include "xfs_attr.h" | 46 | #include "xfs_attr.h" |
| 49 | #include "xfs_buf_item.h" | 47 | #include "xfs_buf_item.h" |
| 50 | #include "xfs_utils.h" | 48 | #include "xfs_utils.h" |
| @@ -58,10 +56,10 @@ | |||
| 58 | #include <linux/kthread.h> | 56 | #include <linux/kthread.h> |
| 59 | #include <linux/freezer.h> | 57 | #include <linux/freezer.h> |
| 60 | 58 | ||
| 61 | STATIC struct quotactl_ops xfs_quotactl_operations; | 59 | static struct quotactl_ops xfs_quotactl_operations; |
| 62 | STATIC struct super_operations xfs_super_operations; | 60 | static struct super_operations xfs_super_operations; |
| 63 | STATIC kmem_zone_t *xfs_vnode_zone; | 61 | static kmem_zone_t *xfs_vnode_zone; |
| 64 | STATIC kmem_zone_t *xfs_ioend_zone; | 62 | static kmem_zone_t *xfs_ioend_zone; |
| 65 | mempool_t *xfs_ioend_pool; | 63 | mempool_t *xfs_ioend_pool; |
| 66 | 64 | ||
| 67 | STATIC struct xfs_mount_args * | 65 | STATIC struct xfs_mount_args * |
| @@ -121,7 +119,7 @@ xfs_max_file_offset( | |||
| 121 | return (((__uint64_t)pagefactor) << bitshift) - 1; | 119 | return (((__uint64_t)pagefactor) << bitshift) - 1; |
| 122 | } | 120 | } |
| 123 | 121 | ||
| 124 | STATIC __inline__ void | 122 | STATIC_INLINE void |
| 125 | xfs_set_inodeops( | 123 | xfs_set_inodeops( |
| 126 | struct inode *inode) | 124 | struct inode *inode) |
| 127 | { | 125 | { |
| @@ -147,7 +145,7 @@ xfs_set_inodeops( | |||
| 147 | } | 145 | } |
| 148 | } | 146 | } |
| 149 | 147 | ||
| 150 | STATIC __inline__ void | 148 | STATIC_INLINE void |
| 151 | xfs_revalidate_inode( | 149 | xfs_revalidate_inode( |
| 152 | xfs_mount_t *mp, | 150 | xfs_mount_t *mp, |
| 153 | bhv_vnode_t *vp, | 151 | bhv_vnode_t *vp, |
| @@ -553,7 +551,6 @@ vfs_sync_worker( | |||
| 553 | error = bhv_vfs_sync(vfsp, SYNC_FSDATA | SYNC_BDFLUSH | \ | 551 | error = bhv_vfs_sync(vfsp, SYNC_FSDATA | SYNC_BDFLUSH | \ |
| 554 | SYNC_ATTR | SYNC_REFCACHE, NULL); | 552 | SYNC_ATTR | SYNC_REFCACHE, NULL); |
| 555 | vfsp->vfs_sync_seq++; | 553 | vfsp->vfs_sync_seq++; |
| 556 | wmb(); | ||
| 557 | wake_up(&vfsp->vfs_wait_single_sync_task); | 554 | wake_up(&vfsp->vfs_wait_single_sync_task); |
| 558 | } | 555 | } |
| 559 | 556 | ||
| @@ -659,9 +656,17 @@ xfs_fs_sync_super( | |||
| 659 | int error; | 656 | int error; |
| 660 | int flags; | 657 | int flags; |
| 661 | 658 | ||
| 662 | if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) | 659 | if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) { |
| 663 | flags = SYNC_QUIESCE; | 660 | /* |
| 664 | else | 661 | * First stage of freeze - no more writers will make progress |
| 662 | * now we are here, so we flush delwri and delalloc buffers | ||
| 663 | * here, then wait for all I/O to complete. Data is frozen at | ||
| 664 | * that point. Metadata is not frozen, transactions can still | ||
| 665 | * occur here so don't bother flushing the buftarg (i.e | ||
| 666 | * SYNC_QUIESCE) because it'll just get dirty again. | ||
| 667 | */ | ||
| 668 | flags = SYNC_FSDATA | SYNC_DELWRI | SYNC_WAIT | SYNC_IOWAIT; | ||
| 669 | } else | ||
| 665 | flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0); | 670 | flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0); |
| 666 | 671 | ||
| 667 | error = bhv_vfs_sync(vfsp, flags, NULL); | 672 | error = bhv_vfs_sync(vfsp, flags, NULL); |
| @@ -873,7 +878,7 @@ xfs_fs_get_sb( | |||
| 873 | mnt); | 878 | mnt); |
| 874 | } | 879 | } |
| 875 | 880 | ||
| 876 | STATIC struct super_operations xfs_super_operations = { | 881 | static struct super_operations xfs_super_operations = { |
| 877 | .alloc_inode = xfs_fs_alloc_inode, | 882 | .alloc_inode = xfs_fs_alloc_inode, |
| 878 | .destroy_inode = xfs_fs_destroy_inode, | 883 | .destroy_inode = xfs_fs_destroy_inode, |
| 879 | .write_inode = xfs_fs_write_inode, | 884 | .write_inode = xfs_fs_write_inode, |
| @@ -887,7 +892,7 @@ STATIC struct super_operations xfs_super_operations = { | |||
| 887 | .show_options = xfs_fs_show_options, | 892 | .show_options = xfs_fs_show_options, |
| 888 | }; | 893 | }; |
| 889 | 894 | ||
| 890 | STATIC struct quotactl_ops xfs_quotactl_operations = { | 895 | static struct quotactl_ops xfs_quotactl_operations = { |
| 891 | .quota_sync = xfs_fs_quotasync, | 896 | .quota_sync = xfs_fs_quotasync, |
| 892 | .get_xstate = xfs_fs_getxstate, | 897 | .get_xstate = xfs_fs_getxstate, |
| 893 | .set_xstate = xfs_fs_setxstate, | 898 | .set_xstate = xfs_fs_setxstate, |
diff --git a/fs/xfs/linux-2.6/xfs_sysctl.c b/fs/xfs/linux-2.6/xfs_sysctl.c index af246532fbfb..5c46c35a97a5 100644 --- a/fs/xfs/linux-2.6/xfs_sysctl.c +++ b/fs/xfs/linux-2.6/xfs_sysctl.c | |||
| @@ -54,102 +54,204 @@ xfs_stats_clear_proc_handler( | |||
| 54 | } | 54 | } |
| 55 | #endif /* CONFIG_PROC_FS */ | 55 | #endif /* CONFIG_PROC_FS */ |
| 56 | 56 | ||
| 57 | STATIC ctl_table xfs_table[] = { | 57 | static ctl_table xfs_table[] = { |
| 58 | {XFS_RESTRICT_CHOWN, "restrict_chown", &xfs_params.restrict_chown.val, | 58 | { |
| 59 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 59 | .ctl_name = XFS_RESTRICT_CHOWN, |
| 60 | &sysctl_intvec, NULL, | 60 | .procname = "restrict_chown", |
| 61 | &xfs_params.restrict_chown.min, &xfs_params.restrict_chown.max}, | 61 | .data = &xfs_params.restrict_chown.val, |
| 62 | 62 | .maxlen = sizeof(int), | |
| 63 | {XFS_SGID_INHERIT, "irix_sgid_inherit", &xfs_params.sgid_inherit.val, | 63 | .mode = 0644, |
| 64 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 64 | .proc_handler = &proc_dointvec_minmax, |
| 65 | &sysctl_intvec, NULL, | 65 | .strategy = &sysctl_intvec, |
| 66 | &xfs_params.sgid_inherit.min, &xfs_params.sgid_inherit.max}, | 66 | .extra1 = &xfs_params.restrict_chown.min, |
| 67 | 67 | .extra2 = &xfs_params.restrict_chown.max | |
| 68 | {XFS_SYMLINK_MODE, "irix_symlink_mode", &xfs_params.symlink_mode.val, | 68 | }, |
| 69 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 69 | { |
| 70 | &sysctl_intvec, NULL, | 70 | .ctl_name = XFS_SGID_INHERIT, |
| 71 | &xfs_params.symlink_mode.min, &xfs_params.symlink_mode.max}, | 71 | .procname = "irix_sgid_inherit", |
| 72 | 72 | .data = &xfs_params.sgid_inherit.val, | |
| 73 | {XFS_PANIC_MASK, "panic_mask", &xfs_params.panic_mask.val, | 73 | .maxlen = sizeof(int), |
| 74 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 74 | .mode = 0644, |
| 75 | &sysctl_intvec, NULL, | 75 | .proc_handler = &proc_dointvec_minmax, |
| 76 | &xfs_params.panic_mask.min, &xfs_params.panic_mask.max}, | 76 | .strategy = &sysctl_intvec, |
| 77 | 77 | .extra1 = &xfs_params.sgid_inherit.min, | |
| 78 | {XFS_ERRLEVEL, "error_level", &xfs_params.error_level.val, | 78 | .extra2 = &xfs_params.sgid_inherit.max |
| 79 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 79 | }, |
| 80 | &sysctl_intvec, NULL, | 80 | { |
| 81 | &xfs_params.error_level.min, &xfs_params.error_level.max}, | 81 | .ctl_name = XFS_SYMLINK_MODE, |
| 82 | 82 | .procname = "irix_symlink_mode", | |
| 83 | {XFS_SYNCD_TIMER, "xfssyncd_centisecs", &xfs_params.syncd_timer.val, | 83 | .data = &xfs_params.symlink_mode.val, |
| 84 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 84 | .maxlen = sizeof(int), |
| 85 | &sysctl_intvec, NULL, | 85 | .mode = 0644, |
| 86 | &xfs_params.syncd_timer.min, &xfs_params.syncd_timer.max}, | 86 | .proc_handler = &proc_dointvec_minmax, |
| 87 | 87 | .strategy = &sysctl_intvec, | |
| 88 | {XFS_INHERIT_SYNC, "inherit_sync", &xfs_params.inherit_sync.val, | 88 | .extra1 = &xfs_params.symlink_mode.min, |
| 89 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 89 | .extra2 = &xfs_params.symlink_mode.max |
| 90 | &sysctl_intvec, NULL, | 90 | }, |
| 91 | &xfs_params.inherit_sync.min, &xfs_params.inherit_sync.max}, | 91 | { |
| 92 | 92 | .ctl_name = XFS_PANIC_MASK, | |
| 93 | {XFS_INHERIT_NODUMP, "inherit_nodump", &xfs_params.inherit_nodump.val, | 93 | .procname = "panic_mask", |
| 94 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 94 | .data = &xfs_params.panic_mask.val, |
| 95 | &sysctl_intvec, NULL, | 95 | .maxlen = sizeof(int), |
| 96 | &xfs_params.inherit_nodump.min, &xfs_params.inherit_nodump.max}, | 96 | .mode = 0644, |
| 97 | 97 | .proc_handler = &proc_dointvec_minmax, | |
| 98 | {XFS_INHERIT_NOATIME, "inherit_noatime", &xfs_params.inherit_noatim.val, | 98 | .strategy = &sysctl_intvec, |
| 99 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | 99 | .extra1 = &xfs_params.panic_mask.min, |
| 100 | &sysctl_intvec, NULL, | 100 | .extra2 = &xfs_params.panic_mask.max |
| 101 | &xfs_params.inherit_noatim.min, &xfs_params.inherit_noatim.max}, | 101 | }, |
| 102 | |||
| 103 | {XFS_BUF_TIMER, "xfsbufd_centisecs", &xfs_params.xfs_buf_timer.val, | ||
| 104 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | ||
| 105 | &sysctl_intvec, NULL, | ||
| 106 | &xfs_params.xfs_buf_timer.min, &xfs_params.xfs_buf_timer.max}, | ||
| 107 | |||
| 108 | {XFS_BUF_AGE, "age_buffer_centisecs", &xfs_params.xfs_buf_age.val, | ||
| 109 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | ||
| 110 | &sysctl_intvec, NULL, | ||
| 111 | &xfs_params.xfs_buf_age.min, &xfs_params.xfs_buf_age.max}, | ||
| 112 | |||
| 113 | {XFS_INHERIT_NOSYM, "inherit_nosymlinks", &xfs_params.inherit_nosym.val, | ||
| 114 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | ||
| 115 | &sysctl_intvec, NULL, | ||
| 116 | &xfs_params.inherit_nosym.min, &xfs_params.inherit_nosym.max}, | ||
| 117 | |||
| 118 | {XFS_ROTORSTEP, "rotorstep", &xfs_params.rotorstep.val, | ||
| 119 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | ||
| 120 | &sysctl_intvec, NULL, | ||
| 121 | &xfs_params.rotorstep.min, &xfs_params.rotorstep.max}, | ||
| 122 | |||
| 123 | {XFS_INHERIT_NODFRG, "inherit_nodefrag", &xfs_params.inherit_nodfrg.val, | ||
| 124 | sizeof(int), 0644, NULL, &proc_dointvec_minmax, | ||
| 125 | &sysctl_intvec, NULL, | ||
| 126 | &xfs_params.inherit_nodfrg.min, &xfs_params.inherit_nodfrg.max}, | ||
| 127 | 102 | ||
| 103 | { | ||
| 104 | .ctl_name = XFS_ERRLEVEL, | ||
| 105 | .procname = "error_level", | ||
| 106 | .data = &xfs_params.error_level.val, | ||
| 107 | .maxlen = sizeof(int), | ||
| 108 | .mode = 0644, | ||
| 109 | .proc_handler = &proc_dointvec_minmax, | ||
| 110 | .strategy = &sysctl_intvec, | ||
| 111 | .extra1 = &xfs_params.error_level.min, | ||
| 112 | .extra2 = &xfs_params.error_level.max | ||
| 113 | }, | ||
| 114 | { | ||
| 115 | .ctl_name = XFS_SYNCD_TIMER, | ||
| 116 | .procname = "xfssyncd_centisecs", | ||
| 117 | .data = &xfs_params.syncd_timer.val, | ||
| 118 | .maxlen = sizeof(int), | ||
| 119 | .mode = 0644, | ||
| 120 | .proc_handler = &proc_dointvec_minmax, | ||
| 121 | .strategy = &sysctl_intvec, | ||
| 122 | .extra1 = &xfs_params.syncd_timer.min, | ||
| 123 | .extra2 = &xfs_params.syncd_timer.max | ||
| 124 | }, | ||
| 125 | { | ||
| 126 | .ctl_name = XFS_INHERIT_SYNC, | ||
| 127 | .procname = "inherit_sync", | ||
| 128 | .data = &xfs_params.inherit_sync.val, | ||
| 129 | .maxlen = sizeof(int), | ||
| 130 | .mode = 0644, | ||
| 131 | .proc_handler = &proc_dointvec_minmax, | ||
| 132 | .strategy = &sysctl_intvec, | ||
| 133 | .extra1 = &xfs_params.inherit_sync.min, | ||
| 134 | .extra2 = &xfs_params.inherit_sync.max | ||
| 135 | }, | ||
| 136 | { | ||
| 137 | .ctl_name = XFS_INHERIT_NODUMP, | ||
| 138 | .procname = "inherit_nodump", | ||
| 139 | .data = &xfs_params.inherit_nodump.val, | ||
| 140 | .maxlen = sizeof(int), | ||
| 141 | .mode = 0644, | ||
| 142 | .proc_handler = &proc_dointvec_minmax, | ||
| 143 | .strategy = &sysctl_intvec, | ||
| 144 | .extra1 = &xfs_params.inherit_nodump.min, | ||
| 145 | .extra2 = &xfs_params.inherit_nodump.max | ||
| 146 | }, | ||
| 147 | { | ||
| 148 | .ctl_name = XFS_INHERIT_NOATIME, | ||
| 149 | .procname = "inherit_noatime", | ||
| 150 | .data = &xfs_params.inherit_noatim.val, | ||
| 151 | .maxlen = sizeof(int), | ||
| 152 | .mode = 0644, | ||
| 153 | .proc_handler = &proc_dointvec_minmax, | ||
| 154 | .strategy = &sysctl_intvec, | ||
| 155 | .extra1 = &xfs_params.inherit_noatim.min, | ||
| 156 | .extra2 = &xfs_params.inherit_noatim.max | ||
| 157 | }, | ||
| 158 | { | ||
| 159 | .ctl_name = XFS_BUF_TIMER, | ||
| 160 | .procname = "xfsbufd_centisecs", | ||
| 161 | .data = &xfs_params.xfs_buf_timer.val, | ||
| 162 | .maxlen = sizeof(int), | ||
| 163 | .mode = 0644, | ||
| 164 | .proc_handler = &proc_dointvec_minmax, | ||
| 165 | .strategy = &sysctl_intvec, | ||
| 166 | .extra1 = &xfs_params.xfs_buf_timer.min, | ||
| 167 | .extra2 = &xfs_params.xfs_buf_timer.max | ||
| 168 | }, | ||
| 169 | { | ||
| 170 | .ctl_name = XFS_BUF_AGE, | ||
| 171 | .procname = "age_buffer_centisecs", | ||
| 172 | .data = &xfs_params.xfs_buf_age.val, | ||
| 173 | .maxlen = sizeof(int), | ||
| 174 | .mode = 0644, | ||
| 175 | .proc_handler = &proc_dointvec_minmax, | ||
| 176 | .strategy = &sysctl_intvec, | ||
| 177 | .extra1 = &xfs_params.xfs_buf_age.min, | ||
| 178 | .extra2 = &xfs_params.xfs_buf_age.max | ||
| 179 | }, | ||
| 180 | { | ||
| 181 | .ctl_name = XFS_INHERIT_NOSYM, | ||
| 182 | .procname = "inherit_nosymlinks", | ||
| 183 | .data = &xfs_params.inherit_nosym.val, | ||
| 184 | .maxlen = sizeof(int), | ||
| 185 | .mode = 0644, | ||
| 186 | .proc_handler = &proc_dointvec_minmax, | ||
| 187 | .strategy = &sysctl_intvec, | ||
| 188 | .extra1 = &xfs_params.inherit_nosym.min, | ||
| 189 | .extra2 = &xfs_params.inherit_nosym.max | ||
| 190 | }, | ||
| 191 | { | ||
| 192 | .ctl_name = XFS_ROTORSTEP, | ||
| 193 | .procname = "rotorstep", | ||
| 194 | .data = &xfs_params.rotorstep.val, | ||
| 195 | .maxlen = sizeof(int), | ||
| 196 | .mode = 0644, | ||
| 197 | .proc_handler = &proc_dointvec_minmax, | ||
| 198 | .strategy = &sysctl_intvec, | ||
| 199 | .extra1 = &xfs_params.rotorstep.min, | ||
| 200 | .extra2 = &xfs_params.rotorstep.max | ||
| 201 | }, | ||
| 202 | { | ||
| 203 | .ctl_name = XFS_INHERIT_NODFRG, | ||
| 204 | .procname = "inherit_nodefrag", | ||
| 205 | .data = &xfs_params.inherit_nodfrg.val, | ||
| 206 | .maxlen = sizeof(int), | ||
| 207 | .mode = 0644, | ||
| 208 | .proc_handler = &proc_dointvec_minmax, | ||
| 209 | .strategy = &sysctl_intvec, | ||
| 210 | .extra1 = &xfs_params.inherit_nodfrg.min, | ||
| 211 | .extra2 = &xfs_params.inherit_nodfrg.max | ||
| 212 | }, | ||
| 128 | /* please keep this the last entry */ | 213 | /* please keep this the last entry */ |
| 129 | #ifdef CONFIG_PROC_FS | 214 | #ifdef CONFIG_PROC_FS |
| 130 | {XFS_STATS_CLEAR, "stats_clear", &xfs_params.stats_clear.val, | 215 | { |
| 131 | sizeof(int), 0644, NULL, &xfs_stats_clear_proc_handler, | 216 | .ctl_name = XFS_STATS_CLEAR, |
| 132 | &sysctl_intvec, NULL, | 217 | .procname = "stats_clear", |
| 133 | &xfs_params.stats_clear.min, &xfs_params.stats_clear.max}, | 218 | .data = &xfs_params.stats_clear.val, |
| 219 | .maxlen = sizeof(int), | ||
| 220 | .mode = 0644, | ||
| 221 | .proc_handler = &xfs_stats_clear_proc_handler, | ||
| 222 | .strategy = &sysctl_intvec, | ||
| 223 | .extra1 = &xfs_params.stats_clear.min, | ||
| 224 | .extra2 = &xfs_params.stats_clear.max | ||
| 225 | }, | ||
| 134 | #endif /* CONFIG_PROC_FS */ | 226 | #endif /* CONFIG_PROC_FS */ |
| 135 | 227 | ||
| 136 | {0} | 228 | {} |
| 137 | }; | 229 | }; |
| 138 | 230 | ||
| 139 | STATIC ctl_table xfs_dir_table[] = { | 231 | static ctl_table xfs_dir_table[] = { |
| 140 | {FS_XFS, "xfs", NULL, 0, 0555, xfs_table}, | 232 | { |
| 141 | {0} | 233 | .ctl_name = FS_XFS, |
| 234 | .procname = "xfs", | ||
| 235 | .mode = 0555, | ||
| 236 | .child = xfs_table | ||
| 237 | }, | ||
| 238 | {} | ||
| 142 | }; | 239 | }; |
| 143 | 240 | ||
| 144 | STATIC ctl_table xfs_root_table[] = { | 241 | static ctl_table xfs_root_table[] = { |
| 145 | {CTL_FS, "fs", NULL, 0, 0555, xfs_dir_table}, | 242 | { |
| 146 | {0} | 243 | .ctl_name = CTL_FS, |
| 244 | .procname = "fs", | ||
| 245 | .mode = 0555, | ||
| 246 | .child = xfs_dir_table | ||
| 247 | }, | ||
| 248 | {} | ||
| 147 | }; | 249 | }; |
| 148 | 250 | ||
| 149 | void | 251 | void |
| 150 | xfs_sysctl_register(void) | 252 | xfs_sysctl_register(void) |
| 151 | { | 253 | { |
| 152 | xfs_table_header = register_sysctl_table(xfs_root_table, 1); | 254 | xfs_table_header = register_sysctl_table(xfs_root_table, 0); |
| 153 | } | 255 | } |
| 154 | 256 | ||
| 155 | void | 257 | void |
diff --git a/fs/xfs/linux-2.6/xfs_vfs.h b/fs/xfs/linux-2.6/xfs_vfs.h index da255bdf5260..e2c2ce98ab5b 100644 --- a/fs/xfs/linux-2.6/xfs_vfs.h +++ b/fs/xfs/linux-2.6/xfs_vfs.h | |||
| @@ -91,7 +91,7 @@ typedef enum { | |||
| 91 | #define SYNC_FSDATA 0x0020 /* flush fs data (e.g. superblocks) */ | 91 | #define SYNC_FSDATA 0x0020 /* flush fs data (e.g. superblocks) */ |
| 92 | #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ | 92 | #define SYNC_REFCACHE 0x0040 /* prune some of the nfs ref cache */ |
| 93 | #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ | 93 | #define SYNC_REMOUNT 0x0080 /* remount readonly, no dummy LRs */ |
| 94 | #define SYNC_QUIESCE 0x0100 /* quiesce fileystem for a snapshot */ | 94 | #define SYNC_IOWAIT 0x0100 /* wait for all I/O to complete */ |
| 95 | 95 | ||
| 96 | #define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ | 96 | #define SHUTDOWN_META_IO_ERROR 0x0001 /* write attempt to metadata failed */ |
| 97 | #define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ | 97 | #define SHUTDOWN_LOG_IO_ERROR 0x0002 /* write attempt to the log failed */ |
diff --git a/fs/xfs/linux-2.6/xfs_vnode.c b/fs/xfs/linux-2.6/xfs_vnode.c index 553fa731ade5..ada24baf88de 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.c +++ b/fs/xfs/linux-2.6/xfs_vnode.c | |||
| @@ -26,7 +26,7 @@ DEFINE_SPINLOCK(vnumber_lock); | |||
| 26 | */ | 26 | */ |
| 27 | #define NVSYNC 37 | 27 | #define NVSYNC 37 |
| 28 | #define vptosync(v) (&vsync[((unsigned long)v) % NVSYNC]) | 28 | #define vptosync(v) (&vsync[((unsigned long)v) % NVSYNC]) |
| 29 | STATIC wait_queue_head_t vsync[NVSYNC]; | 29 | static wait_queue_head_t vsync[NVSYNC]; |
| 30 | 30 | ||
| 31 | void | 31 | void |
| 32 | vn_init(void) | 32 | vn_init(void) |
diff --git a/fs/xfs/linux-2.6/xfs_vnode.h b/fs/xfs/linux-2.6/xfs_vnode.h index 515f5fdea57a..b76118cf4897 100644 --- a/fs/xfs/linux-2.6/xfs_vnode.h +++ b/fs/xfs/linux-2.6/xfs_vnode.h | |||
| @@ -489,14 +489,14 @@ static inline struct bhv_vnode *vn_grab(struct bhv_vnode *vp) | |||
| 489 | #define VN_LOCK(vp) mutex_spinlock(&(vp)->v_lock) | 489 | #define VN_LOCK(vp) mutex_spinlock(&(vp)->v_lock) |
| 490 | #define VN_UNLOCK(vp, s) mutex_spinunlock(&(vp)->v_lock, s) | 490 | #define VN_UNLOCK(vp, s) mutex_spinunlock(&(vp)->v_lock, s) |
| 491 | 491 | ||
| 492 | static __inline__ void vn_flagset(struct bhv_vnode *vp, uint flag) | 492 | STATIC_INLINE void vn_flagset(struct bhv_vnode *vp, uint flag) |
| 493 | { | 493 | { |
| 494 | spin_lock(&vp->v_lock); | 494 | spin_lock(&vp->v_lock); |
| 495 | vp->v_flag |= flag; | 495 | vp->v_flag |= flag; |
| 496 | spin_unlock(&vp->v_lock); | 496 | spin_unlock(&vp->v_lock); |
| 497 | } | 497 | } |
| 498 | 498 | ||
| 499 | static __inline__ uint vn_flagclr(struct bhv_vnode *vp, uint flag) | 499 | STATIC_INLINE uint vn_flagclr(struct bhv_vnode *vp, uint flag) |
| 500 | { | 500 | { |
| 501 | uint cleared; | 501 | uint cleared; |
| 502 | 502 | ||
diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c index 3aa771531856..4adaf13aac6f 100644 --- a/fs/xfs/quota/xfs_dquot.c +++ b/fs/xfs/quota/xfs_dquot.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include "xfs_itable.h" | 43 | #include "xfs_itable.h" |
| 44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 45 | #include "xfs_acl.h" | 45 | #include "xfs_acl.h" |
| 46 | #include "xfs_cap.h" | ||
| 47 | #include "xfs_mac.h" | ||
| 48 | #include "xfs_attr.h" | 46 | #include "xfs_attr.h" |
| 49 | #include "xfs_buf_item.h" | 47 | #include "xfs_buf_item.h" |
| 50 | #include "xfs_trans_space.h" | 48 | #include "xfs_trans_space.h" |
| @@ -484,7 +482,7 @@ xfs_qm_dqalloc( | |||
| 484 | 482 | ||
| 485 | xfs_trans_bhold(tp, bp); | 483 | xfs_trans_bhold(tp, bp); |
| 486 | 484 | ||
| 487 | if ((error = xfs_bmap_finish(tpp, &flist, firstblock, &committed))) { | 485 | if ((error = xfs_bmap_finish(tpp, &flist, &committed))) { |
| 488 | goto error1; | 486 | goto error1; |
| 489 | } | 487 | } |
| 490 | 488 | ||
diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c index 33ad5af386e0..ddb61fe22a5c 100644 --- a/fs/xfs/quota/xfs_dquot_item.c +++ b/fs/xfs/quota/xfs_dquot_item.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include "xfs_itable.h" | 43 | #include "xfs_itable.h" |
| 44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 45 | #include "xfs_acl.h" | 45 | #include "xfs_acl.h" |
| 46 | #include "xfs_cap.h" | ||
| 47 | #include "xfs_mac.h" | ||
| 48 | #include "xfs_attr.h" | 46 | #include "xfs_attr.h" |
| 49 | #include "xfs_buf_item.h" | 47 | #include "xfs_buf_item.h" |
| 50 | #include "xfs_trans_priv.h" | 48 | #include "xfs_trans_priv.h" |
| @@ -399,7 +397,7 @@ xfs_qm_dquot_logitem_committing( | |||
| 399 | /* | 397 | /* |
| 400 | * This is the ops vector for dquots | 398 | * This is the ops vector for dquots |
| 401 | */ | 399 | */ |
| 402 | STATIC struct xfs_item_ops xfs_dquot_item_ops = { | 400 | static struct xfs_item_ops xfs_dquot_item_ops = { |
| 403 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_size, | 401 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_dquot_logitem_size, |
| 404 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 402 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
| 405 | xfs_qm_dquot_logitem_format, | 403 | xfs_qm_dquot_logitem_format, |
| @@ -606,7 +604,7 @@ xfs_qm_qoffend_logitem_committing(xfs_qoff_logitem_t *qip, xfs_lsn_t commit_lsn) | |||
| 606 | return; | 604 | return; |
| 607 | } | 605 | } |
| 608 | 606 | ||
| 609 | STATIC struct xfs_item_ops xfs_qm_qoffend_logitem_ops = { | 607 | static struct xfs_item_ops xfs_qm_qoffend_logitem_ops = { |
| 610 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size, | 608 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size, |
| 611 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 609 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
| 612 | xfs_qm_qoff_logitem_format, | 610 | xfs_qm_qoff_logitem_format, |
| @@ -628,7 +626,7 @@ STATIC struct xfs_item_ops xfs_qm_qoffend_logitem_ops = { | |||
| 628 | /* | 626 | /* |
| 629 | * This is the ops vector shared by all quotaoff-start log items. | 627 | * This is the ops vector shared by all quotaoff-start log items. |
| 630 | */ | 628 | */ |
| 631 | STATIC struct xfs_item_ops xfs_qm_qoff_logitem_ops = { | 629 | static struct xfs_item_ops xfs_qm_qoff_logitem_ops = { |
| 632 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size, | 630 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_qm_qoff_logitem_size, |
| 633 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 631 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
| 634 | xfs_qm_qoff_logitem_format, | 632 | xfs_qm_qoff_logitem_format, |
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c index 7c6a3a50379e..1de2acdc7f70 100644 --- a/fs/xfs/quota/xfs_qm.c +++ b/fs/xfs/quota/xfs_qm.c | |||
| @@ -44,8 +44,6 @@ | |||
| 44 | #include "xfs_bmap.h" | 44 | #include "xfs_bmap.h" |
| 45 | #include "xfs_rw.h" | 45 | #include "xfs_rw.h" |
| 46 | #include "xfs_acl.h" | 46 | #include "xfs_acl.h" |
| 47 | #include "xfs_cap.h" | ||
| 48 | #include "xfs_mac.h" | ||
| 49 | #include "xfs_attr.h" | 47 | #include "xfs_attr.h" |
| 50 | #include "xfs_buf_item.h" | 48 | #include "xfs_buf_item.h" |
| 51 | #include "xfs_trans_space.h" | 49 | #include "xfs_trans_space.h" |
| @@ -64,10 +62,10 @@ uint ndquot; | |||
| 64 | 62 | ||
| 65 | kmem_zone_t *qm_dqzone; | 63 | kmem_zone_t *qm_dqzone; |
| 66 | kmem_zone_t *qm_dqtrxzone; | 64 | kmem_zone_t *qm_dqtrxzone; |
| 67 | STATIC kmem_shaker_t xfs_qm_shaker; | 65 | static kmem_shaker_t xfs_qm_shaker; |
| 68 | 66 | ||
| 69 | STATIC cred_t xfs_zerocr; | 67 | static cred_t xfs_zerocr; |
| 70 | STATIC xfs_inode_t xfs_zeroino; | 68 | static xfs_inode_t xfs_zeroino; |
| 71 | 69 | ||
| 72 | STATIC void xfs_qm_list_init(xfs_dqlist_t *, char *, int); | 70 | STATIC void xfs_qm_list_init(xfs_dqlist_t *, char *, int); |
| 73 | STATIC void xfs_qm_list_destroy(xfs_dqlist_t *); | 71 | STATIC void xfs_qm_list_destroy(xfs_dqlist_t *); |
diff --git a/fs/xfs/quota/xfs_qm_bhv.c b/fs/xfs/quota/xfs_qm_bhv.c index db8872be8c87..d2cdb8a2aad6 100644 --- a/fs/xfs/quota/xfs_qm_bhv.c +++ b/fs/xfs/quota/xfs_qm_bhv.c | |||
| @@ -44,8 +44,6 @@ | |||
| 44 | #include "xfs_error.h" | 44 | #include "xfs_error.h" |
| 45 | #include "xfs_rw.h" | 45 | #include "xfs_rw.h" |
| 46 | #include "xfs_acl.h" | 46 | #include "xfs_acl.h" |
| 47 | #include "xfs_cap.h" | ||
| 48 | #include "xfs_mac.h" | ||
| 49 | #include "xfs_attr.h" | 47 | #include "xfs_attr.h" |
| 50 | #include "xfs_buf_item.h" | 48 | #include "xfs_buf_item.h" |
| 51 | #include "xfs_qm.h" | 49 | #include "xfs_qm.h" |
| @@ -384,7 +382,7 @@ xfs_qm_dqrele_null( | |||
| 384 | } | 382 | } |
| 385 | 383 | ||
| 386 | 384 | ||
| 387 | STATIC struct xfs_qmops xfs_qmcore_xfs = { | 385 | static struct xfs_qmops xfs_qmcore_xfs = { |
| 388 | .xfs_qminit = xfs_qm_newmount, | 386 | .xfs_qminit = xfs_qm_newmount, |
| 389 | .xfs_qmdone = xfs_qm_unmount_quotadestroy, | 387 | .xfs_qmdone = xfs_qm_unmount_quotadestroy, |
| 390 | .xfs_qmmount = xfs_qm_endmount, | 388 | .xfs_qmmount = xfs_qm_endmount, |
diff --git a/fs/xfs/quota/xfs_qm_stats.c b/fs/xfs/quota/xfs_qm_stats.c index 6f858fb81a36..709f5f545cf5 100644 --- a/fs/xfs/quota/xfs_qm_stats.c +++ b/fs/xfs/quota/xfs_qm_stats.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include "xfs_error.h" | 43 | #include "xfs_error.h" |
| 44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 45 | #include "xfs_acl.h" | 45 | #include "xfs_acl.h" |
| 46 | #include "xfs_cap.h" | ||
| 47 | #include "xfs_mac.h" | ||
| 48 | #include "xfs_attr.h" | 46 | #include "xfs_attr.h" |
| 49 | #include "xfs_buf_item.h" | 47 | #include "xfs_buf_item.h" |
| 50 | #include "xfs_qm.h" | 48 | #include "xfs_qm.h" |
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index ed620c4d1594..716f562aa8b2 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
| @@ -46,8 +46,6 @@ | |||
| 46 | #include "xfs_error.h" | 46 | #include "xfs_error.h" |
| 47 | #include "xfs_rw.h" | 47 | #include "xfs_rw.h" |
| 48 | #include "xfs_acl.h" | 48 | #include "xfs_acl.h" |
| 49 | #include "xfs_cap.h" | ||
| 50 | #include "xfs_mac.h" | ||
| 51 | #include "xfs_attr.h" | 49 | #include "xfs_attr.h" |
| 52 | #include "xfs_buf_item.h" | 50 | #include "xfs_buf_item.h" |
| 53 | #include "xfs_utils.h" | 51 | #include "xfs_utils.h" |
| @@ -134,7 +132,7 @@ xfs_qm_quotactl( | |||
| 134 | break; | 132 | break; |
| 135 | 133 | ||
| 136 | case Q_XQUOTASYNC: | 134 | case Q_XQUOTASYNC: |
| 137 | return (xfs_sync_inodes(mp, SYNC_DELWRI, 0, NULL)); | 135 | return (xfs_sync_inodes(mp, SYNC_DELWRI, NULL)); |
| 138 | 136 | ||
| 139 | default: | 137 | default: |
| 140 | break; | 138 | break; |
diff --git a/fs/xfs/quota/xfs_trans_dquot.c b/fs/xfs/quota/xfs_trans_dquot.c index 0242e9666e8e..d7491e7b1f3b 100644 --- a/fs/xfs/quota/xfs_trans_dquot.c +++ b/fs/xfs/quota/xfs_trans_dquot.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include "xfs_error.h" | 43 | #include "xfs_error.h" |
| 44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 45 | #include "xfs_acl.h" | 45 | #include "xfs_acl.h" |
| 46 | #include "xfs_cap.h" | ||
| 47 | #include "xfs_mac.h" | ||
| 48 | #include "xfs_attr.h" | 46 | #include "xfs_attr.h" |
| 49 | #include "xfs_buf_item.h" | 47 | #include "xfs_buf_item.h" |
| 50 | #include "xfs_trans_priv.h" | 48 | #include "xfs_trans_priv.h" |
diff --git a/fs/xfs/support/debug.c b/fs/xfs/support/debug.c index 4363512d2f90..08bbd3cb87ae 100644 --- a/fs/xfs/support/debug.c +++ b/fs/xfs/support/debug.c | |||
| @@ -19,7 +19,7 @@ | |||
| 19 | #include "debug.h" | 19 | #include "debug.h" |
| 20 | #include "spin.h" | 20 | #include "spin.h" |
| 21 | 21 | ||
| 22 | static char message[256]; /* keep it off the stack */ | 22 | static char message[1024]; /* keep it off the stack */ |
| 23 | static DEFINE_SPINLOCK(xfs_err_lock); | 23 | static DEFINE_SPINLOCK(xfs_err_lock); |
| 24 | 24 | ||
| 25 | /* Translate from CE_FOO to KERN_FOO, err_level(CE_FOO) == KERN_FOO */ | 25 | /* Translate from CE_FOO to KERN_FOO, err_level(CE_FOO) == KERN_FOO */ |
| @@ -44,13 +44,14 @@ cmn_err(register int level, char *fmt, ...) | |||
| 44 | spin_lock_irqsave(&xfs_err_lock,flags); | 44 | spin_lock_irqsave(&xfs_err_lock,flags); |
| 45 | va_start(ap, fmt); | 45 | va_start(ap, fmt); |
| 46 | if (*fmt == '!') fp++; | 46 | if (*fmt == '!') fp++; |
| 47 | len = vsprintf(message, fp, ap); | 47 | len = vsnprintf(message, sizeof(message), fp, ap); |
| 48 | if (level != CE_DEBUG && message[len-1] != '\n') | 48 | if (len >= sizeof(message)) |
| 49 | strcat(message, "\n"); | 49 | len = sizeof(message) - 1; |
| 50 | printk("%s%s", err_level[level], message); | 50 | if (message[len-1] == '\n') |
| 51 | message[len-1] = 0; | ||
| 52 | printk("%s%s\n", err_level[level], message); | ||
| 51 | va_end(ap); | 53 | va_end(ap); |
| 52 | spin_unlock_irqrestore(&xfs_err_lock,flags); | 54 | spin_unlock_irqrestore(&xfs_err_lock,flags); |
| 53 | |||
| 54 | BUG_ON(level == CE_PANIC); | 55 | BUG_ON(level == CE_PANIC); |
| 55 | } | 56 | } |
| 56 | 57 | ||
| @@ -64,11 +65,13 @@ icmn_err(register int level, char *fmt, va_list ap) | |||
| 64 | if(level > XFS_MAX_ERR_LEVEL) | 65 | if(level > XFS_MAX_ERR_LEVEL) |
| 65 | level = XFS_MAX_ERR_LEVEL; | 66 | level = XFS_MAX_ERR_LEVEL; |
| 66 | spin_lock_irqsave(&xfs_err_lock,flags); | 67 | spin_lock_irqsave(&xfs_err_lock,flags); |
| 67 | len = vsprintf(message, fmt, ap); | 68 | len = vsnprintf(message, sizeof(message), fmt, ap); |
| 68 | if (level != CE_DEBUG && message[len-1] != '\n') | 69 | if (len >= sizeof(message)) |
| 69 | strcat(message, "\n"); | 70 | len = sizeof(message) - 1; |
| 71 | if (message[len-1] == '\n') | ||
| 72 | message[len-1] = 0; | ||
| 73 | printk("%s%s\n", err_level[level], message); | ||
| 70 | spin_unlock_irqrestore(&xfs_err_lock,flags); | 74 | spin_unlock_irqrestore(&xfs_err_lock,flags); |
| 71 | printk("%s%s", err_level[level], message); | ||
| 72 | BUG_ON(level == CE_PANIC); | 75 | BUG_ON(level == CE_PANIC); |
| 73 | } | 76 | } |
| 74 | 77 | ||
diff --git a/fs/xfs/support/debug.h b/fs/xfs/support/debug.h index 4f54dca662a8..2a70cc605ae3 100644 --- a/fs/xfs/support/debug.h +++ b/fs/xfs/support/debug.h | |||
| @@ -38,13 +38,37 @@ extern void assfail(char *expr, char *f, int l); | |||
| 38 | 38 | ||
| 39 | #ifndef DEBUG | 39 | #ifndef DEBUG |
| 40 | # define ASSERT(expr) ((void)0) | 40 | # define ASSERT(expr) ((void)0) |
| 41 | #else | 41 | |
| 42 | #ifndef STATIC | ||
| 43 | # define STATIC static noinline | ||
| 44 | #endif | ||
| 45 | |||
| 46 | #ifndef STATIC_INLINE | ||
| 47 | # define STATIC_INLINE static inline | ||
| 48 | #endif | ||
| 49 | |||
| 50 | #else /* DEBUG */ | ||
| 51 | |||
| 42 | # define ASSERT(expr) ASSERT_ALWAYS(expr) | 52 | # define ASSERT(expr) ASSERT_ALWAYS(expr) |
| 43 | extern unsigned long random(void); | 53 | extern unsigned long random(void); |
| 44 | #endif | ||
| 45 | 54 | ||
| 46 | #ifndef STATIC | 55 | #ifndef STATIC |
| 47 | # define STATIC static | 56 | # define STATIC noinline |
| 48 | #endif | 57 | #endif |
| 49 | 58 | ||
| 59 | /* | ||
| 60 | * We stop inlining of inline functions in debug mode. | ||
| 61 | * Unfortunately, this means static inline in header files | ||
| 62 | * get multiple definitions, so they need to remain static. | ||
| 63 | * This then gives tonnes of warnings about unused but defined | ||
| 64 | * functions, so we need to add the unused attribute to prevent | ||
| 65 | * these spurious warnings. | ||
| 66 | */ | ||
| 67 | #ifndef STATIC_INLINE | ||
| 68 | # define STATIC_INLINE static __attribute__ ((unused)) noinline | ||
| 69 | #endif | ||
| 70 | |||
| 71 | #endif /* DEBUG */ | ||
| 72 | |||
| 73 | |||
| 50 | #endif /* __XFS_SUPPORT_DEBUG_H__ */ | 74 | #endif /* __XFS_SUPPORT_DEBUG_H__ */ |
diff --git a/fs/xfs/support/move.h b/fs/xfs/support/move.h index 977879c24ff5..324e413deadd 100644 --- a/fs/xfs/support/move.h +++ b/fs/xfs/support/move.h | |||
| @@ -55,7 +55,7 @@ enum uio_seg { | |||
| 55 | }; | 55 | }; |
| 56 | 56 | ||
| 57 | struct uio { | 57 | struct uio { |
| 58 | struct iovec *uio_iov; /* pointer to array of iovecs */ | 58 | struct kvec *uio_iov; /* pointer to array of iovecs */ |
| 59 | int uio_iovcnt; /* number of iovecs in array */ | 59 | int uio_iovcnt; /* number of iovecs in array */ |
| 60 | xfs_off_t uio_offset; /* offset in file this uio corresponds to */ | 60 | xfs_off_t uio_offset; /* offset in file this uio corresponds to */ |
| 61 | int uio_resid; /* residual i/o count */ | 61 | int uio_resid; /* residual i/o count */ |
| @@ -63,7 +63,7 @@ struct uio { | |||
| 63 | }; | 63 | }; |
| 64 | 64 | ||
| 65 | typedef struct uio uio_t; | 65 | typedef struct uio uio_t; |
| 66 | typedef struct iovec iovec_t; | 66 | typedef struct kvec iovec_t; |
| 67 | 67 | ||
| 68 | extern int xfs_uio_read (caddr_t, size_t, uio_t *); | 68 | extern int xfs_uio_read (caddr_t, size_t, uio_t *); |
| 69 | 69 | ||
diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index 4b0cb474be4c..4ca4beb7bb54 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c | |||
| @@ -31,7 +31,6 @@ | |||
| 31 | #include "xfs_inode.h" | 31 | #include "xfs_inode.h" |
| 32 | #include "xfs_btree.h" | 32 | #include "xfs_btree.h" |
| 33 | #include "xfs_acl.h" | 33 | #include "xfs_acl.h" |
| 34 | #include "xfs_mac.h" | ||
| 35 | #include "xfs_attr.h" | 34 | #include "xfs_attr.h" |
| 36 | 35 | ||
| 37 | #include <linux/capability.h> | 36 | #include <linux/capability.h> |
diff --git a/fs/xfs/xfs_alloc_btree.h b/fs/xfs/xfs_alloc_btree.h index bce81c7a4fdc..5bd1a2c8bd07 100644 --- a/fs/xfs/xfs_alloc_btree.h +++ b/fs/xfs/xfs_alloc_btree.h | |||
| @@ -58,7 +58,6 @@ typedef struct xfs_btree_sblock xfs_alloc_block_t; | |||
| 58 | /* | 58 | /* |
| 59 | * Real block structures have a size equal to the disk block size. | 59 | * Real block structures have a size equal to the disk block size. |
| 60 | */ | 60 | */ |
| 61 | #define XFS_ALLOC_BLOCK_SIZE(lev,cur) (1 << (cur)->bc_blocklog) | ||
| 62 | #define XFS_ALLOC_BLOCK_MAXRECS(lev,cur) ((cur)->bc_mp->m_alloc_mxr[lev != 0]) | 61 | #define XFS_ALLOC_BLOCK_MAXRECS(lev,cur) ((cur)->bc_mp->m_alloc_mxr[lev != 0]) |
| 63 | #define XFS_ALLOC_BLOCK_MINRECS(lev,cur) ((cur)->bc_mp->m_alloc_mnr[lev != 0]) | 62 | #define XFS_ALLOC_BLOCK_MINRECS(lev,cur) ((cur)->bc_mp->m_alloc_mnr[lev != 0]) |
| 64 | 63 | ||
| @@ -87,16 +86,13 @@ typedef struct xfs_btree_sblock xfs_alloc_block_t; | |||
| 87 | * Record, key, and pointer address macros for btree blocks. | 86 | * Record, key, and pointer address macros for btree blocks. |
| 88 | */ | 87 | */ |
| 89 | #define XFS_ALLOC_REC_ADDR(bb,i,cur) \ | 88 | #define XFS_ALLOC_REC_ADDR(bb,i,cur) \ |
| 90 | XFS_BTREE_REC_ADDR(XFS_ALLOC_BLOCK_SIZE(0,cur), xfs_alloc, \ | 89 | XFS_BTREE_REC_ADDR(xfs_alloc, bb, i) |
| 91 | bb, i, XFS_ALLOC_BLOCK_MAXRECS(0, cur)) | ||
| 92 | 90 | ||
| 93 | #define XFS_ALLOC_KEY_ADDR(bb,i,cur) \ | 91 | #define XFS_ALLOC_KEY_ADDR(bb,i,cur) \ |
| 94 | XFS_BTREE_KEY_ADDR(XFS_ALLOC_BLOCK_SIZE(1,cur), xfs_alloc, \ | 92 | XFS_BTREE_KEY_ADDR(xfs_alloc, bb, i) |
| 95 | bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur)) | ||
| 96 | 93 | ||
| 97 | #define XFS_ALLOC_PTR_ADDR(bb,i,cur) \ | 94 | #define XFS_ALLOC_PTR_ADDR(bb,i,cur) \ |
| 98 | XFS_BTREE_PTR_ADDR(XFS_ALLOC_BLOCK_SIZE(1,cur), xfs_alloc, \ | 95 | XFS_BTREE_PTR_ADDR(xfs_alloc, bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur)) |
| 99 | bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur)) | ||
| 100 | 96 | ||
| 101 | /* | 97 | /* |
| 102 | * Decrement cursor by one record at the level. | 98 | * Decrement cursor by one record at the level. |
diff --git a/fs/xfs/xfs_attr.c b/fs/xfs/xfs_attr.c index 9ada7bdbae52..9d358ffce4e5 100644 --- a/fs/xfs/xfs_attr.c +++ b/fs/xfs/xfs_attr.c | |||
| @@ -57,9 +57,9 @@ | |||
| 57 | */ | 57 | */ |
| 58 | 58 | ||
| 59 | #define ATTR_SYSCOUNT 2 | 59 | #define ATTR_SYSCOUNT 2 |
| 60 | STATIC struct attrnames posix_acl_access; | 60 | static struct attrnames posix_acl_access; |
| 61 | STATIC struct attrnames posix_acl_default; | 61 | static struct attrnames posix_acl_default; |
| 62 | STATIC struct attrnames *attr_system_names[ATTR_SYSCOUNT]; | 62 | static struct attrnames *attr_system_names[ATTR_SYSCOUNT]; |
| 63 | 63 | ||
| 64 | /*======================================================================== | 64 | /*======================================================================== |
| 65 | * Function prototypes for the kernel. | 65 | * Function prototypes for the kernel. |
| @@ -199,18 +199,14 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen, | |||
| 199 | return (error); | 199 | return (error); |
| 200 | 200 | ||
| 201 | /* | 201 | /* |
| 202 | * Determine space new attribute will use, and if it would be | ||
| 203 | * "local" or "remote" (note: local != inline). | ||
| 204 | */ | ||
| 205 | size = xfs_attr_leaf_newentsize(namelen, valuelen, | ||
| 206 | mp->m_sb.sb_blocksize, &local); | ||
| 207 | |||
| 208 | /* | ||
| 209 | * If the inode doesn't have an attribute fork, add one. | 202 | * If the inode doesn't have an attribute fork, add one. |
| 210 | * (inode must not be locked when we call this routine) | 203 | * (inode must not be locked when we call this routine) |
| 211 | */ | 204 | */ |
| 212 | if (XFS_IFORK_Q(dp) == 0) { | 205 | if (XFS_IFORK_Q(dp) == 0) { |
| 213 | if ((error = xfs_bmap_add_attrfork(dp, size, rsvd))) | 206 | int sf_size = sizeof(xfs_attr_sf_hdr_t) + |
| 207 | XFS_ATTR_SF_ENTSIZE_BYNAME(namelen, valuelen); | ||
| 208 | |||
| 209 | if ((error = xfs_bmap_add_attrfork(dp, sf_size, rsvd))) | ||
| 214 | return(error); | 210 | return(error); |
| 215 | } | 211 | } |
| 216 | 212 | ||
| @@ -231,6 +227,13 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen, | |||
| 231 | args.addname = 1; | 227 | args.addname = 1; |
| 232 | args.oknoent = 1; | 228 | args.oknoent = 1; |
| 233 | 229 | ||
| 230 | /* | ||
| 231 | * Determine space new attribute will use, and if it would be | ||
| 232 | * "local" or "remote" (note: local != inline). | ||
| 233 | */ | ||
| 234 | size = xfs_attr_leaf_newentsize(namelen, valuelen, | ||
| 235 | mp->m_sb.sb_blocksize, &local); | ||
| 236 | |||
| 234 | nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); | 237 | nblks = XFS_DAENTER_SPACE_RES(mp, XFS_ATTR_FORK); |
| 235 | if (local) { | 238 | if (local) { |
| 236 | if (size > (mp->m_sb.sb_blocksize >> 1)) { | 239 | if (size > (mp->m_sb.sb_blocksize >> 1)) { |
| @@ -346,7 +349,7 @@ xfs_attr_set_int(xfs_inode_t *dp, const char *name, int namelen, | |||
| 346 | error = xfs_attr_shortform_to_leaf(&args); | 349 | error = xfs_attr_shortform_to_leaf(&args); |
| 347 | if (!error) { | 350 | if (!error) { |
| 348 | error = xfs_bmap_finish(&args.trans, args.flist, | 351 | error = xfs_bmap_finish(&args.trans, args.flist, |
| 349 | *args.firstblock, &committed); | 352 | &committed); |
| 350 | } | 353 | } |
| 351 | if (error) { | 354 | if (error) { |
| 352 | ASSERT(committed); | 355 | ASSERT(committed); |
| @@ -973,7 +976,7 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) | |||
| 973 | error = xfs_attr_leaf_to_node(args); | 976 | error = xfs_attr_leaf_to_node(args); |
| 974 | if (!error) { | 977 | if (!error) { |
| 975 | error = xfs_bmap_finish(&args->trans, args->flist, | 978 | error = xfs_bmap_finish(&args->trans, args->flist, |
| 976 | *args->firstblock, &committed); | 979 | &committed); |
| 977 | } | 980 | } |
| 978 | if (error) { | 981 | if (error) { |
| 979 | ASSERT(committed); | 982 | ASSERT(committed); |
| @@ -1074,7 +1077,6 @@ xfs_attr_leaf_addname(xfs_da_args_t *args) | |||
| 1074 | if (!error) { | 1077 | if (!error) { |
| 1075 | error = xfs_bmap_finish(&args->trans, | 1078 | error = xfs_bmap_finish(&args->trans, |
| 1076 | args->flist, | 1079 | args->flist, |
| 1077 | *args->firstblock, | ||
| 1078 | &committed); | 1080 | &committed); |
| 1079 | } | 1081 | } |
| 1080 | if (error) { | 1082 | if (error) { |
| @@ -1152,7 +1154,7 @@ xfs_attr_leaf_removename(xfs_da_args_t *args) | |||
| 1152 | /* bp is gone due to xfs_da_shrink_inode */ | 1154 | /* bp is gone due to xfs_da_shrink_inode */ |
| 1153 | if (!error) { | 1155 | if (!error) { |
| 1154 | error = xfs_bmap_finish(&args->trans, args->flist, | 1156 | error = xfs_bmap_finish(&args->trans, args->flist, |
| 1155 | *args->firstblock, &committed); | 1157 | &committed); |
| 1156 | } | 1158 | } |
| 1157 | if (error) { | 1159 | if (error) { |
| 1158 | ASSERT(committed); | 1160 | ASSERT(committed); |
| @@ -1307,7 +1309,6 @@ restart: | |||
| 1307 | if (!error) { | 1309 | if (!error) { |
| 1308 | error = xfs_bmap_finish(&args->trans, | 1310 | error = xfs_bmap_finish(&args->trans, |
| 1309 | args->flist, | 1311 | args->flist, |
| 1310 | *args->firstblock, | ||
| 1311 | &committed); | 1312 | &committed); |
| 1312 | } | 1313 | } |
| 1313 | if (error) { | 1314 | if (error) { |
| @@ -1347,7 +1348,7 @@ restart: | |||
| 1347 | error = xfs_da_split(state); | 1348 | error = xfs_da_split(state); |
| 1348 | if (!error) { | 1349 | if (!error) { |
| 1349 | error = xfs_bmap_finish(&args->trans, args->flist, | 1350 | error = xfs_bmap_finish(&args->trans, args->flist, |
| 1350 | *args->firstblock, &committed); | 1351 | &committed); |
| 1351 | } | 1352 | } |
| 1352 | if (error) { | 1353 | if (error) { |
| 1353 | ASSERT(committed); | 1354 | ASSERT(committed); |
| @@ -1459,7 +1460,6 @@ restart: | |||
| 1459 | if (!error) { | 1460 | if (!error) { |
| 1460 | error = xfs_bmap_finish(&args->trans, | 1461 | error = xfs_bmap_finish(&args->trans, |
| 1461 | args->flist, | 1462 | args->flist, |
| 1462 | *args->firstblock, | ||
| 1463 | &committed); | 1463 | &committed); |
| 1464 | } | 1464 | } |
| 1465 | if (error) { | 1465 | if (error) { |
| @@ -1594,7 +1594,7 @@ xfs_attr_node_removename(xfs_da_args_t *args) | |||
| 1594 | error = xfs_da_join(state); | 1594 | error = xfs_da_join(state); |
| 1595 | if (!error) { | 1595 | if (!error) { |
| 1596 | error = xfs_bmap_finish(&args->trans, args->flist, | 1596 | error = xfs_bmap_finish(&args->trans, args->flist, |
| 1597 | *args->firstblock, &committed); | 1597 | &committed); |
| 1598 | } | 1598 | } |
| 1599 | if (error) { | 1599 | if (error) { |
| 1600 | ASSERT(committed); | 1600 | ASSERT(committed); |
| @@ -1646,7 +1646,6 @@ xfs_attr_node_removename(xfs_da_args_t *args) | |||
| 1646 | if (!error) { | 1646 | if (!error) { |
| 1647 | error = xfs_bmap_finish(&args->trans, | 1647 | error = xfs_bmap_finish(&args->trans, |
| 1648 | args->flist, | 1648 | args->flist, |
| 1649 | *args->firstblock, | ||
| 1650 | &committed); | 1649 | &committed); |
| 1651 | } | 1650 | } |
| 1652 | if (error) { | 1651 | if (error) { |
| @@ -2090,7 +2089,7 @@ xfs_attr_rmtval_set(xfs_da_args_t *args) | |||
| 2090 | args->flist, NULL); | 2089 | args->flist, NULL); |
| 2091 | if (!error) { | 2090 | if (!error) { |
| 2092 | error = xfs_bmap_finish(&args->trans, args->flist, | 2091 | error = xfs_bmap_finish(&args->trans, args->flist, |
| 2093 | *args->firstblock, &committed); | 2092 | &committed); |
| 2094 | } | 2093 | } |
| 2095 | if (error) { | 2094 | if (error) { |
| 2096 | ASSERT(committed); | 2095 | ASSERT(committed); |
| @@ -2246,7 +2245,7 @@ xfs_attr_rmtval_remove(xfs_da_args_t *args) | |||
| 2246 | NULL, &done); | 2245 | NULL, &done); |
| 2247 | if (!error) { | 2246 | if (!error) { |
| 2248 | error = xfs_bmap_finish(&args->trans, args->flist, | 2247 | error = xfs_bmap_finish(&args->trans, args->flist, |
| 2249 | *args->firstblock, &committed); | 2248 | &committed); |
| 2250 | } | 2249 | } |
| 2251 | if (error) { | 2250 | if (error) { |
| 2252 | ASSERT(committed); | 2251 | ASSERT(committed); |
| @@ -2477,7 +2476,7 @@ posix_acl_default_exists( | |||
| 2477 | return xfs_acl_vhasacl_default(vp); | 2476 | return xfs_acl_vhasacl_default(vp); |
| 2478 | } | 2477 | } |
| 2479 | 2478 | ||
| 2480 | STATIC struct attrnames posix_acl_access = { | 2479 | static struct attrnames posix_acl_access = { |
| 2481 | .attr_name = "posix_acl_access", | 2480 | .attr_name = "posix_acl_access", |
| 2482 | .attr_namelen = sizeof("posix_acl_access") - 1, | 2481 | .attr_namelen = sizeof("posix_acl_access") - 1, |
| 2483 | .attr_get = posix_acl_access_get, | 2482 | .attr_get = posix_acl_access_get, |
| @@ -2486,7 +2485,7 @@ STATIC struct attrnames posix_acl_access = { | |||
| 2486 | .attr_exists = posix_acl_access_exists, | 2485 | .attr_exists = posix_acl_access_exists, |
| 2487 | }; | 2486 | }; |
| 2488 | 2487 | ||
| 2489 | STATIC struct attrnames posix_acl_default = { | 2488 | static struct attrnames posix_acl_default = { |
| 2490 | .attr_name = "posix_acl_default", | 2489 | .attr_name = "posix_acl_default", |
| 2491 | .attr_namelen = sizeof("posix_acl_default") - 1, | 2490 | .attr_namelen = sizeof("posix_acl_default") - 1, |
| 2492 | .attr_get = posix_acl_default_get, | 2491 | .attr_get = posix_acl_default_get, |
| @@ -2495,7 +2494,7 @@ STATIC struct attrnames posix_acl_default = { | |||
| 2495 | .attr_exists = posix_acl_default_exists, | 2494 | .attr_exists = posix_acl_default_exists, |
| 2496 | }; | 2495 | }; |
| 2497 | 2496 | ||
| 2498 | STATIC struct attrnames *attr_system_names[] = | 2497 | static struct attrnames *attr_system_names[] = |
| 2499 | { &posix_acl_access, &posix_acl_default }; | 2498 | { &posix_acl_access, &posix_acl_default }; |
| 2500 | 2499 | ||
| 2501 | 2500 | ||
diff --git a/fs/xfs/xfs_attr_leaf.c b/fs/xfs/xfs_attr_leaf.c index 9719bbef122c..8eab73e8340a 100644 --- a/fs/xfs/xfs_attr_leaf.c +++ b/fs/xfs/xfs_attr_leaf.c | |||
| @@ -94,7 +94,7 @@ STATIC int xfs_attr_leaf_entsize(xfs_attr_leafblock_t *leaf, int index); | |||
| 94 | * Namespace helper routines | 94 | * Namespace helper routines |
| 95 | *========================================================================*/ | 95 | *========================================================================*/ |
| 96 | 96 | ||
| 97 | STATIC inline attrnames_t * | 97 | STATIC_INLINE attrnames_t * |
| 98 | xfs_attr_flags_namesp(int flags) | 98 | xfs_attr_flags_namesp(int flags) |
| 99 | { | 99 | { |
| 100 | return ((flags & XFS_ATTR_SECURE) ? &attr_secure: | 100 | return ((flags & XFS_ATTR_SECURE) ? &attr_secure: |
| @@ -105,7 +105,7 @@ xfs_attr_flags_namesp(int flags) | |||
| 105 | * If namespace bits don't match return 0. | 105 | * If namespace bits don't match return 0. |
| 106 | * If all match then return 1. | 106 | * If all match then return 1. |
| 107 | */ | 107 | */ |
| 108 | STATIC inline int | 108 | STATIC_INLINE int |
| 109 | xfs_attr_namesp_match(int arg_flags, int ondisk_flags) | 109 | xfs_attr_namesp_match(int arg_flags, int ondisk_flags) |
| 110 | { | 110 | { |
| 111 | return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags); | 111 | return XFS_ATTR_NSP_ONDISK(ondisk_flags) == XFS_ATTR_NSP_ARGS_TO_ONDISK(arg_flags); |
| @@ -116,7 +116,7 @@ xfs_attr_namesp_match(int arg_flags, int ondisk_flags) | |||
| 116 | * then return 0. | 116 | * then return 0. |
| 117 | * If all match or are overridable then return 1. | 117 | * If all match or are overridable then return 1. |
| 118 | */ | 118 | */ |
| 119 | STATIC inline int | 119 | STATIC_INLINE int |
| 120 | xfs_attr_namesp_match_overrides(int arg_flags, int ondisk_flags) | 120 | xfs_attr_namesp_match_overrides(int arg_flags, int ondisk_flags) |
| 121 | { | 121 | { |
| 122 | if (((arg_flags & ATTR_SECURE) == 0) != | 122 | if (((arg_flags & ATTR_SECURE) == 0) != |
| @@ -150,6 +150,7 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) | |||
| 150 | int offset; | 150 | int offset; |
| 151 | int minforkoff; /* lower limit on valid forkoff locations */ | 151 | int minforkoff; /* lower limit on valid forkoff locations */ |
| 152 | int maxforkoff; /* upper limit on valid forkoff locations */ | 152 | int maxforkoff; /* upper limit on valid forkoff locations */ |
| 153 | int dsize; | ||
| 153 | xfs_mount_t *mp = dp->i_mount; | 154 | xfs_mount_t *mp = dp->i_mount; |
| 154 | 155 | ||
| 155 | offset = (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */ | 156 | offset = (XFS_LITINO(mp) - bytes) >> 3; /* rounded down */ |
| @@ -169,8 +170,43 @@ xfs_attr_shortform_bytesfit(xfs_inode_t *dp, int bytes) | |||
| 169 | return 0; | 170 | return 0; |
| 170 | } | 171 | } |
| 171 | 172 | ||
| 172 | /* data fork btree root can have at least this many key/ptr pairs */ | 173 | dsize = dp->i_df.if_bytes; |
| 173 | minforkoff = MAX(dp->i_df.if_bytes, XFS_BMDR_SPACE_CALC(MINDBTPTRS)); | 174 | |
| 175 | switch (dp->i_d.di_format) { | ||
| 176 | case XFS_DINODE_FMT_EXTENTS: | ||
| 177 | /* | ||
| 178 | * If there is no attr fork and the data fork is extents, | ||
| 179 | * determine if creating the default attr fork will result | ||
| 180 | * in the extents form migrating to btree. If so, the | ||
| 181 | * minimum offset only needs to be the space required for | ||
| 182 | * the btree root. | ||
| 183 | */ | ||
| 184 | if (!dp->i_d.di_forkoff && dp->i_df.if_bytes > mp->m_attroffset) | ||
| 185 | dsize = XFS_BMDR_SPACE_CALC(MINDBTPTRS); | ||
| 186 | break; | ||
| 187 | |||
| 188 | case XFS_DINODE_FMT_BTREE: | ||
| 189 | /* | ||
| 190 | * If have data btree then keep forkoff if we have one, | ||
| 191 | * otherwise we are adding a new attr, so then we set | ||
| 192 | * minforkoff to where the btree root can finish so we have | ||
| 193 | * plenty of room for attrs | ||
| 194 | */ | ||
| 195 | if (dp->i_d.di_forkoff) { | ||
| 196 | if (offset < dp->i_d.di_forkoff) | ||
| 197 | return 0; | ||
| 198 | else | ||
| 199 | return dp->i_d.di_forkoff; | ||
| 200 | } else | ||
| 201 | dsize = XFS_BMAP_BROOT_SPACE(dp->i_df.if_broot); | ||
| 202 | break; | ||
| 203 | } | ||
| 204 | |||
| 205 | /* | ||
| 206 | * A data fork btree root must have space for at least | ||
| 207 | * MINDBTPTRS key/ptr pairs if the data fork is small or empty. | ||
| 208 | */ | ||
| 209 | minforkoff = MAX(dsize, XFS_BMDR_SPACE_CALC(MINDBTPTRS)); | ||
| 174 | minforkoff = roundup(minforkoff, 8) >> 3; | 210 | minforkoff = roundup(minforkoff, 8) >> 3; |
| 175 | 211 | ||
| 176 | /* attr fork btree root can have at least this many key/ptr pairs */ | 212 | /* attr fork btree root can have at least this many key/ptr pairs */ |
| @@ -336,7 +372,8 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) | |||
| 336 | */ | 372 | */ |
| 337 | totsize -= size; | 373 | totsize -= size; |
| 338 | if (totsize == sizeof(xfs_attr_sf_hdr_t) && !args->addname && | 374 | if (totsize == sizeof(xfs_attr_sf_hdr_t) && !args->addname && |
| 339 | (mp->m_flags & XFS_MOUNT_ATTR2)) { | 375 | (mp->m_flags & XFS_MOUNT_ATTR2) && |
| 376 | (dp->i_d.di_format != XFS_DINODE_FMT_BTREE)) { | ||
| 340 | /* | 377 | /* |
| 341 | * Last attribute now removed, revert to original | 378 | * Last attribute now removed, revert to original |
| 342 | * inode format making all literal area available | 379 | * inode format making all literal area available |
| @@ -355,7 +392,8 @@ xfs_attr_shortform_remove(xfs_da_args_t *args) | |||
| 355 | dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize); | 392 | dp->i_d.di_forkoff = xfs_attr_shortform_bytesfit(dp, totsize); |
| 356 | ASSERT(dp->i_d.di_forkoff); | 393 | ASSERT(dp->i_d.di_forkoff); |
| 357 | ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || args->addname || | 394 | ASSERT(totsize > sizeof(xfs_attr_sf_hdr_t) || args->addname || |
| 358 | !(mp->m_flags & XFS_MOUNT_ATTR2)); | 395 | !(mp->m_flags & XFS_MOUNT_ATTR2) || |
| 396 | dp->i_d.di_format == XFS_DINODE_FMT_BTREE); | ||
| 359 | dp->i_afp->if_ext_max = | 397 | dp->i_afp->if_ext_max = |
| 360 | XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); | 398 | XFS_IFORK_ASIZE(dp) / (uint)sizeof(xfs_bmbt_rec_t); |
| 361 | dp->i_df.if_ext_max = | 399 | dp->i_df.if_ext_max = |
| @@ -748,6 +786,7 @@ xfs_attr_shortform_allfit(xfs_dabuf_t *bp, xfs_inode_t *dp) | |||
| 748 | + be16_to_cpu(name_loc->valuelen); | 786 | + be16_to_cpu(name_loc->valuelen); |
| 749 | } | 787 | } |
| 750 | if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) && | 788 | if ((dp->i_mount->m_flags & XFS_MOUNT_ATTR2) && |
| 789 | (dp->i_d.di_format != XFS_DINODE_FMT_BTREE) && | ||
| 751 | (bytes == sizeof(struct xfs_attr_sf_hdr))) | 790 | (bytes == sizeof(struct xfs_attr_sf_hdr))) |
| 752 | return(-1); | 791 | return(-1); |
| 753 | return(xfs_attr_shortform_bytesfit(dp, bytes)); | 792 | return(xfs_attr_shortform_bytesfit(dp, bytes)); |
| @@ -786,6 +825,7 @@ xfs_attr_leaf_to_shortform(xfs_dabuf_t *bp, xfs_da_args_t *args, int forkoff) | |||
| 786 | 825 | ||
| 787 | if (forkoff == -1) { | 826 | if (forkoff == -1) { |
| 788 | ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2); | 827 | ASSERT(dp->i_mount->m_flags & XFS_MOUNT_ATTR2); |
| 828 | ASSERT(dp->i_d.di_format != XFS_DINODE_FMT_BTREE); | ||
| 789 | 829 | ||
| 790 | /* | 830 | /* |
| 791 | * Last attribute was removed, revert to original | 831 | * Last attribute was removed, revert to original |
diff --git a/fs/xfs/xfs_bit.c b/fs/xfs/xfs_bit.c index 43be6a7e47c6..1afe07f67e3b 100644 --- a/fs/xfs/xfs_bit.c +++ b/fs/xfs/xfs_bit.c | |||
| @@ -29,7 +29,7 @@ | |||
| 29 | /* | 29 | /* |
| 30 | * Index of high bit number in byte, -1 for none set, 0..7 otherwise. | 30 | * Index of high bit number in byte, -1 for none set, 0..7 otherwise. |
| 31 | */ | 31 | */ |
| 32 | STATIC const char xfs_highbit[256] = { | 32 | static const char xfs_highbit[256] = { |
| 33 | -1, 0, 1, 1, 2, 2, 2, 2, /* 00 .. 07 */ | 33 | -1, 0, 1, 1, 2, 2, 2, 2, /* 00 .. 07 */ |
| 34 | 3, 3, 3, 3, 3, 3, 3, 3, /* 08 .. 0f */ | 34 | 3, 3, 3, 3, 3, 3, 3, 3, /* 08 .. 0f */ |
| 35 | 4, 4, 4, 4, 4, 4, 4, 4, /* 10 .. 17 */ | 35 | 4, 4, 4, 4, 4, 4, 4, 4, /* 10 .. 17 */ |
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 498ad50d1f45..87795188cedf 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
| @@ -185,16 +185,6 @@ xfs_bmap_btree_to_extents( | |||
| 185 | int *logflagsp, /* inode logging flags */ | 185 | int *logflagsp, /* inode logging flags */ |
| 186 | int whichfork); /* data or attr fork */ | 186 | int whichfork); /* data or attr fork */ |
| 187 | 187 | ||
| 188 | #ifdef DEBUG | ||
| 189 | /* | ||
| 190 | * Check that the extents list for the inode ip is in the right order. | ||
| 191 | */ | ||
| 192 | STATIC void | ||
| 193 | xfs_bmap_check_extents( | ||
| 194 | xfs_inode_t *ip, /* incore inode pointer */ | ||
| 195 | int whichfork); /* data or attr fork */ | ||
| 196 | #endif | ||
| 197 | |||
| 198 | /* | 188 | /* |
| 199 | * Called by xfs_bmapi to update file extent records and the btree | 189 | * Called by xfs_bmapi to update file extent records and the btree |
| 200 | * after removing space (or undoing a delayed allocation). | 190 | * after removing space (or undoing a delayed allocation). |
| @@ -410,7 +400,6 @@ xfs_bmap_count_leaves( | |||
| 410 | STATIC int | 400 | STATIC int |
| 411 | xfs_bmap_disk_count_leaves( | 401 | xfs_bmap_disk_count_leaves( |
| 412 | xfs_ifork_t *ifp, | 402 | xfs_ifork_t *ifp, |
| 413 | xfs_mount_t *mp, | ||
| 414 | xfs_extnum_t idx, | 403 | xfs_extnum_t idx, |
| 415 | xfs_bmbt_block_t *block, | 404 | xfs_bmbt_block_t *block, |
| 416 | int numrecs, | 405 | int numrecs, |
| @@ -684,7 +673,7 @@ xfs_bmap_add_extent( | |||
| 684 | ASSERT(nblks <= da_old); | 673 | ASSERT(nblks <= da_old); |
| 685 | if (nblks < da_old) | 674 | if (nblks < da_old) |
| 686 | xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, | 675 | xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, |
| 687 | (int)(da_old - nblks), rsvd); | 676 | (int64_t)(da_old - nblks), rsvd); |
| 688 | } | 677 | } |
| 689 | /* | 678 | /* |
| 690 | * Clear out the allocated field, done with it now in any case. | 679 | * Clear out the allocated field, done with it now in any case. |
| @@ -1209,7 +1198,7 @@ xfs_bmap_add_extent_delay_real( | |||
| 1209 | diff = (int)(temp + temp2 - STARTBLOCKVAL(PREV.br_startblock) - | 1198 | diff = (int)(temp + temp2 - STARTBLOCKVAL(PREV.br_startblock) - |
| 1210 | (cur ? cur->bc_private.b.allocated : 0)); | 1199 | (cur ? cur->bc_private.b.allocated : 0)); |
| 1211 | if (diff > 0 && | 1200 | if (diff > 0 && |
| 1212 | xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, -diff, rsvd)) { | 1201 | xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) { |
| 1213 | /* | 1202 | /* |
| 1214 | * Ick gross gag me with a spoon. | 1203 | * Ick gross gag me with a spoon. |
| 1215 | */ | 1204 | */ |
| @@ -1220,7 +1209,7 @@ xfs_bmap_add_extent_delay_real( | |||
| 1220 | diff--; | 1209 | diff--; |
| 1221 | if (!diff || | 1210 | if (!diff || |
| 1222 | !xfs_mod_incore_sb(ip->i_mount, | 1211 | !xfs_mod_incore_sb(ip->i_mount, |
| 1223 | XFS_SBS_FDBLOCKS, -diff, rsvd)) | 1212 | XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) |
| 1224 | break; | 1213 | break; |
| 1225 | } | 1214 | } |
| 1226 | if (temp2) { | 1215 | if (temp2) { |
| @@ -1228,7 +1217,7 @@ xfs_bmap_add_extent_delay_real( | |||
| 1228 | diff--; | 1217 | diff--; |
| 1229 | if (!diff || | 1218 | if (!diff || |
| 1230 | !xfs_mod_incore_sb(ip->i_mount, | 1219 | !xfs_mod_incore_sb(ip->i_mount, |
| 1231 | XFS_SBS_FDBLOCKS, -diff, rsvd)) | 1220 | XFS_SBS_FDBLOCKS, -((int64_t)diff), rsvd)) |
| 1232 | break; | 1221 | break; |
| 1233 | } | 1222 | } |
| 1234 | } | 1223 | } |
| @@ -2015,7 +2004,7 @@ xfs_bmap_add_extent_hole_delay( | |||
| 2015 | if (oldlen != newlen) { | 2004 | if (oldlen != newlen) { |
| 2016 | ASSERT(oldlen > newlen); | 2005 | ASSERT(oldlen > newlen); |
| 2017 | xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, | 2006 | xfs_mod_incore_sb(ip->i_mount, XFS_SBS_FDBLOCKS, |
| 2018 | (int)(oldlen - newlen), rsvd); | 2007 | (int64_t)(oldlen - newlen), rsvd); |
| 2019 | /* | 2008 | /* |
| 2020 | * Nothing to do for disk quota accounting here. | 2009 | * Nothing to do for disk quota accounting here. |
| 2021 | */ | 2010 | */ |
| @@ -3359,7 +3348,7 @@ xfs_bmap_del_extent( | |||
| 3359 | */ | 3348 | */ |
| 3360 | ASSERT(da_old >= da_new); | 3349 | ASSERT(da_old >= da_new); |
| 3361 | if (da_old > da_new) | 3350 | if (da_old > da_new) |
| 3362 | xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int)(da_old - da_new), | 3351 | xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, (int64_t)(da_old - da_new), |
| 3363 | rsvd); | 3352 | rsvd); |
| 3364 | if (delta) { | 3353 | if (delta) { |
| 3365 | /* DELTA: report the original extent. */ | 3354 | /* DELTA: report the original extent. */ |
| @@ -3543,6 +3532,7 @@ xfs_bmap_forkoff_reset( | |||
| 3543 | if (whichfork == XFS_ATTR_FORK && | 3532 | if (whichfork == XFS_ATTR_FORK && |
| 3544 | (ip->i_d.di_format != XFS_DINODE_FMT_DEV) && | 3533 | (ip->i_d.di_format != XFS_DINODE_FMT_DEV) && |
| 3545 | (ip->i_d.di_format != XFS_DINODE_FMT_UUID) && | 3534 | (ip->i_d.di_format != XFS_DINODE_FMT_UUID) && |
| 3535 | (ip->i_d.di_format != XFS_DINODE_FMT_BTREE) && | ||
| 3546 | ((mp->m_attroffset >> 3) > ip->i_d.di_forkoff)) { | 3536 | ((mp->m_attroffset >> 3) > ip->i_d.di_forkoff)) { |
| 3547 | ip->i_d.di_forkoff = mp->m_attroffset >> 3; | 3537 | ip->i_d.di_forkoff = mp->m_attroffset >> 3; |
| 3548 | ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) / | 3538 | ip->i_df.if_ext_max = XFS_IFORK_DSIZE(ip) / |
| @@ -4079,7 +4069,7 @@ xfs_bmap_add_attrfork( | |||
| 4079 | } else | 4069 | } else |
| 4080 | XFS_SB_UNLOCK(mp, s); | 4070 | XFS_SB_UNLOCK(mp, s); |
| 4081 | } | 4071 | } |
| 4082 | if ((error = xfs_bmap_finish(&tp, &flist, firstblock, &committed))) | 4072 | if ((error = xfs_bmap_finish(&tp, &flist, &committed))) |
| 4083 | goto error2; | 4073 | goto error2; |
| 4084 | error = xfs_trans_commit(tp, XFS_TRANS_PERM_LOG_RES, NULL); | 4074 | error = xfs_trans_commit(tp, XFS_TRANS_PERM_LOG_RES, NULL); |
| 4085 | ASSERT(ip->i_df.if_ext_max == | 4075 | ASSERT(ip->i_df.if_ext_max == |
| @@ -4212,7 +4202,6 @@ int /* error */ | |||
| 4212 | xfs_bmap_finish( | 4202 | xfs_bmap_finish( |
| 4213 | xfs_trans_t **tp, /* transaction pointer addr */ | 4203 | xfs_trans_t **tp, /* transaction pointer addr */ |
| 4214 | xfs_bmap_free_t *flist, /* i/o: list extents to free */ | 4204 | xfs_bmap_free_t *flist, /* i/o: list extents to free */ |
| 4215 | xfs_fsblock_t firstblock, /* controlled ag for allocs */ | ||
| 4216 | int *committed) /* xact committed or not */ | 4205 | int *committed) /* xact committed or not */ |
| 4217 | { | 4206 | { |
| 4218 | xfs_efd_log_item_t *efd; /* extent free data */ | 4207 | xfs_efd_log_item_t *efd; /* extent free data */ |
| @@ -4533,8 +4522,7 @@ xfs_bmap_read_extents( | |||
| 4533 | error0); | 4522 | error0); |
| 4534 | if (level == 0) | 4523 | if (level == 0) |
| 4535 | break; | 4524 | break; |
| 4536 | pp = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt, block, | 4525 | pp = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, 1, mp->m_bmap_dmxr[1]); |
| 4537 | 1, mp->m_bmap_dmxr[1]); | ||
| 4538 | bno = be64_to_cpu(*pp); | 4526 | bno = be64_to_cpu(*pp); |
| 4539 | XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); | 4527 | XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); |
| 4540 | xfs_trans_brelse(tp, bp); | 4528 | xfs_trans_brelse(tp, bp); |
| @@ -4577,8 +4565,7 @@ xfs_bmap_read_extents( | |||
| 4577 | /* | 4565 | /* |
| 4578 | * Copy records into the extent records. | 4566 | * Copy records into the extent records. |
| 4579 | */ | 4567 | */ |
| 4580 | frp = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt, | 4568 | frp = XFS_BTREE_REC_ADDR(xfs_bmbt, block, 1); |
| 4581 | block, 1, mp->m_bmap_dmxr[0]); | ||
| 4582 | start = i; | 4569 | start = i; |
| 4583 | for (j = 0; j < num_recs; j++, i++, frp++) { | 4570 | for (j = 0; j < num_recs; j++, i++, frp++) { |
| 4584 | trp = xfs_iext_get_ext(ifp, i); | 4571 | trp = xfs_iext_get_ext(ifp, i); |
| @@ -4929,28 +4916,28 @@ xfs_bmapi( | |||
| 4929 | if (rt) { | 4916 | if (rt) { |
| 4930 | error = xfs_mod_incore_sb(mp, | 4917 | error = xfs_mod_incore_sb(mp, |
| 4931 | XFS_SBS_FREXTENTS, | 4918 | XFS_SBS_FREXTENTS, |
| 4932 | -(extsz), (flags & | 4919 | -((int64_t)extsz), (flags & |
| 4933 | XFS_BMAPI_RSVBLOCKS)); | 4920 | XFS_BMAPI_RSVBLOCKS)); |
| 4934 | } else { | 4921 | } else { |
| 4935 | error = xfs_mod_incore_sb(mp, | 4922 | error = xfs_mod_incore_sb(mp, |
| 4936 | XFS_SBS_FDBLOCKS, | 4923 | XFS_SBS_FDBLOCKS, |
| 4937 | -(alen), (flags & | 4924 | -((int64_t)alen), (flags & |
| 4938 | XFS_BMAPI_RSVBLOCKS)); | 4925 | XFS_BMAPI_RSVBLOCKS)); |
| 4939 | } | 4926 | } |
| 4940 | if (!error) { | 4927 | if (!error) { |
| 4941 | error = xfs_mod_incore_sb(mp, | 4928 | error = xfs_mod_incore_sb(mp, |
| 4942 | XFS_SBS_FDBLOCKS, | 4929 | XFS_SBS_FDBLOCKS, |
| 4943 | -(indlen), (flags & | 4930 | -((int64_t)indlen), (flags & |
| 4944 | XFS_BMAPI_RSVBLOCKS)); | 4931 | XFS_BMAPI_RSVBLOCKS)); |
| 4945 | if (error && rt) | 4932 | if (error && rt) |
| 4946 | xfs_mod_incore_sb(mp, | 4933 | xfs_mod_incore_sb(mp, |
| 4947 | XFS_SBS_FREXTENTS, | 4934 | XFS_SBS_FREXTENTS, |
| 4948 | extsz, (flags & | 4935 | (int64_t)extsz, (flags & |
| 4949 | XFS_BMAPI_RSVBLOCKS)); | 4936 | XFS_BMAPI_RSVBLOCKS)); |
| 4950 | else if (error) | 4937 | else if (error) |
| 4951 | xfs_mod_incore_sb(mp, | 4938 | xfs_mod_incore_sb(mp, |
| 4952 | XFS_SBS_FDBLOCKS, | 4939 | XFS_SBS_FDBLOCKS, |
| 4953 | alen, (flags & | 4940 | (int64_t)alen, (flags & |
| 4954 | XFS_BMAPI_RSVBLOCKS)); | 4941 | XFS_BMAPI_RSVBLOCKS)); |
| 4955 | } | 4942 | } |
| 4956 | 4943 | ||
| @@ -5616,13 +5603,13 @@ xfs_bunmapi( | |||
| 5616 | rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); | 5603 | rtexts = XFS_FSB_TO_B(mp, del.br_blockcount); |
| 5617 | do_div(rtexts, mp->m_sb.sb_rextsize); | 5604 | do_div(rtexts, mp->m_sb.sb_rextsize); |
| 5618 | xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, | 5605 | xfs_mod_incore_sb(mp, XFS_SBS_FREXTENTS, |
| 5619 | (int)rtexts, rsvd); | 5606 | (int64_t)rtexts, rsvd); |
| 5620 | (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, | 5607 | (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, |
| 5621 | NULL, ip, -((long)del.br_blockcount), 0, | 5608 | NULL, ip, -((long)del.br_blockcount), 0, |
| 5622 | XFS_QMOPT_RES_RTBLKS); | 5609 | XFS_QMOPT_RES_RTBLKS); |
| 5623 | } else { | 5610 | } else { |
| 5624 | xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, | 5611 | xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, |
| 5625 | (int)del.br_blockcount, rsvd); | 5612 | (int64_t)del.br_blockcount, rsvd); |
| 5626 | (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, | 5613 | (void)XFS_TRANS_RESERVE_QUOTA_NBLKS(mp, |
| 5627 | NULL, ip, -((long)del.br_blockcount), 0, | 5614 | NULL, ip, -((long)del.br_blockcount), 0, |
| 5628 | XFS_QMOPT_RES_REGBLKS); | 5615 | XFS_QMOPT_RES_REGBLKS); |
| @@ -6048,32 +6035,6 @@ xfs_bmap_eof( | |||
| 6048 | } | 6035 | } |
| 6049 | 6036 | ||
| 6050 | #ifdef DEBUG | 6037 | #ifdef DEBUG |
| 6051 | /* | ||
| 6052 | * Check that the extents list for the inode ip is in the right order. | ||
| 6053 | */ | ||
| 6054 | STATIC void | ||
| 6055 | xfs_bmap_check_extents( | ||
| 6056 | xfs_inode_t *ip, /* incore inode pointer */ | ||
| 6057 | int whichfork) /* data or attr fork */ | ||
| 6058 | { | ||
| 6059 | xfs_bmbt_rec_t *ep; /* current extent entry */ | ||
| 6060 | xfs_extnum_t idx; /* extent record index */ | ||
| 6061 | xfs_ifork_t *ifp; /* inode fork pointer */ | ||
| 6062 | xfs_extnum_t nextents; /* number of extents in list */ | ||
| 6063 | xfs_bmbt_rec_t *nextp; /* next extent entry */ | ||
| 6064 | |||
| 6065 | ifp = XFS_IFORK_PTR(ip, whichfork); | ||
| 6066 | ASSERT(ifp->if_flags & XFS_IFEXTENTS); | ||
| 6067 | nextents = ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t); | ||
| 6068 | ep = xfs_iext_get_ext(ifp, 0); | ||
| 6069 | for (idx = 0; idx < nextents - 1; idx++) { | ||
| 6070 | nextp = xfs_iext_get_ext(ifp, idx + 1); | ||
| 6071 | xfs_btree_check_rec(XFS_BTNUM_BMAP, (void *)ep, | ||
| 6072 | (void *)(nextp)); | ||
| 6073 | ep = nextp; | ||
| 6074 | } | ||
| 6075 | } | ||
| 6076 | |||
| 6077 | STATIC | 6038 | STATIC |
| 6078 | xfs_buf_t * | 6039 | xfs_buf_t * |
| 6079 | xfs_bmap_get_bp( | 6040 | xfs_bmap_get_bp( |
| @@ -6156,8 +6117,7 @@ xfs_check_block( | |||
| 6156 | if (root) { | 6117 | if (root) { |
| 6157 | keyp = XFS_BMAP_BROOT_KEY_ADDR(block, i, sz); | 6118 | keyp = XFS_BMAP_BROOT_KEY_ADDR(block, i, sz); |
| 6158 | } else { | 6119 | } else { |
| 6159 | keyp = XFS_BTREE_KEY_ADDR(mp->m_sb.sb_blocksize, | 6120 | keyp = XFS_BTREE_KEY_ADDR(xfs_bmbt, block, i); |
| 6160 | xfs_bmbt, block, i, dmxr); | ||
| 6161 | } | 6121 | } |
| 6162 | 6122 | ||
| 6163 | if (prevp) { | 6123 | if (prevp) { |
| @@ -6172,15 +6132,14 @@ xfs_check_block( | |||
| 6172 | if (root) { | 6132 | if (root) { |
| 6173 | pp = XFS_BMAP_BROOT_PTR_ADDR(block, i, sz); | 6133 | pp = XFS_BMAP_BROOT_PTR_ADDR(block, i, sz); |
| 6174 | } else { | 6134 | } else { |
| 6175 | pp = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize, | 6135 | pp = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, i, dmxr); |
| 6176 | xfs_bmbt, block, i, dmxr); | ||
| 6177 | } | 6136 | } |
| 6178 | for (j = i+1; j <= be16_to_cpu(block->bb_numrecs); j++) { | 6137 | for (j = i+1; j <= be16_to_cpu(block->bb_numrecs); j++) { |
| 6179 | if (root) { | 6138 | if (root) { |
| 6180 | thispa = XFS_BMAP_BROOT_PTR_ADDR(block, j, sz); | 6139 | thispa = XFS_BMAP_BROOT_PTR_ADDR(block, j, sz); |
| 6181 | } else { | 6140 | } else { |
| 6182 | thispa = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize, | 6141 | thispa = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, j, |
| 6183 | xfs_bmbt, block, j, dmxr); | 6142 | dmxr); |
| 6184 | } | 6143 | } |
| 6185 | if (*thispa == *pp) { | 6144 | if (*thispa == *pp) { |
| 6186 | cmn_err(CE_WARN, "%s: thispa(%d) == pp(%d) %Ld", | 6145 | cmn_err(CE_WARN, "%s: thispa(%d) == pp(%d) %Ld", |
| @@ -6267,8 +6226,7 @@ xfs_bmap_check_leaf_extents( | |||
| 6267 | */ | 6226 | */ |
| 6268 | 6227 | ||
| 6269 | xfs_check_block(block, mp, 0, 0); | 6228 | xfs_check_block(block, mp, 0, 0); |
| 6270 | pp = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt, block, | 6229 | pp = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, 1, mp->m_bmap_dmxr[1]); |
| 6271 | 1, mp->m_bmap_dmxr[1]); | ||
| 6272 | bno = be64_to_cpu(*pp); | 6230 | bno = be64_to_cpu(*pp); |
| 6273 | XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); | 6231 | XFS_WANT_CORRUPTED_GOTO(XFS_FSB_SANITY_CHECK(mp, bno), error0); |
| 6274 | if (bp_release) { | 6232 | if (bp_release) { |
| @@ -6305,11 +6263,9 @@ xfs_bmap_check_leaf_extents( | |||
| 6305 | * conform with the first entry in this one. | 6263 | * conform with the first entry in this one. |
| 6306 | */ | 6264 | */ |
| 6307 | 6265 | ||
| 6308 | ep = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt, | 6266 | ep = XFS_BTREE_REC_ADDR(xfs_bmbt, block, 1); |
| 6309 | block, 1, mp->m_bmap_dmxr[0]); | ||
| 6310 | for (j = 1; j < num_recs; j++) { | 6267 | for (j = 1; j < num_recs; j++) { |
| 6311 | nextp = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_bmbt, | 6268 | nextp = XFS_BTREE_REC_ADDR(xfs_bmbt, block, j + 1); |
| 6312 | block, j + 1, mp->m_bmap_dmxr[0]); | ||
| 6313 | if (lastp) { | 6269 | if (lastp) { |
| 6314 | xfs_btree_check_rec(XFS_BTNUM_BMAP, | 6270 | xfs_btree_check_rec(XFS_BTNUM_BMAP, |
| 6315 | (void *)lastp, (void *)ep); | 6271 | (void *)lastp, (void *)ep); |
| @@ -6454,8 +6410,7 @@ xfs_bmap_count_tree( | |||
| 6454 | } | 6410 | } |
| 6455 | 6411 | ||
| 6456 | /* Dive to the next level */ | 6412 | /* Dive to the next level */ |
| 6457 | pp = XFS_BTREE_PTR_ADDR(mp->m_sb.sb_blocksize, | 6413 | pp = XFS_BTREE_PTR_ADDR(xfs_bmbt, block, 1, mp->m_bmap_dmxr[1]); |
| 6458 | xfs_bmbt, block, 1, mp->m_bmap_dmxr[1]); | ||
| 6459 | bno = be64_to_cpu(*pp); | 6414 | bno = be64_to_cpu(*pp); |
| 6460 | if (unlikely((error = | 6415 | if (unlikely((error = |
| 6461 | xfs_bmap_count_tree(mp, tp, ifp, bno, level, count)) < 0)) { | 6416 | xfs_bmap_count_tree(mp, tp, ifp, bno, level, count)) < 0)) { |
| @@ -6470,7 +6425,7 @@ xfs_bmap_count_tree( | |||
| 6470 | for (;;) { | 6425 | for (;;) { |
| 6471 | nextbno = be64_to_cpu(block->bb_rightsib); | 6426 | nextbno = be64_to_cpu(block->bb_rightsib); |
| 6472 | numrecs = be16_to_cpu(block->bb_numrecs); | 6427 | numrecs = be16_to_cpu(block->bb_numrecs); |
| 6473 | if (unlikely(xfs_bmap_disk_count_leaves(ifp, mp, | 6428 | if (unlikely(xfs_bmap_disk_count_leaves(ifp, |
| 6474 | 0, block, numrecs, count) < 0)) { | 6429 | 0, block, numrecs, count) < 0)) { |
| 6475 | xfs_trans_brelse(tp, bp); | 6430 | xfs_trans_brelse(tp, bp); |
| 6476 | XFS_ERROR_REPORT("xfs_bmap_count_tree(2)", | 6431 | XFS_ERROR_REPORT("xfs_bmap_count_tree(2)", |
| @@ -6518,7 +6473,6 @@ xfs_bmap_count_leaves( | |||
| 6518 | int | 6473 | int |
| 6519 | xfs_bmap_disk_count_leaves( | 6474 | xfs_bmap_disk_count_leaves( |
| 6520 | xfs_ifork_t *ifp, | 6475 | xfs_ifork_t *ifp, |
| 6521 | xfs_mount_t *mp, | ||
| 6522 | xfs_extnum_t idx, | 6476 | xfs_extnum_t idx, |
| 6523 | xfs_bmbt_block_t *block, | 6477 | xfs_bmbt_block_t *block, |
| 6524 | int numrecs, | 6478 | int numrecs, |
| @@ -6528,8 +6482,7 @@ xfs_bmap_disk_count_leaves( | |||
| 6528 | xfs_bmbt_rec_t *frp; | 6482 | xfs_bmbt_rec_t *frp; |
| 6529 | 6483 | ||
| 6530 | for (b = 1; b <= numrecs; b++) { | 6484 | for (b = 1; b <= numrecs; b++) { |
| 6531 | frp = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, | 6485 | frp = XFS_BTREE_REC_ADDR(xfs_bmbt, block, idx + b); |
| 6532 | xfs_bmbt, block, idx + b, mp->m_bmap_dmxr[0]); | ||
| 6533 | *count += xfs_bmbt_disk_get_blockcount(frp); | 6486 | *count += xfs_bmbt_disk_get_blockcount(frp); |
| 6534 | } | 6487 | } |
| 6535 | return 0; | 6488 | return 0; |
diff --git a/fs/xfs/xfs_bmap.h b/fs/xfs/xfs_bmap.h index 80e93409b78d..4f24c7e39b31 100644 --- a/fs/xfs/xfs_bmap.h +++ b/fs/xfs/xfs_bmap.h | |||
| @@ -202,7 +202,6 @@ int /* error */ | |||
| 202 | xfs_bmap_finish( | 202 | xfs_bmap_finish( |
| 203 | struct xfs_trans **tp, /* transaction pointer addr */ | 203 | struct xfs_trans **tp, /* transaction pointer addr */ |
| 204 | xfs_bmap_free_t *flist, /* i/o: list extents to free */ | 204 | xfs_bmap_free_t *flist, /* i/o: list extents to free */ |
| 205 | xfs_fsblock_t firstblock, /* controlled a.g. for allocs */ | ||
| 206 | int *committed); /* xact committed or not */ | 205 | int *committed); /* xact committed or not */ |
| 207 | 206 | ||
| 208 | /* | 207 | /* |
diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index a7b835bf870a..0bf192fea3eb 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c | |||
| @@ -678,47 +678,6 @@ error0: | |||
| 678 | return error; | 678 | return error; |
| 679 | } | 679 | } |
| 680 | 680 | ||
| 681 | #ifdef DEBUG | ||
| 682 | /* | ||
| 683 | * Get the data from the pointed-to record. | ||
| 684 | */ | ||
| 685 | int | ||
| 686 | xfs_bmbt_get_rec( | ||
| 687 | xfs_btree_cur_t *cur, | ||
| 688 | xfs_fileoff_t *off, | ||
| 689 | xfs_fsblock_t *bno, | ||
| 690 | xfs_filblks_t *len, | ||
| 691 | xfs_exntst_t *state, | ||
| 692 | int *stat) | ||
| 693 | { | ||
| 694 | xfs_bmbt_block_t *block; | ||
| 695 | xfs_buf_t *bp; | ||
| 696 | #ifdef DEBUG | ||
| 697 | int error; | ||
| 698 | #endif | ||
| 699 | int ptr; | ||
| 700 | xfs_bmbt_rec_t *rp; | ||
| 701 | |||
| 702 | block = xfs_bmbt_get_block(cur, 0, &bp); | ||
| 703 | ptr = cur->bc_ptrs[0]; | ||
| 704 | #ifdef DEBUG | ||
| 705 | if ((error = xfs_btree_check_lblock(cur, block, 0, bp))) | ||
| 706 | return error; | ||
| 707 | #endif | ||
| 708 | if (ptr > be16_to_cpu(block->bb_numrecs) || ptr <= 0) { | ||
| 709 | *stat = 0; | ||
| 710 | return 0; | ||
| 711 | } | ||
| 712 | rp = XFS_BMAP_REC_IADDR(block, ptr, cur); | ||
| 713 | *off = xfs_bmbt_disk_get_startoff(rp); | ||
| 714 | *bno = xfs_bmbt_disk_get_startblock(rp); | ||
| 715 | *len = xfs_bmbt_disk_get_blockcount(rp); | ||
| 716 | *state = xfs_bmbt_disk_get_state(rp); | ||
| 717 | *stat = 1; | ||
| 718 | return 0; | ||
| 719 | } | ||
| 720 | #endif | ||
| 721 | |||
| 722 | /* | 681 | /* |
| 723 | * Insert one record/level. Return information to the caller | 682 | * Insert one record/level. Return information to the caller |
| 724 | * allowing the next level up to proceed if necessary. | 683 | * allowing the next level up to proceed if necessary. |
| @@ -1731,9 +1690,9 @@ xfs_bmdr_to_bmbt( | |||
| 1731 | rblock->bb_leftsib = cpu_to_be64(NULLDFSBNO); | 1690 | rblock->bb_leftsib = cpu_to_be64(NULLDFSBNO); |
| 1732 | rblock->bb_rightsib = cpu_to_be64(NULLDFSBNO); | 1691 | rblock->bb_rightsib = cpu_to_be64(NULLDFSBNO); |
| 1733 | dmxr = (int)XFS_BTREE_BLOCK_MAXRECS(dblocklen, xfs_bmdr, 0); | 1692 | dmxr = (int)XFS_BTREE_BLOCK_MAXRECS(dblocklen, xfs_bmdr, 0); |
| 1734 | fkp = XFS_BTREE_KEY_ADDR(dblocklen, xfs_bmdr, dblock, 1, dmxr); | 1693 | fkp = XFS_BTREE_KEY_ADDR(xfs_bmdr, dblock, 1); |
| 1735 | tkp = XFS_BMAP_BROOT_KEY_ADDR(rblock, 1, rblocklen); | 1694 | tkp = XFS_BMAP_BROOT_KEY_ADDR(rblock, 1, rblocklen); |
| 1736 | fpp = XFS_BTREE_PTR_ADDR(dblocklen, xfs_bmdr, dblock, 1, dmxr); | 1695 | fpp = XFS_BTREE_PTR_ADDR(xfs_bmdr, dblock, 1, dmxr); |
| 1737 | tpp = XFS_BMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen); | 1696 | tpp = XFS_BMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen); |
| 1738 | dmxr = be16_to_cpu(dblock->bb_numrecs); | 1697 | dmxr = be16_to_cpu(dblock->bb_numrecs); |
| 1739 | memcpy(tkp, fkp, sizeof(*fkp) * dmxr); | 1698 | memcpy(tkp, fkp, sizeof(*fkp) * dmxr); |
| @@ -1862,7 +1821,7 @@ xfs_bmbt_delete( | |||
| 1862 | * xfs_bmbt_get_startblock, xfs_bmbt_get_blockcount and xfs_bmbt_get_state. | 1821 | * xfs_bmbt_get_startblock, xfs_bmbt_get_blockcount and xfs_bmbt_get_state. |
| 1863 | */ | 1822 | */ |
| 1864 | 1823 | ||
| 1865 | STATIC __inline__ void | 1824 | STATIC_INLINE void |
| 1866 | __xfs_bmbt_get_all( | 1825 | __xfs_bmbt_get_all( |
| 1867 | __uint64_t l0, | 1826 | __uint64_t l0, |
| 1868 | __uint64_t l1, | 1827 | __uint64_t l1, |
| @@ -2016,30 +1975,6 @@ xfs_bmbt_disk_get_blockcount( | |||
| 2016 | } | 1975 | } |
| 2017 | 1976 | ||
| 2018 | /* | 1977 | /* |
| 2019 | * Extract the startblock field from an on disk bmap extent record. | ||
| 2020 | */ | ||
| 2021 | xfs_fsblock_t | ||
| 2022 | xfs_bmbt_disk_get_startblock( | ||
| 2023 | xfs_bmbt_rec_t *r) | ||
| 2024 | { | ||
| 2025 | #if XFS_BIG_BLKNOS | ||
| 2026 | return (((xfs_fsblock_t)INT_GET(r->l0, ARCH_CONVERT) & XFS_MASK64LO(9)) << 43) | | ||
| 2027 | (((xfs_fsblock_t)INT_GET(r->l1, ARCH_CONVERT)) >> 21); | ||
| 2028 | #else | ||
| 2029 | #ifdef DEBUG | ||
| 2030 | xfs_dfsbno_t b; | ||
| 2031 | |||
| 2032 | b = (((xfs_dfsbno_t)INT_GET(r->l0, ARCH_CONVERT) & XFS_MASK64LO(9)) << 43) | | ||
| 2033 | (((xfs_dfsbno_t)INT_GET(r->l1, ARCH_CONVERT)) >> 21); | ||
| 2034 | ASSERT((b >> 32) == 0 || ISNULLDSTARTBLOCK(b)); | ||
| 2035 | return (xfs_fsblock_t)b; | ||
| 2036 | #else /* !DEBUG */ | ||
| 2037 | return (xfs_fsblock_t)(((xfs_dfsbno_t)INT_GET(r->l1, ARCH_CONVERT)) >> 21); | ||
| 2038 | #endif /* DEBUG */ | ||
| 2039 | #endif /* XFS_BIG_BLKNOS */ | ||
| 2040 | } | ||
| 2041 | |||
| 2042 | /* | ||
| 2043 | * Extract the startoff field from a disk format bmap extent record. | 1978 | * Extract the startoff field from a disk format bmap extent record. |
| 2044 | */ | 1979 | */ |
| 2045 | xfs_fileoff_t | 1980 | xfs_fileoff_t |
| @@ -2049,17 +1984,6 @@ xfs_bmbt_disk_get_startoff( | |||
| 2049 | return ((xfs_fileoff_t)INT_GET(r->l0, ARCH_CONVERT) & | 1984 | return ((xfs_fileoff_t)INT_GET(r->l0, ARCH_CONVERT) & |
| 2050 | XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; | 1985 | XFS_MASK64LO(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; |
| 2051 | } | 1986 | } |
| 2052 | |||
| 2053 | xfs_exntst_t | ||
| 2054 | xfs_bmbt_disk_get_state( | ||
| 2055 | xfs_bmbt_rec_t *r) | ||
| 2056 | { | ||
| 2057 | int ext_flag; | ||
| 2058 | |||
| 2059 | ext_flag = (int)((INT_GET(r->l0, ARCH_CONVERT)) >> (64 - BMBT_EXNTFLAG_BITLEN)); | ||
| 2060 | return xfs_extent_state(xfs_bmbt_disk_get_blockcount(r), | ||
| 2061 | ext_flag); | ||
| 2062 | } | ||
| 2063 | #endif /* XFS_NATIVE_HOST */ | 1987 | #endif /* XFS_NATIVE_HOST */ |
| 2064 | 1988 | ||
| 2065 | 1989 | ||
| @@ -2684,9 +2608,9 @@ xfs_bmbt_to_bmdr( | |||
| 2684 | dblock->bb_numrecs = rblock->bb_numrecs; | 2608 | dblock->bb_numrecs = rblock->bb_numrecs; |
| 2685 | dmxr = (int)XFS_BTREE_BLOCK_MAXRECS(dblocklen, xfs_bmdr, 0); | 2609 | dmxr = (int)XFS_BTREE_BLOCK_MAXRECS(dblocklen, xfs_bmdr, 0); |
| 2686 | fkp = XFS_BMAP_BROOT_KEY_ADDR(rblock, 1, rblocklen); | 2610 | fkp = XFS_BMAP_BROOT_KEY_ADDR(rblock, 1, rblocklen); |
| 2687 | tkp = XFS_BTREE_KEY_ADDR(dblocklen, xfs_bmdr, dblock, 1, dmxr); | 2611 | tkp = XFS_BTREE_KEY_ADDR(xfs_bmdr, dblock, 1); |
| 2688 | fpp = XFS_BMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen); | 2612 | fpp = XFS_BMAP_BROOT_PTR_ADDR(rblock, 1, rblocklen); |
| 2689 | tpp = XFS_BTREE_PTR_ADDR(dblocklen, xfs_bmdr, dblock, 1, dmxr); | 2613 | tpp = XFS_BTREE_PTR_ADDR(xfs_bmdr, dblock, 1, dmxr); |
| 2690 | dmxr = be16_to_cpu(dblock->bb_numrecs); | 2614 | dmxr = be16_to_cpu(dblock->bb_numrecs); |
| 2691 | memcpy(tkp, fkp, sizeof(*fkp) * dmxr); | 2615 | memcpy(tkp, fkp, sizeof(*fkp) * dmxr); |
| 2692 | memcpy(tpp, fpp, sizeof(*fpp) * dmxr); | 2616 | memcpy(tpp, fpp, sizeof(*fpp) * dmxr); |
diff --git a/fs/xfs/xfs_bmap_btree.h b/fs/xfs/xfs_bmap_btree.h index 49539de9525b..a77b1b753d0c 100644 --- a/fs/xfs/xfs_bmap_btree.h +++ b/fs/xfs/xfs_bmap_btree.h | |||
| @@ -175,19 +175,11 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t; | |||
| 175 | 175 | ||
| 176 | #define XFS_BUF_TO_BMBT_BLOCK(bp) ((xfs_bmbt_block_t *)XFS_BUF_PTR(bp)) | 176 | #define XFS_BUF_TO_BMBT_BLOCK(bp) ((xfs_bmbt_block_t *)XFS_BUF_PTR(bp)) |
| 177 | 177 | ||
| 178 | #define XFS_BMAP_IBLOCK_SIZE(lev,cur) (1 << (cur)->bc_blocklog) | ||
| 179 | #define XFS_BMAP_RBLOCK_DSIZE(lev,cur) ((cur)->bc_private.b.forksize) | 178 | #define XFS_BMAP_RBLOCK_DSIZE(lev,cur) ((cur)->bc_private.b.forksize) |
| 180 | #define XFS_BMAP_RBLOCK_ISIZE(lev,cur) \ | 179 | #define XFS_BMAP_RBLOCK_ISIZE(lev,cur) \ |
| 181 | ((int)XFS_IFORK_PTR((cur)->bc_private.b.ip, \ | 180 | ((int)XFS_IFORK_PTR((cur)->bc_private.b.ip, \ |
| 182 | (cur)->bc_private.b.whichfork)->if_broot_bytes) | 181 | (cur)->bc_private.b.whichfork)->if_broot_bytes) |
| 183 | 182 | ||
| 184 | #define XFS_BMAP_BLOCK_DSIZE(lev,cur) \ | ||
| 185 | (((lev) == (cur)->bc_nlevels - 1 ? \ | ||
| 186 | XFS_BMAP_RBLOCK_DSIZE(lev,cur) : XFS_BMAP_IBLOCK_SIZE(lev,cur))) | ||
| 187 | #define XFS_BMAP_BLOCK_ISIZE(lev,cur) \ | ||
| 188 | (((lev) == (cur)->bc_nlevels - 1 ? \ | ||
| 189 | XFS_BMAP_RBLOCK_ISIZE(lev,cur) : XFS_BMAP_IBLOCK_SIZE(lev,cur))) | ||
| 190 | |||
| 191 | #define XFS_BMAP_BLOCK_DMAXRECS(lev,cur) \ | 183 | #define XFS_BMAP_BLOCK_DMAXRECS(lev,cur) \ |
| 192 | (((lev) == (cur)->bc_nlevels - 1 ? \ | 184 | (((lev) == (cur)->bc_nlevels - 1 ? \ |
| 193 | XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur), \ | 185 | XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur), \ |
| @@ -210,37 +202,21 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t; | |||
| 210 | xfs_bmbt, (lev) == 0) : \ | 202 | xfs_bmbt, (lev) == 0) : \ |
| 211 | ((cur)->bc_mp->m_bmap_dmnr[(lev) != 0]))) | 203 | ((cur)->bc_mp->m_bmap_dmnr[(lev) != 0]))) |
| 212 | 204 | ||
| 213 | #define XFS_BMAP_REC_DADDR(bb,i,cur) \ | 205 | #define XFS_BMAP_REC_DADDR(bb,i,cur) (XFS_BTREE_REC_ADDR(xfs_bmbt, bb, i)) |
| 214 | (XFS_BTREE_REC_ADDR(XFS_BMAP_BLOCK_DSIZE( \ | 206 | |
| 215 | be16_to_cpu((bb)->bb_level), cur), \ | 207 | #define XFS_BMAP_REC_IADDR(bb,i,cur) (XFS_BTREE_REC_ADDR(xfs_bmbt, bb, i)) |
| 216 | xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS( \ | ||
| 217 | be16_to_cpu((bb)->bb_level), cur))) | ||
| 218 | #define XFS_BMAP_REC_IADDR(bb,i,cur) \ | ||
| 219 | (XFS_BTREE_REC_ADDR(XFS_BMAP_BLOCK_ISIZE( \ | ||
| 220 | be16_to_cpu((bb)->bb_level), cur), \ | ||
| 221 | xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS( \ | ||
| 222 | be16_to_cpu((bb)->bb_level), cur))) | ||
| 223 | 208 | ||
| 224 | #define XFS_BMAP_KEY_DADDR(bb,i,cur) \ | 209 | #define XFS_BMAP_KEY_DADDR(bb,i,cur) \ |
| 225 | (XFS_BTREE_KEY_ADDR(XFS_BMAP_BLOCK_DSIZE( \ | 210 | (XFS_BTREE_KEY_ADDR(xfs_bmbt, bb, i)) |
| 226 | be16_to_cpu((bb)->bb_level), cur), \ | 211 | |
| 227 | xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS( \ | ||
| 228 | be16_to_cpu((bb)->bb_level), cur))) | ||
| 229 | #define XFS_BMAP_KEY_IADDR(bb,i,cur) \ | 212 | #define XFS_BMAP_KEY_IADDR(bb,i,cur) \ |
| 230 | (XFS_BTREE_KEY_ADDR(XFS_BMAP_BLOCK_ISIZE( \ | 213 | (XFS_BTREE_KEY_ADDR(xfs_bmbt, bb, i)) |
| 231 | be16_to_cpu((bb)->bb_level), cur), \ | ||
| 232 | xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS( \ | ||
| 233 | be16_to_cpu((bb)->bb_level), cur))) | ||
| 234 | 214 | ||
| 235 | #define XFS_BMAP_PTR_DADDR(bb,i,cur) \ | 215 | #define XFS_BMAP_PTR_DADDR(bb,i,cur) \ |
| 236 | (XFS_BTREE_PTR_ADDR(XFS_BMAP_BLOCK_DSIZE( \ | 216 | (XFS_BTREE_PTR_ADDR(xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS( \ |
| 237 | be16_to_cpu((bb)->bb_level), cur), \ | ||
| 238 | xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS( \ | ||
| 239 | be16_to_cpu((bb)->bb_level), cur))) | 217 | be16_to_cpu((bb)->bb_level), cur))) |
| 240 | #define XFS_BMAP_PTR_IADDR(bb,i,cur) \ | 218 | #define XFS_BMAP_PTR_IADDR(bb,i,cur) \ |
| 241 | (XFS_BTREE_PTR_ADDR(XFS_BMAP_BLOCK_ISIZE( \ | 219 | (XFS_BTREE_PTR_ADDR(xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS( \ |
| 242 | be16_to_cpu((bb)->bb_level), cur), \ | ||
| 243 | xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS( \ | ||
| 244 | be16_to_cpu((bb)->bb_level), cur))) | 220 | be16_to_cpu((bb)->bb_level), cur))) |
| 245 | 221 | ||
| 246 | /* | 222 | /* |
| @@ -248,11 +224,11 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t; | |||
| 248 | * we don't have a cursor. | 224 | * we don't have a cursor. |
| 249 | */ | 225 | */ |
| 250 | #define XFS_BMAP_BROOT_REC_ADDR(bb,i,sz) \ | 226 | #define XFS_BMAP_BROOT_REC_ADDR(bb,i,sz) \ |
| 251 | (XFS_BTREE_REC_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz))) | 227 | (XFS_BTREE_REC_ADDR(xfs_bmbt,bb,i)) |
| 252 | #define XFS_BMAP_BROOT_KEY_ADDR(bb,i,sz) \ | 228 | #define XFS_BMAP_BROOT_KEY_ADDR(bb,i,sz) \ |
| 253 | (XFS_BTREE_KEY_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz))) | 229 | (XFS_BTREE_KEY_ADDR(xfs_bmbt,bb,i)) |
| 254 | #define XFS_BMAP_BROOT_PTR_ADDR(bb,i,sz) \ | 230 | #define XFS_BMAP_BROOT_PTR_ADDR(bb,i,sz) \ |
| 255 | (XFS_BTREE_PTR_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz))) | 231 | (XFS_BTREE_PTR_ADDR(xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz))) |
| 256 | 232 | ||
| 257 | #define XFS_BMAP_BROOT_NUMRECS(bb) be16_to_cpu((bb)->bb_numrecs) | 233 | #define XFS_BMAP_BROOT_NUMRECS(bb) be16_to_cpu((bb)->bb_numrecs) |
| 258 | #define XFS_BMAP_BROOT_MAXRECS(sz) XFS_BTREE_BLOCK_MAXRECS(sz,xfs_bmbt,0) | 234 | #define XFS_BMAP_BROOT_MAXRECS(sz) XFS_BTREE_BLOCK_MAXRECS(sz,xfs_bmbt,0) |
| @@ -315,15 +291,11 @@ extern xfs_exntst_t xfs_bmbt_get_state(xfs_bmbt_rec_t *r); | |||
| 315 | 291 | ||
| 316 | #ifndef XFS_NATIVE_HOST | 292 | #ifndef XFS_NATIVE_HOST |
| 317 | extern void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); | 293 | extern void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s); |
| 318 | extern xfs_exntst_t xfs_bmbt_disk_get_state(xfs_bmbt_rec_t *r); | ||
| 319 | extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r); | 294 | extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r); |
| 320 | extern xfs_fsblock_t xfs_bmbt_disk_get_startblock(xfs_bmbt_rec_t *r); | ||
| 321 | extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r); | 295 | extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r); |
| 322 | #else | 296 | #else |
| 323 | #define xfs_bmbt_disk_get_all(r, s) xfs_bmbt_get_all(r, s) | 297 | #define xfs_bmbt_disk_get_all(r, s) xfs_bmbt_get_all(r, s) |
| 324 | #define xfs_bmbt_disk_get_state(r) xfs_bmbt_get_state(r) | ||
| 325 | #define xfs_bmbt_disk_get_blockcount(r) xfs_bmbt_get_blockcount(r) | 298 | #define xfs_bmbt_disk_get_blockcount(r) xfs_bmbt_get_blockcount(r) |
| 326 | #define xfs_bmbt_disk_get_startblock(r) xfs_bmbt_get_blockcount(r) | ||
| 327 | #define xfs_bmbt_disk_get_startoff(r) xfs_bmbt_get_startoff(r) | 299 | #define xfs_bmbt_disk_get_startoff(r) xfs_bmbt_get_startoff(r) |
| 328 | #endif /* XFS_NATIVE_HOST */ | 300 | #endif /* XFS_NATIVE_HOST */ |
| 329 | 301 | ||
| @@ -364,15 +336,6 @@ extern void xfs_bmbt_to_bmdr(xfs_bmbt_block_t *, int, xfs_bmdr_block_t *, int); | |||
| 364 | extern int xfs_bmbt_update(struct xfs_btree_cur *, xfs_fileoff_t, | 336 | extern int xfs_bmbt_update(struct xfs_btree_cur *, xfs_fileoff_t, |
| 365 | xfs_fsblock_t, xfs_filblks_t, xfs_exntst_t); | 337 | xfs_fsblock_t, xfs_filblks_t, xfs_exntst_t); |
| 366 | 338 | ||
| 367 | #ifdef DEBUG | ||
| 368 | /* | ||
| 369 | * Get the data from the pointed-to record. | ||
| 370 | */ | ||
| 371 | extern int xfs_bmbt_get_rec(struct xfs_btree_cur *, xfs_fileoff_t *, | ||
| 372 | xfs_fsblock_t *, xfs_filblks_t *, | ||
| 373 | xfs_exntst_t *, int *); | ||
| 374 | #endif | ||
| 375 | |||
| 376 | #endif /* __KERNEL__ */ | 339 | #endif /* __KERNEL__ */ |
| 377 | 340 | ||
| 378 | #endif /* __XFS_BMAP_BTREE_H__ */ | 341 | #endif /* __XFS_BMAP_BTREE_H__ */ |
diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index 892b06c54263..4e27d55a1e73 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h | |||
| @@ -122,13 +122,13 @@ extern const __uint32_t xfs_magics[]; | |||
| 122 | * Given block size, type prefix, block pointer, and index of requested entry | 122 | * Given block size, type prefix, block pointer, and index of requested entry |
| 123 | * (first entry numbered 1). | 123 | * (first entry numbered 1). |
| 124 | */ | 124 | */ |
| 125 | #define XFS_BTREE_REC_ADDR(bsz,t,bb,i,mxr) \ | 125 | #define XFS_BTREE_REC_ADDR(t,bb,i) \ |
| 126 | ((t ## _rec_t *)((char *)(bb) + sizeof(t ## _block_t) + \ | 126 | ((t ## _rec_t *)((char *)(bb) + sizeof(t ## _block_t) + \ |
| 127 | ((i) - 1) * sizeof(t ## _rec_t))) | 127 | ((i) - 1) * sizeof(t ## _rec_t))) |
| 128 | #define XFS_BTREE_KEY_ADDR(bsz,t,bb,i,mxr) \ | 128 | #define XFS_BTREE_KEY_ADDR(t,bb,i) \ |
| 129 | ((t ## _key_t *)((char *)(bb) + sizeof(t ## _block_t) + \ | 129 | ((t ## _key_t *)((char *)(bb) + sizeof(t ## _block_t) + \ |
| 130 | ((i) - 1) * sizeof(t ## _key_t))) | 130 | ((i) - 1) * sizeof(t ## _key_t))) |
| 131 | #define XFS_BTREE_PTR_ADDR(bsz,t,bb,i,mxr) \ | 131 | #define XFS_BTREE_PTR_ADDR(t,bb,i,mxr) \ |
| 132 | ((t ## _ptr_t *)((char *)(bb) + sizeof(t ## _block_t) + \ | 132 | ((t ## _ptr_t *)((char *)(bb) + sizeof(t ## _block_t) + \ |
| 133 | (mxr) * sizeof(t ## _key_t) + ((i) - 1) * sizeof(t ## _ptr_t))) | 133 | (mxr) * sizeof(t ## _key_t) + ((i) - 1) * sizeof(t ## _ptr_t))) |
| 134 | 134 | ||
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index 7a55c248ea70..6c1bddc04e31 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
| @@ -660,7 +660,7 @@ xfs_buf_item_committing(xfs_buf_log_item_t *bip, xfs_lsn_t commit_lsn) | |||
| 660 | /* | 660 | /* |
| 661 | * This is the ops vector shared by all buf log items. | 661 | * This is the ops vector shared by all buf log items. |
| 662 | */ | 662 | */ |
| 663 | STATIC struct xfs_item_ops xfs_buf_item_ops = { | 663 | static struct xfs_item_ops xfs_buf_item_ops = { |
| 664 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_buf_item_size, | 664 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_buf_item_size, |
| 665 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 665 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
| 666 | xfs_buf_item_format, | 666 | xfs_buf_item_format, |
diff --git a/fs/xfs/xfs_buf_item.h b/fs/xfs/xfs_buf_item.h index 07c708c2b529..d7e136143066 100644 --- a/fs/xfs/xfs_buf_item.h +++ b/fs/xfs/xfs_buf_item.h | |||
| @@ -21,23 +21,7 @@ | |||
| 21 | /* | 21 | /* |
| 22 | * This is the structure used to lay out a buf log item in the | 22 | * This is the structure used to lay out a buf log item in the |
| 23 | * log. The data map describes which 128 byte chunks of the buffer | 23 | * log. The data map describes which 128 byte chunks of the buffer |
| 24 | * have been logged. This structure works only on buffers that | 24 | * have been logged. |
| 25 | * reside up to the first TB in the filesystem. These buffers are | ||
| 26 | * generated only by pre-6.2 systems and are known as XFS_LI_6_1_BUF. | ||
| 27 | */ | ||
| 28 | typedef struct xfs_buf_log_format_v1 { | ||
| 29 | unsigned short blf_type; /* buf log item type indicator */ | ||
| 30 | unsigned short blf_size; /* size of this item */ | ||
| 31 | __int32_t blf_blkno; /* starting blkno of this buf */ | ||
| 32 | ushort blf_flags; /* misc state */ | ||
| 33 | ushort blf_len; /* number of blocks in this buf */ | ||
| 34 | unsigned int blf_map_size; /* size of data bitmap in words */ | ||
| 35 | unsigned int blf_data_map[1];/* variable size bitmap of */ | ||
| 36 | /* regions of buffer in this item */ | ||
| 37 | } xfs_buf_log_format_v1_t; | ||
| 38 | |||
| 39 | /* | ||
| 40 | * This is a form of the above structure with a 64 bit blkno field. | ||
| 41 | * For 6.2 and beyond, this is XFS_LI_BUF. We use this to log everything. | 25 | * For 6.2 and beyond, this is XFS_LI_BUF. We use this to log everything. |
| 42 | */ | 26 | */ |
| 43 | typedef struct xfs_buf_log_format_t { | 27 | typedef struct xfs_buf_log_format_t { |
diff --git a/fs/xfs/xfs_cap.h b/fs/xfs/xfs_cap.h deleted file mode 100644 index 7a0e482dd436..000000000000 --- a/fs/xfs/xfs_cap.h +++ /dev/null | |||
| @@ -1,70 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. | ||
| 3 | * All Rights Reserved. | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or | ||
| 6 | * modify it under the terms of the GNU General Public License as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it would be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write the Free Software Foundation, | ||
| 16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | */ | ||
| 18 | #ifndef __XFS_CAP_H__ | ||
| 19 | #define __XFS_CAP_H__ | ||
| 20 | |||
| 21 | /* | ||
| 22 | * Capabilities | ||
| 23 | */ | ||
| 24 | typedef __uint64_t xfs_cap_value_t; | ||
| 25 | |||
| 26 | typedef struct xfs_cap_set { | ||
| 27 | xfs_cap_value_t cap_effective; /* use in capability checks */ | ||
| 28 | xfs_cap_value_t cap_permitted; /* combined with file attrs */ | ||
| 29 | xfs_cap_value_t cap_inheritable;/* pass through exec */ | ||
| 30 | } xfs_cap_set_t; | ||
| 31 | |||
| 32 | /* On-disk XFS extended attribute names */ | ||
| 33 | #define SGI_CAP_FILE "SGI_CAP_FILE" | ||
| 34 | #define SGI_CAP_FILE_SIZE (sizeof(SGI_CAP_FILE)-1) | ||
| 35 | #define SGI_CAP_LINUX "SGI_CAP_LINUX" | ||
| 36 | #define SGI_CAP_LINUX_SIZE (sizeof(SGI_CAP_LINUX)-1) | ||
| 37 | |||
| 38 | /* | ||
| 39 | * For Linux, we take the bitfields directly from capability.h | ||
| 40 | * and no longer attempt to keep this attribute ondisk compatible | ||
| 41 | * with IRIX. Since this attribute is only set on executables, | ||
| 42 | * it just doesn't make much sense to try. We do use a different | ||
| 43 | * named attribute though, to avoid confusion. | ||
| 44 | */ | ||
| 45 | |||
| 46 | #ifdef __KERNEL__ | ||
| 47 | |||
| 48 | #ifdef CONFIG_FS_POSIX_CAP | ||
| 49 | |||
| 50 | #include <linux/posix_cap_xattr.h> | ||
| 51 | |||
| 52 | struct bhv_vnode; | ||
| 53 | |||
| 54 | extern int xfs_cap_vhascap(struct bhv_vnode *); | ||
| 55 | extern int xfs_cap_vset(struct bhv_vnode *, void *, size_t); | ||
| 56 | extern int xfs_cap_vget(struct bhv_vnode *, void *, size_t); | ||
| 57 | extern int xfs_cap_vremove(struct bhv_vnode *); | ||
| 58 | |||
| 59 | #define _CAP_EXISTS xfs_cap_vhascap | ||
| 60 | |||
| 61 | #else | ||
| 62 | #define xfs_cap_vset(v,p,sz) (-EOPNOTSUPP) | ||
| 63 | #define xfs_cap_vget(v,p,sz) (-EOPNOTSUPP) | ||
| 64 | #define xfs_cap_vremove(v) (-EOPNOTSUPP) | ||
| 65 | #define _CAP_EXISTS (NULL) | ||
| 66 | #endif | ||
| 67 | |||
| 68 | #endif /* __KERNEL__ */ | ||
| 69 | |||
| 70 | #endif /* __XFS_CAP_H__ */ | ||
diff --git a/fs/xfs/xfs_da_btree.c b/fs/xfs/xfs_da_btree.c index a68bc1f1a313..aea37df4aa62 100644 --- a/fs/xfs/xfs_da_btree.c +++ b/fs/xfs/xfs_da_btree.c | |||
| @@ -1090,8 +1090,7 @@ xfs_da_node_lookup_int(xfs_da_state_t *state, int *result) | |||
| 1090 | if (blk->magic == XFS_DA_NODE_MAGIC) { | 1090 | if (blk->magic == XFS_DA_NODE_MAGIC) { |
| 1091 | node = blk->bp->data; | 1091 | node = blk->bp->data; |
| 1092 | max = be16_to_cpu(node->hdr.count); | 1092 | max = be16_to_cpu(node->hdr.count); |
| 1093 | btreehashval = node->btree[max-1].hashval; | 1093 | blk->hashval = be32_to_cpu(node->btree[max-1].hashval); |
| 1094 | blk->hashval = be32_to_cpu(btreehashval); | ||
| 1095 | 1094 | ||
| 1096 | /* | 1095 | /* |
| 1097 | * Binary search. (note: small blocks will skip loop) | 1096 | * Binary search. (note: small blocks will skip loop) |
| @@ -2166,21 +2165,6 @@ xfs_da_reada_buf( | |||
| 2166 | return rval; | 2165 | return rval; |
| 2167 | } | 2166 | } |
| 2168 | 2167 | ||
| 2169 | /* | ||
| 2170 | * Calculate the number of bits needed to hold i different values. | ||
| 2171 | */ | ||
| 2172 | uint | ||
| 2173 | xfs_da_log2_roundup(uint i) | ||
| 2174 | { | ||
| 2175 | uint rval; | ||
| 2176 | |||
| 2177 | for (rval = 0; rval < NBBY * sizeof(i); rval++) { | ||
| 2178 | if ((1 << rval) >= i) | ||
| 2179 | break; | ||
| 2180 | } | ||
| 2181 | return(rval); | ||
| 2182 | } | ||
| 2183 | |||
| 2184 | kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ | 2168 | kmem_zone_t *xfs_da_state_zone; /* anchor for state struct zone */ |
| 2185 | kmem_zone_t *xfs_dabuf_zone; /* dabuf zone */ | 2169 | kmem_zone_t *xfs_dabuf_zone; /* dabuf zone */ |
| 2186 | 2170 | ||
diff --git a/fs/xfs/xfs_da_btree.h b/fs/xfs/xfs_da_btree.h index 4ab865ec8b82..44dabf02f2a3 100644 --- a/fs/xfs/xfs_da_btree.h +++ b/fs/xfs/xfs_da_btree.h | |||
| @@ -249,7 +249,6 @@ int xfs_da_shrink_inode(xfs_da_args_t *args, xfs_dablk_t dead_blkno, | |||
| 249 | xfs_dabuf_t *dead_buf); | 249 | xfs_dabuf_t *dead_buf); |
| 250 | 250 | ||
| 251 | uint xfs_da_hashname(const uchar_t *name_string, int name_length); | 251 | uint xfs_da_hashname(const uchar_t *name_string, int name_length); |
| 252 | uint xfs_da_log2_roundup(uint i); | ||
| 253 | xfs_da_state_t *xfs_da_state_alloc(void); | 252 | xfs_da_state_t *xfs_da_state_alloc(void); |
| 254 | void xfs_da_state_free(xfs_da_state_t *state); | 253 | void xfs_da_state_free(xfs_da_state_t *state); |
| 255 | 254 | ||
diff --git a/fs/xfs/xfs_dfrag.c b/fs/xfs/xfs_dfrag.c index 50d0faea371d..b847e6a7a3f0 100644 --- a/fs/xfs/xfs_dfrag.c +++ b/fs/xfs/xfs_dfrag.c | |||
| @@ -41,7 +41,6 @@ | |||
| 41 | #include "xfs_itable.h" | 41 | #include "xfs_itable.h" |
| 42 | #include "xfs_dfrag.h" | 42 | #include "xfs_dfrag.h" |
| 43 | #include "xfs_error.h" | 43 | #include "xfs_error.h" |
| 44 | #include "xfs_mac.h" | ||
| 45 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 46 | 45 | ||
| 47 | /* | 46 | /* |
diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c index b95681b03d81..b1af54464f00 100644 --- a/fs/xfs/xfs_error.c +++ b/fs/xfs/xfs_error.c | |||
| @@ -132,32 +132,6 @@ xfs_errortag_add(int error_tag, xfs_mount_t *mp) | |||
| 132 | } | 132 | } |
| 133 | 133 | ||
| 134 | int | 134 | int |
| 135 | xfs_errortag_clear(int error_tag, xfs_mount_t *mp) | ||
| 136 | { | ||
| 137 | int i; | ||
| 138 | int64_t fsid; | ||
| 139 | |||
| 140 | memcpy(&fsid, mp->m_fixedfsid, sizeof(xfs_fsid_t)); | ||
| 141 | |||
| 142 | for (i = 0; i < XFS_NUM_INJECT_ERROR; i++) { | ||
| 143 | if (xfs_etest_fsid[i] == fsid && xfs_etest[i] == error_tag) { | ||
| 144 | xfs_etest[i] = 0; | ||
| 145 | xfs_etest_fsid[i] = 0LL; | ||
| 146 | kmem_free(xfs_etest_fsname[i], | ||
| 147 | strlen(xfs_etest_fsname[i]) + 1); | ||
| 148 | xfs_etest_fsname[i] = NULL; | ||
| 149 | cmn_err(CE_WARN, "Cleared XFS error tag #%d", | ||
| 150 | error_tag); | ||
| 151 | return 0; | ||
| 152 | } | ||
| 153 | } | ||
| 154 | |||
| 155 | cmn_err(CE_WARN, "XFS error tag %d not on", error_tag); | ||
| 156 | |||
| 157 | return 1; | ||
| 158 | } | ||
| 159 | |||
| 160 | int | ||
| 161 | xfs_errortag_clearall_umount(int64_t fsid, char *fsname, int loud) | 135 | xfs_errortag_clearall_umount(int64_t fsid, char *fsname, int loud) |
| 162 | { | 136 | { |
| 163 | int i; | 137 | int i; |
diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h index 0893e16b7d83..5599ada456a1 100644 --- a/fs/xfs/xfs_error.h +++ b/fs/xfs/xfs_error.h | |||
| @@ -144,7 +144,6 @@ extern void xfs_error_test_init(void); | |||
| 144 | #endif /* __ANSI_CPP__ */ | 144 | #endif /* __ANSI_CPP__ */ |
| 145 | 145 | ||
| 146 | extern int xfs_errortag_add(int error_tag, xfs_mount_t *mp); | 146 | extern int xfs_errortag_add(int error_tag, xfs_mount_t *mp); |
| 147 | extern int xfs_errortag_clear(int error_tag, xfs_mount_t *mp); | ||
| 148 | extern int xfs_errortag_clearall(xfs_mount_t *mp); | 147 | extern int xfs_errortag_clearall(xfs_mount_t *mp); |
| 149 | extern int xfs_errortag_clearall_umount(int64_t fsid, char *fsname, int loud); | 148 | extern int xfs_errortag_clearall_umount(int64_t fsid, char *fsname, int loud); |
| 150 | #else | 149 | #else |
| @@ -180,6 +179,6 @@ extern void xfs_fs_cmn_err(int level, struct xfs_mount *mp, char *fmt, ...); | |||
| 180 | xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## args) | 179 | xfs_fs_cmn_err(level, mp, fmt " Unmount and run xfs_repair.", ## args) |
| 181 | 180 | ||
| 182 | #define xfs_fs_mount_cmn_err(f, fmt, args...) \ | 181 | #define xfs_fs_mount_cmn_err(f, fmt, args...) \ |
| 183 | ((f & XFS_MFSI_QUIET)? cmn_err(CE_WARN, "XFS: " fmt, ## args) : (void)0) | 182 | ((f & XFS_MFSI_QUIET)? (void)0 : cmn_err(CE_WARN, "XFS: " fmt, ## args)) |
| 184 | 183 | ||
| 185 | #endif /* __XFS_ERROR_H__ */ | 184 | #endif /* __XFS_ERROR_H__ */ |
diff --git a/fs/xfs/xfs_extfree_item.c b/fs/xfs/xfs_extfree_item.c index 6dba78199faf..3b14427ee123 100644 --- a/fs/xfs/xfs_extfree_item.c +++ b/fs/xfs/xfs_extfree_item.c | |||
| @@ -227,7 +227,7 @@ xfs_efi_item_committing(xfs_efi_log_item_t *efip, xfs_lsn_t lsn) | |||
| 227 | /* | 227 | /* |
| 228 | * This is the ops vector shared by all efi log items. | 228 | * This is the ops vector shared by all efi log items. |
| 229 | */ | 229 | */ |
| 230 | STATIC struct xfs_item_ops xfs_efi_item_ops = { | 230 | static struct xfs_item_ops xfs_efi_item_ops = { |
| 231 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_efi_item_size, | 231 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_efi_item_size, |
| 232 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 232 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
| 233 | xfs_efi_item_format, | 233 | xfs_efi_item_format, |
| @@ -525,7 +525,7 @@ xfs_efd_item_committing(xfs_efd_log_item_t *efip, xfs_lsn_t lsn) | |||
| 525 | /* | 525 | /* |
| 526 | * This is the ops vector shared by all efd log items. | 526 | * This is the ops vector shared by all efd log items. |
| 527 | */ | 527 | */ |
| 528 | STATIC struct xfs_item_ops xfs_efd_item_ops = { | 528 | static struct xfs_item_ops xfs_efd_item_ops = { |
| 529 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_efd_item_size, | 529 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_efd_item_size, |
| 530 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 530 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
| 531 | xfs_efd_item_format, | 531 | xfs_efd_item_format, |
diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index c064e72ada9e..32c37c1c47ab 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c | |||
| @@ -250,8 +250,7 @@ xfs_growfs_data_private( | |||
| 250 | block->bb_numrecs = cpu_to_be16(1); | 250 | block->bb_numrecs = cpu_to_be16(1); |
| 251 | block->bb_leftsib = cpu_to_be32(NULLAGBLOCK); | 251 | block->bb_leftsib = cpu_to_be32(NULLAGBLOCK); |
| 252 | block->bb_rightsib = cpu_to_be32(NULLAGBLOCK); | 252 | block->bb_rightsib = cpu_to_be32(NULLAGBLOCK); |
| 253 | arec = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_alloc, | 253 | arec = XFS_BTREE_REC_ADDR(xfs_alloc, block, 1); |
| 254 | block, 1, mp->m_alloc_mxr[0]); | ||
| 255 | arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); | 254 | arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); |
| 256 | arec->ar_blockcount = cpu_to_be32( | 255 | arec->ar_blockcount = cpu_to_be32( |
| 257 | agsize - be32_to_cpu(arec->ar_startblock)); | 256 | agsize - be32_to_cpu(arec->ar_startblock)); |
| @@ -272,8 +271,7 @@ xfs_growfs_data_private( | |||
| 272 | block->bb_numrecs = cpu_to_be16(1); | 271 | block->bb_numrecs = cpu_to_be16(1); |
| 273 | block->bb_leftsib = cpu_to_be32(NULLAGBLOCK); | 272 | block->bb_leftsib = cpu_to_be32(NULLAGBLOCK); |
| 274 | block->bb_rightsib = cpu_to_be32(NULLAGBLOCK); | 273 | block->bb_rightsib = cpu_to_be32(NULLAGBLOCK); |
| 275 | arec = XFS_BTREE_REC_ADDR(mp->m_sb.sb_blocksize, xfs_alloc, | 274 | arec = XFS_BTREE_REC_ADDR(xfs_alloc, block, 1); |
| 276 | block, 1, mp->m_alloc_mxr[0]); | ||
| 277 | arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); | 275 | arec->ar_startblock = cpu_to_be32(XFS_PREALLOC_BLOCKS(mp)); |
| 278 | arec->ar_blockcount = cpu_to_be32( | 276 | arec->ar_blockcount = cpu_to_be32( |
| 279 | agsize - be32_to_cpu(arec->ar_startblock)); | 277 | agsize - be32_to_cpu(arec->ar_startblock)); |
| @@ -460,7 +458,7 @@ xfs_fs_counts( | |||
| 460 | { | 458 | { |
| 461 | unsigned long s; | 459 | unsigned long s; |
| 462 | 460 | ||
| 463 | xfs_icsb_sync_counters_lazy(mp); | 461 | xfs_icsb_sync_counters_flags(mp, XFS_ICSB_LAZY_COUNT); |
| 464 | s = XFS_SB_LOCK(mp); | 462 | s = XFS_SB_LOCK(mp); |
| 465 | cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); | 463 | cnt->freedata = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); |
| 466 | cnt->freertx = mp->m_sb.sb_frextents; | 464 | cnt->freertx = mp->m_sb.sb_frextents; |
| @@ -491,7 +489,7 @@ xfs_reserve_blocks( | |||
| 491 | __uint64_t *inval, | 489 | __uint64_t *inval, |
| 492 | xfs_fsop_resblks_t *outval) | 490 | xfs_fsop_resblks_t *outval) |
| 493 | { | 491 | { |
| 494 | __int64_t lcounter, delta; | 492 | __int64_t lcounter, delta, fdblks_delta; |
| 495 | __uint64_t request; | 493 | __uint64_t request; |
| 496 | unsigned long s; | 494 | unsigned long s; |
| 497 | 495 | ||
| @@ -504,17 +502,35 @@ xfs_reserve_blocks( | |||
| 504 | } | 502 | } |
| 505 | 503 | ||
| 506 | request = *inval; | 504 | request = *inval; |
| 505 | |||
| 506 | /* | ||
| 507 | * With per-cpu counters, this becomes an interesting | ||
| 508 | * problem. we needto work out if we are freeing or allocation | ||
| 509 | * blocks first, then we can do the modification as necessary. | ||
| 510 | * | ||
| 511 | * We do this under the XFS_SB_LOCK so that if we are near | ||
| 512 | * ENOSPC, we will hold out any changes while we work out | ||
| 513 | * what to do. This means that the amount of free space can | ||
| 514 | * change while we do this, so we need to retry if we end up | ||
| 515 | * trying to reserve more space than is available. | ||
| 516 | * | ||
| 517 | * We also use the xfs_mod_incore_sb() interface so that we | ||
| 518 | * don't have to care about whether per cpu counter are | ||
| 519 | * enabled, disabled or even compiled in.... | ||
| 520 | */ | ||
| 521 | retry: | ||
| 507 | s = XFS_SB_LOCK(mp); | 522 | s = XFS_SB_LOCK(mp); |
| 523 | xfs_icsb_sync_counters_flags(mp, XFS_ICSB_SB_LOCKED); | ||
| 508 | 524 | ||
| 509 | /* | 525 | /* |
| 510 | * If our previous reservation was larger than the current value, | 526 | * If our previous reservation was larger than the current value, |
| 511 | * then move any unused blocks back to the free pool. | 527 | * then move any unused blocks back to the free pool. |
| 512 | */ | 528 | */ |
| 513 | 529 | fdblks_delta = 0; | |
| 514 | if (mp->m_resblks > request) { | 530 | if (mp->m_resblks > request) { |
| 515 | lcounter = mp->m_resblks_avail - request; | 531 | lcounter = mp->m_resblks_avail - request; |
| 516 | if (lcounter > 0) { /* release unused blocks */ | 532 | if (lcounter > 0) { /* release unused blocks */ |
| 517 | mp->m_sb.sb_fdblocks += lcounter; | 533 | fdblks_delta = lcounter; |
| 518 | mp->m_resblks_avail -= lcounter; | 534 | mp->m_resblks_avail -= lcounter; |
| 519 | } | 535 | } |
| 520 | mp->m_resblks = request; | 536 | mp->m_resblks = request; |
| @@ -522,24 +538,50 @@ xfs_reserve_blocks( | |||
| 522 | __int64_t free; | 538 | __int64_t free; |
| 523 | 539 | ||
| 524 | free = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); | 540 | free = mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); |
| 541 | if (!free) | ||
| 542 | goto out; /* ENOSPC and fdblks_delta = 0 */ | ||
| 543 | |||
| 525 | delta = request - mp->m_resblks; | 544 | delta = request - mp->m_resblks; |
| 526 | lcounter = free - delta; | 545 | lcounter = free - delta; |
| 527 | if (lcounter < 0) { | 546 | if (lcounter < 0) { |
| 528 | /* We can't satisfy the request, just get what we can */ | 547 | /* We can't satisfy the request, just get what we can */ |
| 529 | mp->m_resblks += free; | 548 | mp->m_resblks += free; |
| 530 | mp->m_resblks_avail += free; | 549 | mp->m_resblks_avail += free; |
| 550 | fdblks_delta = -free; | ||
| 531 | mp->m_sb.sb_fdblocks = XFS_ALLOC_SET_ASIDE(mp); | 551 | mp->m_sb.sb_fdblocks = XFS_ALLOC_SET_ASIDE(mp); |
| 532 | } else { | 552 | } else { |
| 553 | fdblks_delta = -delta; | ||
| 533 | mp->m_sb.sb_fdblocks = | 554 | mp->m_sb.sb_fdblocks = |
| 534 | lcounter + XFS_ALLOC_SET_ASIDE(mp); | 555 | lcounter + XFS_ALLOC_SET_ASIDE(mp); |
| 535 | mp->m_resblks = request; | 556 | mp->m_resblks = request; |
| 536 | mp->m_resblks_avail += delta; | 557 | mp->m_resblks_avail += delta; |
| 537 | } | 558 | } |
| 538 | } | 559 | } |
| 539 | 560 | out: | |
| 540 | outval->resblks = mp->m_resblks; | 561 | outval->resblks = mp->m_resblks; |
| 541 | outval->resblks_avail = mp->m_resblks_avail; | 562 | outval->resblks_avail = mp->m_resblks_avail; |
| 542 | XFS_SB_UNLOCK(mp, s); | 563 | XFS_SB_UNLOCK(mp, s); |
| 564 | |||
| 565 | if (fdblks_delta) { | ||
| 566 | /* | ||
| 567 | * If we are putting blocks back here, m_resblks_avail is | ||
| 568 | * already at it's max so this will put it in the free pool. | ||
| 569 | * | ||
| 570 | * If we need space, we'll either succeed in getting it | ||
| 571 | * from the free block count or we'll get an enospc. If | ||
| 572 | * we get a ENOSPC, it means things changed while we were | ||
| 573 | * calculating fdblks_delta and so we should try again to | ||
| 574 | * see if there is anything left to reserve. | ||
| 575 | * | ||
| 576 | * Don't set the reserved flag here - we don't want to reserve | ||
| 577 | * the extra reserve blocks from the reserve..... | ||
| 578 | */ | ||
| 579 | int error; | ||
| 580 | error = xfs_mod_incore_sb(mp, XFS_SBS_FDBLOCKS, fdblks_delta, 0); | ||
| 581 | if (error == ENOSPC) | ||
| 582 | goto retry; | ||
| 583 | } | ||
| 584 | |||
| 543 | return 0; | 585 | return 0; |
| 544 | } | 586 | } |
| 545 | 587 | ||
diff --git a/fs/xfs/xfs_ialloc.c b/fs/xfs/xfs_ialloc.c index a446e5a115c6..b5feb3e77116 100644 --- a/fs/xfs/xfs_ialloc.c +++ b/fs/xfs/xfs_ialloc.c | |||
| @@ -342,7 +342,7 @@ xfs_ialloc_ag_alloc( | |||
| 342 | return 0; | 342 | return 0; |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | STATIC __inline xfs_agnumber_t | 345 | STATIC_INLINE xfs_agnumber_t |
| 346 | xfs_ialloc_next_ag( | 346 | xfs_ialloc_next_ag( |
| 347 | xfs_mount_t *mp) | 347 | xfs_mount_t *mp) |
| 348 | { | 348 | { |
diff --git a/fs/xfs/xfs_ialloc_btree.h b/fs/xfs/xfs_ialloc_btree.h index 2c0e49893ff7..bf8e9aff272e 100644 --- a/fs/xfs/xfs_ialloc_btree.h +++ b/fs/xfs/xfs_ialloc_btree.h | |||
| @@ -89,7 +89,6 @@ typedef struct xfs_btree_sblock xfs_inobt_block_t; | |||
| 89 | /* | 89 | /* |
| 90 | * Real block structures have a size equal to the disk block size. | 90 | * Real block structures have a size equal to the disk block size. |
| 91 | */ | 91 | */ |
| 92 | #define XFS_INOBT_BLOCK_SIZE(lev,cur) (1 << (cur)->bc_blocklog) | ||
| 93 | #define XFS_INOBT_BLOCK_MAXRECS(lev,cur) ((cur)->bc_mp->m_inobt_mxr[lev != 0]) | 92 | #define XFS_INOBT_BLOCK_MAXRECS(lev,cur) ((cur)->bc_mp->m_inobt_mxr[lev != 0]) |
| 94 | #define XFS_INOBT_BLOCK_MINRECS(lev,cur) ((cur)->bc_mp->m_inobt_mnr[lev != 0]) | 93 | #define XFS_INOBT_BLOCK_MINRECS(lev,cur) ((cur)->bc_mp->m_inobt_mnr[lev != 0]) |
| 95 | #define XFS_INOBT_IS_LAST_REC(cur) \ | 94 | #define XFS_INOBT_IS_LAST_REC(cur) \ |
| @@ -110,14 +109,13 @@ typedef struct xfs_btree_sblock xfs_inobt_block_t; | |||
| 110 | * Record, key, and pointer address macros for btree blocks. | 109 | * Record, key, and pointer address macros for btree blocks. |
| 111 | */ | 110 | */ |
| 112 | #define XFS_INOBT_REC_ADDR(bb,i,cur) \ | 111 | #define XFS_INOBT_REC_ADDR(bb,i,cur) \ |
| 113 | (XFS_BTREE_REC_ADDR(XFS_INOBT_BLOCK_SIZE(0,cur), xfs_inobt, bb, \ | 112 | (XFS_BTREE_REC_ADDR(xfs_inobt, bb, i)) |
| 114 | i, XFS_INOBT_BLOCK_MAXRECS(0, cur))) | 113 | |
| 115 | #define XFS_INOBT_KEY_ADDR(bb,i,cur) \ | 114 | #define XFS_INOBT_KEY_ADDR(bb,i,cur) \ |
| 116 | (XFS_BTREE_KEY_ADDR(XFS_INOBT_BLOCK_SIZE(1,cur), xfs_inobt, bb, \ | 115 | (XFS_BTREE_KEY_ADDR(xfs_inobt, bb, i)) |
| 117 | i, XFS_INOBT_BLOCK_MAXRECS(1, cur))) | ||
| 118 | 116 | ||
| 119 | #define XFS_INOBT_PTR_ADDR(bb,i,cur) \ | 117 | #define XFS_INOBT_PTR_ADDR(bb,i,cur) \ |
| 120 | (XFS_BTREE_PTR_ADDR(XFS_INOBT_BLOCK_SIZE(1,cur), xfs_inobt, bb, \ | 118 | (XFS_BTREE_PTR_ADDR(xfs_inobt, bb, \ |
| 121 | i, XFS_INOBT_BLOCK_MAXRECS(1, cur))) | 119 | i, XFS_INOBT_BLOCK_MAXRECS(1, cur))) |
| 122 | 120 | ||
| 123 | /* | 121 | /* |
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c index 44dfac521285..3da9829c19d5 100644 --- a/fs/xfs/xfs_inode.c +++ b/fs/xfs/xfs_inode.c | |||
| @@ -47,7 +47,6 @@ | |||
| 47 | #include "xfs_utils.h" | 47 | #include "xfs_utils.h" |
| 48 | #include "xfs_dir2_trace.h" | 48 | #include "xfs_dir2_trace.h" |
| 49 | #include "xfs_quota.h" | 49 | #include "xfs_quota.h" |
| 50 | #include "xfs_mac.h" | ||
| 51 | #include "xfs_acl.h" | 50 | #include "xfs_acl.h" |
| 52 | 51 | ||
| 53 | 52 | ||
| @@ -1699,8 +1698,7 @@ xfs_itruncate_finish( | |||
| 1699 | * Duplicate the transaction that has the permanent | 1698 | * Duplicate the transaction that has the permanent |
| 1700 | * reservation and commit the old transaction. | 1699 | * reservation and commit the old transaction. |
| 1701 | */ | 1700 | */ |
| 1702 | error = xfs_bmap_finish(tp, &free_list, first_block, | 1701 | error = xfs_bmap_finish(tp, &free_list, &committed); |
| 1703 | &committed); | ||
| 1704 | ntp = *tp; | 1702 | ntp = *tp; |
| 1705 | if (error) { | 1703 | if (error) { |
| 1706 | /* | 1704 | /* |
| @@ -1810,7 +1808,7 @@ xfs_igrow_start( | |||
| 1810 | * and any blocks between the old and new file sizes. | 1808 | * and any blocks between the old and new file sizes. |
| 1811 | */ | 1809 | */ |
| 1812 | error = xfs_zero_eof(XFS_ITOV(ip), &ip->i_iocore, new_size, | 1810 | error = xfs_zero_eof(XFS_ITOV(ip), &ip->i_iocore, new_size, |
| 1813 | ip->i_d.di_size, new_size); | 1811 | ip->i_d.di_size); |
| 1814 | return error; | 1812 | return error; |
| 1815 | } | 1813 | } |
| 1816 | 1814 | ||
| @@ -2125,7 +2123,7 @@ xfs_iunlink_remove( | |||
| 2125 | return 0; | 2123 | return 0; |
| 2126 | } | 2124 | } |
| 2127 | 2125 | ||
| 2128 | static __inline__ int xfs_inode_clean(xfs_inode_t *ip) | 2126 | STATIC_INLINE int xfs_inode_clean(xfs_inode_t *ip) |
| 2129 | { | 2127 | { |
| 2130 | return (((ip->i_itemp == NULL) || | 2128 | return (((ip->i_itemp == NULL) || |
| 2131 | !(ip->i_itemp->ili_format.ilf_fields & XFS_ILOG_ALL)) && | 2129 | !(ip->i_itemp->ili_format.ilf_fields & XFS_ILOG_ALL)) && |
| @@ -2707,10 +2705,24 @@ xfs_idestroy( | |||
| 2707 | ktrace_free(ip->i_dir_trace); | 2705 | ktrace_free(ip->i_dir_trace); |
| 2708 | #endif | 2706 | #endif |
| 2709 | if (ip->i_itemp) { | 2707 | if (ip->i_itemp) { |
| 2710 | /* XXXdpd should be able to assert this but shutdown | 2708 | /* |
| 2711 | * is leaving the AIL behind. */ | 2709 | * Only if we are shutting down the fs will we see an |
| 2712 | ASSERT(((ip->i_itemp->ili_item.li_flags & XFS_LI_IN_AIL) == 0) || | 2710 | * inode still in the AIL. If it is there, we should remove |
| 2713 | XFS_FORCED_SHUTDOWN(ip->i_mount)); | 2711 | * it to prevent a use-after-free from occurring. |
| 2712 | */ | ||
| 2713 | xfs_mount_t *mp = ip->i_mount; | ||
| 2714 | xfs_log_item_t *lip = &ip->i_itemp->ili_item; | ||
| 2715 | int s; | ||
| 2716 | |||
| 2717 | ASSERT(((lip->li_flags & XFS_LI_IN_AIL) == 0) || | ||
| 2718 | XFS_FORCED_SHUTDOWN(ip->i_mount)); | ||
| 2719 | if (lip->li_flags & XFS_LI_IN_AIL) { | ||
| 2720 | AIL_LOCK(mp, s); | ||
| 2721 | if (lip->li_flags & XFS_LI_IN_AIL) | ||
| 2722 | xfs_trans_delete_ail(mp, lip, s); | ||
| 2723 | else | ||
| 2724 | AIL_UNLOCK(mp, s); | ||
| 2725 | } | ||
| 2714 | xfs_inode_item_destroy(ip); | 2726 | xfs_inode_item_destroy(ip); |
| 2715 | } | 2727 | } |
| 2716 | kmem_zone_free(xfs_inode_zone, ip); | 2728 | kmem_zone_free(xfs_inode_zone, ip); |
diff --git a/fs/xfs/xfs_inode_item.c b/fs/xfs/xfs_inode_item.c index a7a92251eb56..565d470a6b4a 100644 --- a/fs/xfs/xfs_inode_item.c +++ b/fs/xfs/xfs_inode_item.c | |||
| @@ -887,7 +887,7 @@ xfs_inode_item_committing( | |||
| 887 | /* | 887 | /* |
| 888 | * This is the ops vector shared by all buf log items. | 888 | * This is the ops vector shared by all buf log items. |
| 889 | */ | 889 | */ |
| 890 | STATIC struct xfs_item_ops xfs_inode_item_ops = { | 890 | static struct xfs_item_ops xfs_inode_item_ops = { |
| 891 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_inode_item_size, | 891 | .iop_size = (uint(*)(xfs_log_item_t*))xfs_inode_item_size, |
| 892 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 892 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
| 893 | xfs_inode_item_format, | 893 | xfs_inode_item_format, |
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 19655124da78..cc6a7b5a9912 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include "xfs_itable.h" | 43 | #include "xfs_itable.h" |
| 44 | #include "xfs_rw.h" | 44 | #include "xfs_rw.h" |
| 45 | #include "xfs_acl.h" | 45 | #include "xfs_acl.h" |
| 46 | #include "xfs_cap.h" | ||
| 47 | #include "xfs_mac.h" | ||
| 48 | #include "xfs_attr.h" | 46 | #include "xfs_attr.h" |
| 49 | #include "xfs_buf_item.h" | 47 | #include "xfs_buf_item.h" |
| 50 | #include "xfs_trans_space.h" | 48 | #include "xfs_trans_space.h" |
| @@ -542,7 +540,7 @@ xfs_iomap_write_direct( | |||
| 542 | /* | 540 | /* |
| 543 | * Complete the transaction | 541 | * Complete the transaction |
| 544 | */ | 542 | */ |
| 545 | error = xfs_bmap_finish(&tp, &free_list, firstfsb, &committed); | 543 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 546 | if (error) | 544 | if (error) |
| 547 | goto error0; | 545 | goto error0; |
| 548 | error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL); | 546 | error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL); |
| @@ -838,8 +836,7 @@ xfs_iomap_write_allocate( | |||
| 838 | if (error) | 836 | if (error) |
| 839 | goto trans_cancel; | 837 | goto trans_cancel; |
| 840 | 838 | ||
| 841 | error = xfs_bmap_finish(&tp, &free_list, | 839 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 842 | first_block, &committed); | ||
| 843 | if (error) | 840 | if (error) |
| 844 | goto trans_cancel; | 841 | goto trans_cancel; |
| 845 | 842 | ||
| @@ -947,8 +944,7 @@ xfs_iomap_write_unwritten( | |||
| 947 | if (error) | 944 | if (error) |
| 948 | goto error_on_bmapi_transaction; | 945 | goto error_on_bmapi_transaction; |
| 949 | 946 | ||
| 950 | error = xfs_bmap_finish(&(tp), &(free_list), | 947 | error = xfs_bmap_finish(&(tp), &(free_list), &committed); |
| 951 | firstfsb, &committed); | ||
| 952 | if (error) | 948 | if (error) |
| 953 | goto error_on_bmapi_transaction; | 949 | goto error_on_bmapi_transaction; |
| 954 | 950 | ||
diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 3cb678e3a132..ca74d3f5910e 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c | |||
| @@ -1514,7 +1514,6 @@ xlog_recover_reorder_trans( | |||
| 1514 | { | 1514 | { |
| 1515 | xlog_recover_item_t *first_item, *itemq, *itemq_next; | 1515 | xlog_recover_item_t *first_item, *itemq, *itemq_next; |
| 1516 | xfs_buf_log_format_t *buf_f; | 1516 | xfs_buf_log_format_t *buf_f; |
| 1517 | xfs_buf_log_format_v1_t *obuf_f; | ||
| 1518 | ushort flags = 0; | 1517 | ushort flags = 0; |
| 1519 | 1518 | ||
| 1520 | first_item = itemq = trans->r_itemq; | 1519 | first_item = itemq = trans->r_itemq; |
| @@ -1522,29 +1521,16 @@ xlog_recover_reorder_trans( | |||
| 1522 | do { | 1521 | do { |
| 1523 | itemq_next = itemq->ri_next; | 1522 | itemq_next = itemq->ri_next; |
| 1524 | buf_f = (xfs_buf_log_format_t *)itemq->ri_buf[0].i_addr; | 1523 | buf_f = (xfs_buf_log_format_t *)itemq->ri_buf[0].i_addr; |
| 1525 | switch (ITEM_TYPE(itemq)) { | ||
| 1526 | case XFS_LI_BUF: | ||
| 1527 | flags = buf_f->blf_flags; | ||
| 1528 | break; | ||
| 1529 | case XFS_LI_6_1_BUF: | ||
| 1530 | case XFS_LI_5_3_BUF: | ||
| 1531 | obuf_f = (xfs_buf_log_format_v1_t*)buf_f; | ||
| 1532 | flags = obuf_f->blf_flags; | ||
| 1533 | break; | ||
| 1534 | } | ||
| 1535 | 1524 | ||
| 1536 | switch (ITEM_TYPE(itemq)) { | 1525 | switch (ITEM_TYPE(itemq)) { |
| 1537 | case XFS_LI_BUF: | 1526 | case XFS_LI_BUF: |
| 1538 | case XFS_LI_6_1_BUF: | 1527 | flags = buf_f->blf_flags; |
| 1539 | case XFS_LI_5_3_BUF: | ||
| 1540 | if (!(flags & XFS_BLI_CANCEL)) { | 1528 | if (!(flags & XFS_BLI_CANCEL)) { |
| 1541 | xlog_recover_insert_item_frontq(&trans->r_itemq, | 1529 | xlog_recover_insert_item_frontq(&trans->r_itemq, |
| 1542 | itemq); | 1530 | itemq); |
| 1543 | break; | 1531 | break; |
| 1544 | } | 1532 | } |
| 1545 | case XFS_LI_INODE: | 1533 | case XFS_LI_INODE: |
| 1546 | case XFS_LI_6_1_INODE: | ||
| 1547 | case XFS_LI_5_3_INODE: | ||
| 1548 | case XFS_LI_DQUOT: | 1534 | case XFS_LI_DQUOT: |
| 1549 | case XFS_LI_QUOTAOFF: | 1535 | case XFS_LI_QUOTAOFF: |
| 1550 | case XFS_LI_EFD: | 1536 | case XFS_LI_EFD: |
| @@ -1583,7 +1569,6 @@ xlog_recover_do_buffer_pass1( | |||
| 1583 | xfs_buf_cancel_t *nextp; | 1569 | xfs_buf_cancel_t *nextp; |
| 1584 | xfs_buf_cancel_t *prevp; | 1570 | xfs_buf_cancel_t *prevp; |
| 1585 | xfs_buf_cancel_t **bucket; | 1571 | xfs_buf_cancel_t **bucket; |
| 1586 | xfs_buf_log_format_v1_t *obuf_f; | ||
| 1587 | xfs_daddr_t blkno = 0; | 1572 | xfs_daddr_t blkno = 0; |
| 1588 | uint len = 0; | 1573 | uint len = 0; |
| 1589 | ushort flags = 0; | 1574 | ushort flags = 0; |
| @@ -1594,13 +1579,6 @@ xlog_recover_do_buffer_pass1( | |||
| 1594 | len = buf_f->blf_len; | 1579 | len = buf_f->blf_len; |
| 1595 | flags = buf_f->blf_flags; | 1580 | flags = buf_f->blf_flags; |
| 1596 | break; | 1581 | break; |
| 1597 | case XFS_LI_6_1_BUF: | ||
| 1598 | case XFS_LI_5_3_BUF: | ||
| 1599 | obuf_f = (xfs_buf_log_format_v1_t*)buf_f; | ||
| 1600 | blkno = (xfs_daddr_t) obuf_f->blf_blkno; | ||
| 1601 | len = obuf_f->blf_len; | ||
| 1602 | flags = obuf_f->blf_flags; | ||
| 1603 | break; | ||
| 1604 | } | 1582 | } |
| 1605 | 1583 | ||
| 1606 | /* | 1584 | /* |
| @@ -1746,7 +1724,6 @@ xlog_recover_do_buffer_pass2( | |||
| 1746 | xlog_t *log, | 1724 | xlog_t *log, |
| 1747 | xfs_buf_log_format_t *buf_f) | 1725 | xfs_buf_log_format_t *buf_f) |
| 1748 | { | 1726 | { |
| 1749 | xfs_buf_log_format_v1_t *obuf_f; | ||
| 1750 | xfs_daddr_t blkno = 0; | 1727 | xfs_daddr_t blkno = 0; |
| 1751 | ushort flags = 0; | 1728 | ushort flags = 0; |
| 1752 | uint len = 0; | 1729 | uint len = 0; |
| @@ -1757,13 +1734,6 @@ xlog_recover_do_buffer_pass2( | |||
| 1757 | flags = buf_f->blf_flags; | 1734 | flags = buf_f->blf_flags; |
| 1758 | len = buf_f->blf_len; | 1735 | len = buf_f->blf_len; |
| 1759 | break; | 1736 | break; |
| 1760 | case XFS_LI_6_1_BUF: | ||
| 1761 | case XFS_LI_5_3_BUF: | ||
| 1762 | obuf_f = (xfs_buf_log_format_v1_t*)buf_f; | ||
| 1763 | blkno = (xfs_daddr_t) obuf_f->blf_blkno; | ||
| 1764 | flags = obuf_f->blf_flags; | ||
| 1765 | len = (xfs_daddr_t) obuf_f->blf_len; | ||
| 1766 | break; | ||
| 1767 | } | 1737 | } |
| 1768 | 1738 | ||
| 1769 | return xlog_check_buffer_cancelled(log, blkno, len, flags); | 1739 | return xlog_check_buffer_cancelled(log, blkno, len, flags); |
| @@ -1799,7 +1769,6 @@ xlog_recover_do_inode_buffer( | |||
| 1799 | int inodes_per_buf; | 1769 | int inodes_per_buf; |
| 1800 | xfs_agino_t *logged_nextp; | 1770 | xfs_agino_t *logged_nextp; |
| 1801 | xfs_agino_t *buffer_nextp; | 1771 | xfs_agino_t *buffer_nextp; |
| 1802 | xfs_buf_log_format_v1_t *obuf_f; | ||
| 1803 | unsigned int *data_map = NULL; | 1772 | unsigned int *data_map = NULL; |
| 1804 | unsigned int map_size = 0; | 1773 | unsigned int map_size = 0; |
| 1805 | 1774 | ||
| @@ -1808,12 +1777,6 @@ xlog_recover_do_inode_buffer( | |||
| 1808 | data_map = buf_f->blf_data_map; | 1777 | data_map = buf_f->blf_data_map; |
| 1809 | map_size = buf_f->blf_map_size; | 1778 | map_size = buf_f->blf_map_size; |
| 1810 | break; | 1779 | break; |
| 1811 | case XFS_LI_6_1_BUF: | ||
| 1812 | case XFS_LI_5_3_BUF: | ||
| 1813 | obuf_f = (xfs_buf_log_format_v1_t*)buf_f; | ||
| 1814 | data_map = obuf_f->blf_data_map; | ||
| 1815 | map_size = obuf_f->blf_map_size; | ||
| 1816 | break; | ||
| 1817 | } | 1780 | } |
| 1818 | /* | 1781 | /* |
| 1819 | * Set the variables corresponding to the current region to | 1782 | * Set the variables corresponding to the current region to |
| @@ -1912,7 +1875,6 @@ xlog_recover_do_reg_buffer( | |||
| 1912 | int i; | 1875 | int i; |
| 1913 | int bit; | 1876 | int bit; |
| 1914 | int nbits; | 1877 | int nbits; |
| 1915 | xfs_buf_log_format_v1_t *obuf_f; | ||
| 1916 | unsigned int *data_map = NULL; | 1878 | unsigned int *data_map = NULL; |
| 1917 | unsigned int map_size = 0; | 1879 | unsigned int map_size = 0; |
| 1918 | int error; | 1880 | int error; |
| @@ -1922,12 +1884,6 @@ xlog_recover_do_reg_buffer( | |||
| 1922 | data_map = buf_f->blf_data_map; | 1884 | data_map = buf_f->blf_data_map; |
| 1923 | map_size = buf_f->blf_map_size; | 1885 | map_size = buf_f->blf_map_size; |
| 1924 | break; | 1886 | break; |
| 1925 | case XFS_LI_6_1_BUF: | ||
| 1926 | case XFS_LI_5_3_BUF: | ||
| 1927 | obuf_f = (xfs_buf_log_format_v1_t*)buf_f; | ||
| 1928 | data_map = obuf_f->blf_data_map; | ||
| 1929 | map_size = obuf_f->blf_map_size; | ||
| 1930 | break; | ||
| 1931 | } | 1887 | } |
| 1932 | bit = 0; | 1888 | bit = 0; |
| 1933 | i = 1; /* 0 is the buf format structure */ | 1889 | i = 1; /* 0 is the buf format structure */ |
| @@ -2160,7 +2116,6 @@ xlog_recover_do_buffer_trans( | |||
| 2160 | int pass) | 2116 | int pass) |
| 2161 | { | 2117 | { |
| 2162 | xfs_buf_log_format_t *buf_f; | 2118 | xfs_buf_log_format_t *buf_f; |
| 2163 | xfs_buf_log_format_v1_t *obuf_f; | ||
| 2164 | xfs_mount_t *mp; | 2119 | xfs_mount_t *mp; |
| 2165 | xfs_buf_t *bp; | 2120 | xfs_buf_t *bp; |
| 2166 | int error; | 2121 | int error; |
| @@ -2197,13 +2152,6 @@ xlog_recover_do_buffer_trans( | |||
| 2197 | len = buf_f->blf_len; | 2152 | len = buf_f->blf_len; |
| 2198 | flags = buf_f->blf_flags; | 2153 | flags = buf_f->blf_flags; |
| 2199 | break; | 2154 | break; |
| 2200 | case XFS_LI_6_1_BUF: | ||
| 2201 | case XFS_LI_5_3_BUF: | ||
| 2202 | obuf_f = (xfs_buf_log_format_v1_t*)buf_f; | ||
| 2203 | blkno = obuf_f->blf_blkno; | ||
| 2204 | len = obuf_f->blf_len; | ||
| 2205 | flags = obuf_f->blf_flags; | ||
| 2206 | break; | ||
| 2207 | default: | 2155 | default: |
| 2208 | xfs_fs_cmn_err(CE_ALERT, log->l_mp, | 2156 | xfs_fs_cmn_err(CE_ALERT, log->l_mp, |
| 2209 | "xfs_log_recover: unknown buffer type 0x%x, logdev %s", | 2157 | "xfs_log_recover: unknown buffer type 0x%x, logdev %s", |
| @@ -2830,9 +2778,7 @@ xlog_recover_do_trans( | |||
| 2830 | * where xfs_daddr_t is 32-bits but mount will warn us | 2778 | * where xfs_daddr_t is 32-bits but mount will warn us |
| 2831 | * off a > 1 TB filesystem before we get here. | 2779 | * off a > 1 TB filesystem before we get here. |
| 2832 | */ | 2780 | */ |
| 2833 | if ((ITEM_TYPE(item) == XFS_LI_BUF) || | 2781 | if ((ITEM_TYPE(item) == XFS_LI_BUF)) { |
| 2834 | (ITEM_TYPE(item) == XFS_LI_6_1_BUF) || | ||
| 2835 | (ITEM_TYPE(item) == XFS_LI_5_3_BUF)) { | ||
| 2836 | if ((error = xlog_recover_do_buffer_trans(log, item, | 2782 | if ((error = xlog_recover_do_buffer_trans(log, item, |
| 2837 | pass))) | 2783 | pass))) |
| 2838 | break; | 2784 | break; |
| @@ -3902,6 +3848,9 @@ xlog_do_recover( | |||
| 3902 | ASSERT(XFS_SB_GOOD_VERSION(sbp)); | 3848 | ASSERT(XFS_SB_GOOD_VERSION(sbp)); |
| 3903 | xfs_buf_relse(bp); | 3849 | xfs_buf_relse(bp); |
| 3904 | 3850 | ||
| 3851 | /* We've re-read the superblock so re-initialize per-cpu counters */ | ||
| 3852 | xfs_icsb_reinit_counters(log->l_mp); | ||
| 3853 | |||
| 3905 | xlog_recover_check_summary(log); | 3854 | xlog_recover_check_summary(log); |
| 3906 | 3855 | ||
| 3907 | /* Normal transactions can now occur */ | 3856 | /* Normal transactions can now occur */ |
diff --git a/fs/xfs/xfs_mac.h b/fs/xfs/xfs_mac.h deleted file mode 100644 index 18e0e98e03d0..000000000000 --- a/fs/xfs/xfs_mac.h +++ /dev/null | |||
| @@ -1,106 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2001-2002,2005 Silicon Graphics, Inc. | ||
| 3 | * All Rights Reserved. | ||
| 4 | * | ||
| 5 | * This program is free software; you can redistribute it and/or | ||
| 6 | * modify it under the terms of the GNU General Public License as | ||
| 7 | * published by the Free Software Foundation. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it would be useful, | ||
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 12 | * GNU General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License | ||
| 15 | * along with this program; if not, write the Free Software Foundation, | ||
| 16 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
| 17 | */ | ||
| 18 | #ifndef __XFS_MAC_H__ | ||
| 19 | #define __XFS_MAC_H__ | ||
| 20 | |||
| 21 | /* | ||
| 22 | * Mandatory Access Control | ||
| 23 | * | ||
| 24 | * Layout of a composite MAC label: | ||
| 25 | * ml_list contains the list of categories (MSEN) followed by the list of | ||
| 26 | * divisions (MINT). This is actually a header for the data structure which | ||
| 27 | * will have an ml_list with more than one element. | ||
| 28 | * | ||
| 29 | * ------------------------------- | ||
| 30 | * | ml_msen_type | ml_mint_type | | ||
| 31 | * ------------------------------- | ||
| 32 | * | ml_level | ml_grade | | ||
| 33 | * ------------------------------- | ||
| 34 | * | ml_catcount | | ||
| 35 | * ------------------------------- | ||
| 36 | * | ml_divcount | | ||
| 37 | * ------------------------------- | ||
| 38 | * | category 1 | | ||
| 39 | * | . . . | | ||
| 40 | * | category N | (where N = ml_catcount) | ||
| 41 | * ------------------------------- | ||
| 42 | * | division 1 | | ||
| 43 | * | . . . | | ||
| 44 | * | division M | (where M = ml_divcount) | ||
| 45 | * ------------------------------- | ||
| 46 | */ | ||
| 47 | #define XFS_MAC_MAX_SETS 250 | ||
| 48 | typedef struct xfs_mac_label { | ||
| 49 | __uint8_t ml_msen_type; /* MSEN label type */ | ||
| 50 | __uint8_t ml_mint_type; /* MINT label type */ | ||
| 51 | __uint8_t ml_level; /* Hierarchical level */ | ||
| 52 | __uint8_t ml_grade; /* Hierarchical grade */ | ||
| 53 | __uint16_t ml_catcount; /* Category count */ | ||
| 54 | __uint16_t ml_divcount; /* Division count */ | ||
| 55 | /* Category set, then Division set */ | ||
| 56 | __uint16_t ml_list[XFS_MAC_MAX_SETS]; | ||
| 57 | } xfs_mac_label_t; | ||
| 58 | |||
| 59 | /* MSEN label type names. Choose an upper case ASCII character. */ | ||
| 60 | #define XFS_MSEN_ADMIN_LABEL 'A' /* Admin: low<admin != tcsec<high */ | ||
| 61 | #define XFS_MSEN_EQUAL_LABEL 'E' /* Wildcard - always equal */ | ||
| 62 | #define XFS_MSEN_HIGH_LABEL 'H' /* System High - always dominates */ | ||
| 63 | #define XFS_MSEN_MLD_HIGH_LABEL 'I' /* System High, multi-level dir */ | ||
| 64 | #define XFS_MSEN_LOW_LABEL 'L' /* System Low - always dominated */ | ||
| 65 | #define XFS_MSEN_MLD_LABEL 'M' /* TCSEC label on a multi-level dir */ | ||
| 66 | #define XFS_MSEN_MLD_LOW_LABEL 'N' /* System Low, multi-level dir */ | ||
| 67 | #define XFS_MSEN_TCSEC_LABEL 'T' /* TCSEC label */ | ||
| 68 | #define XFS_MSEN_UNKNOWN_LABEL 'U' /* unknown label */ | ||
| 69 | |||
| 70 | /* MINT label type names. Choose a lower case ASCII character. */ | ||
| 71 | #define XFS_MINT_BIBA_LABEL 'b' /* Dual of a TCSEC label */ | ||
| 72 | #define XFS_MINT_EQUAL_LABEL 'e' /* Wildcard - always equal */ | ||
| 73 | #define XFS_MINT_HIGH_LABEL 'h' /* High Grade - always dominates */ | ||
| 74 | #define XFS_MINT_LOW_LABEL 'l' /* Low Grade - always dominated */ | ||
| 75 | |||
| 76 | /* On-disk XFS extended attribute names */ | ||
| 77 | #define SGI_MAC_FILE "SGI_MAC_FILE" | ||
| 78 | #define SGI_MAC_FILE_SIZE (sizeof(SGI_MAC_FILE)-1) | ||
| 79 | |||
| 80 | |||
| 81 | #ifdef __KERNEL__ | ||
| 82 | |||
| 83 | #ifdef CONFIG_FS_POSIX_MAC | ||
| 84 | |||
| 85 | /* NOT YET IMPLEMENTED */ | ||
| 86 | |||
| 87 | #define MACEXEC 00100 | ||
| 88 | #define MACWRITE 00200 | ||
| 89 | #define MACREAD 00400 | ||
| 90 | |||
| 91 | struct xfs_inode; | ||
| 92 | extern int xfs_mac_iaccess(struct xfs_inode *, mode_t, cred_t *); | ||
| 93 | |||
| 94 | #define _MAC_XFS_IACCESS(i,m,c) (xfs_mac_iaccess(i,m,c)) | ||
| 95 | #define _MAC_VACCESS(v,c,m) (xfs_mac_vaccess(v,c,m)) | ||
| 96 | #define _MAC_EXISTS xfs_mac_vhaslabel | ||
| 97 | |||
| 98 | #else | ||
| 99 | #define _MAC_XFS_IACCESS(i,m,c) (0) | ||
| 100 | #define _MAC_VACCESS(v,c,m) (0) | ||
| 101 | #define _MAC_EXISTS (NULL) | ||
| 102 | #endif | ||
| 103 | |||
| 104 | #endif /* __KERNEL__ */ | ||
| 105 | |||
| 106 | #endif /* __XFS_MAC_H__ */ | ||
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 9dfae18d995f..3bed0cf0d8af 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
| @@ -52,21 +52,19 @@ STATIC void xfs_unmountfs_wait(xfs_mount_t *); | |||
| 52 | 52 | ||
| 53 | #ifdef HAVE_PERCPU_SB | 53 | #ifdef HAVE_PERCPU_SB |
| 54 | STATIC void xfs_icsb_destroy_counters(xfs_mount_t *); | 54 | STATIC void xfs_icsb_destroy_counters(xfs_mount_t *); |
| 55 | STATIC void xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t, int); | 55 | STATIC void xfs_icsb_balance_counter(xfs_mount_t *, xfs_sb_field_t, |
| 56 | int, int); | ||
| 56 | STATIC void xfs_icsb_sync_counters(xfs_mount_t *); | 57 | STATIC void xfs_icsb_sync_counters(xfs_mount_t *); |
| 57 | STATIC int xfs_icsb_modify_counters(xfs_mount_t *, xfs_sb_field_t, | 58 | STATIC int xfs_icsb_modify_counters(xfs_mount_t *, xfs_sb_field_t, |
| 58 | int, int); | 59 | int64_t, int); |
| 59 | STATIC int xfs_icsb_modify_counters_locked(xfs_mount_t *, xfs_sb_field_t, | ||
| 60 | int, int); | ||
| 61 | STATIC int xfs_icsb_disable_counter(xfs_mount_t *, xfs_sb_field_t); | 60 | STATIC int xfs_icsb_disable_counter(xfs_mount_t *, xfs_sb_field_t); |
| 62 | 61 | ||
| 63 | #else | 62 | #else |
| 64 | 63 | ||
| 65 | #define xfs_icsb_destroy_counters(mp) do { } while (0) | 64 | #define xfs_icsb_destroy_counters(mp) do { } while (0) |
| 66 | #define xfs_icsb_balance_counter(mp, a, b) do { } while (0) | 65 | #define xfs_icsb_balance_counter(mp, a, b, c) do { } while (0) |
| 67 | #define xfs_icsb_sync_counters(mp) do { } while (0) | 66 | #define xfs_icsb_sync_counters(mp) do { } while (0) |
| 68 | #define xfs_icsb_modify_counters(mp, a, b, c) do { } while (0) | 67 | #define xfs_icsb_modify_counters(mp, a, b, c) do { } while (0) |
| 69 | #define xfs_icsb_modify_counters_locked(mp, a, b, c) do { } while (0) | ||
| 70 | 68 | ||
| 71 | #endif | 69 | #endif |
| 72 | 70 | ||
| @@ -545,9 +543,8 @@ xfs_readsb(xfs_mount_t *mp, int flags) | |||
| 545 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); | 543 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); |
| 546 | } | 544 | } |
| 547 | 545 | ||
| 548 | xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); | 546 | /* Initialize per-cpu counters */ |
| 549 | xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); | 547 | xfs_icsb_reinit_counters(mp); |
| 550 | xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); | ||
| 551 | 548 | ||
| 552 | mp->m_sb_bp = bp; | 549 | mp->m_sb_bp = bp; |
| 553 | xfs_buf_relse(bp); | 550 | xfs_buf_relse(bp); |
| @@ -1254,8 +1251,11 @@ xfs_mod_sb(xfs_trans_t *tp, __int64_t fields) | |||
| 1254 | * The SB_LOCK must be held when this routine is called. | 1251 | * The SB_LOCK must be held when this routine is called. |
| 1255 | */ | 1252 | */ |
| 1256 | int | 1253 | int |
| 1257 | xfs_mod_incore_sb_unlocked(xfs_mount_t *mp, xfs_sb_field_t field, | 1254 | xfs_mod_incore_sb_unlocked( |
| 1258 | int delta, int rsvd) | 1255 | xfs_mount_t *mp, |
| 1256 | xfs_sb_field_t field, | ||
| 1257 | int64_t delta, | ||
| 1258 | int rsvd) | ||
| 1259 | { | 1259 | { |
| 1260 | int scounter; /* short counter for 32 bit fields */ | 1260 | int scounter; /* short counter for 32 bit fields */ |
| 1261 | long long lcounter; /* long counter for 64 bit fields */ | 1261 | long long lcounter; /* long counter for 64 bit fields */ |
| @@ -1287,7 +1287,6 @@ xfs_mod_incore_sb_unlocked(xfs_mount_t *mp, xfs_sb_field_t field, | |||
| 1287 | mp->m_sb.sb_ifree = lcounter; | 1287 | mp->m_sb.sb_ifree = lcounter; |
| 1288 | return 0; | 1288 | return 0; |
| 1289 | case XFS_SBS_FDBLOCKS: | 1289 | case XFS_SBS_FDBLOCKS: |
| 1290 | |||
| 1291 | lcounter = (long long) | 1290 | lcounter = (long long) |
| 1292 | mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); | 1291 | mp->m_sb.sb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); |
| 1293 | res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); | 1292 | res_used = (long long)(mp->m_resblks - mp->m_resblks_avail); |
| @@ -1418,7 +1417,11 @@ xfs_mod_incore_sb_unlocked(xfs_mount_t *mp, xfs_sb_field_t field, | |||
| 1418 | * routine to do the work. | 1417 | * routine to do the work. |
| 1419 | */ | 1418 | */ |
| 1420 | int | 1419 | int |
| 1421 | xfs_mod_incore_sb(xfs_mount_t *mp, xfs_sb_field_t field, int delta, int rsvd) | 1420 | xfs_mod_incore_sb( |
| 1421 | xfs_mount_t *mp, | ||
| 1422 | xfs_sb_field_t field, | ||
| 1423 | int64_t delta, | ||
| 1424 | int rsvd) | ||
| 1422 | { | 1425 | { |
| 1423 | unsigned long s; | 1426 | unsigned long s; |
| 1424 | int status; | 1427 | int status; |
| @@ -1485,9 +1488,11 @@ xfs_mod_incore_sb_batch(xfs_mount_t *mp, xfs_mod_sb_t *msb, uint nmsb, int rsvd) | |||
| 1485 | case XFS_SBS_IFREE: | 1488 | case XFS_SBS_IFREE: |
| 1486 | case XFS_SBS_FDBLOCKS: | 1489 | case XFS_SBS_FDBLOCKS: |
| 1487 | if (!(mp->m_flags & XFS_MOUNT_NO_PERCPU_SB)) { | 1490 | if (!(mp->m_flags & XFS_MOUNT_NO_PERCPU_SB)) { |
| 1488 | status = xfs_icsb_modify_counters_locked(mp, | 1491 | XFS_SB_UNLOCK(mp, s); |
| 1492 | status = xfs_icsb_modify_counters(mp, | ||
| 1489 | msbp->msb_field, | 1493 | msbp->msb_field, |
| 1490 | msbp->msb_delta, rsvd); | 1494 | msbp->msb_delta, rsvd); |
| 1495 | s = XFS_SB_LOCK(mp); | ||
| 1491 | break; | 1496 | break; |
| 1492 | } | 1497 | } |
| 1493 | /* FALLTHROUGH */ | 1498 | /* FALLTHROUGH */ |
| @@ -1521,11 +1526,12 @@ xfs_mod_incore_sb_batch(xfs_mount_t *mp, xfs_mod_sb_t *msb, uint nmsb, int rsvd) | |||
| 1521 | case XFS_SBS_IFREE: | 1526 | case XFS_SBS_IFREE: |
| 1522 | case XFS_SBS_FDBLOCKS: | 1527 | case XFS_SBS_FDBLOCKS: |
| 1523 | if (!(mp->m_flags & XFS_MOUNT_NO_PERCPU_SB)) { | 1528 | if (!(mp->m_flags & XFS_MOUNT_NO_PERCPU_SB)) { |
| 1524 | status = | 1529 | XFS_SB_UNLOCK(mp, s); |
| 1525 | xfs_icsb_modify_counters_locked(mp, | 1530 | status = xfs_icsb_modify_counters(mp, |
| 1526 | msbp->msb_field, | 1531 | msbp->msb_field, |
| 1527 | -(msbp->msb_delta), | 1532 | -(msbp->msb_delta), |
| 1528 | rsvd); | 1533 | rsvd); |
| 1534 | s = XFS_SB_LOCK(mp); | ||
| 1529 | break; | 1535 | break; |
| 1530 | } | 1536 | } |
| 1531 | /* FALLTHROUGH */ | 1537 | /* FALLTHROUGH */ |
| @@ -1733,14 +1739,17 @@ xfs_icsb_cpu_notify( | |||
| 1733 | memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); | 1739 | memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); |
| 1734 | break; | 1740 | break; |
| 1735 | case CPU_ONLINE: | 1741 | case CPU_ONLINE: |
| 1736 | xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0); | 1742 | xfs_icsb_lock(mp); |
| 1737 | xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0); | 1743 | xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0, 0); |
| 1738 | xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0); | 1744 | xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0, 0); |
| 1745 | xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0, 0); | ||
| 1746 | xfs_icsb_unlock(mp); | ||
| 1739 | break; | 1747 | break; |
| 1740 | case CPU_DEAD: | 1748 | case CPU_DEAD: |
| 1741 | /* Disable all the counters, then fold the dead cpu's | 1749 | /* Disable all the counters, then fold the dead cpu's |
| 1742 | * count into the total on the global superblock and | 1750 | * count into the total on the global superblock and |
| 1743 | * re-enable the counters. */ | 1751 | * re-enable the counters. */ |
| 1752 | xfs_icsb_lock(mp); | ||
| 1744 | s = XFS_SB_LOCK(mp); | 1753 | s = XFS_SB_LOCK(mp); |
| 1745 | xfs_icsb_disable_counter(mp, XFS_SBS_ICOUNT); | 1754 | xfs_icsb_disable_counter(mp, XFS_SBS_ICOUNT); |
| 1746 | xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); | 1755 | xfs_icsb_disable_counter(mp, XFS_SBS_IFREE); |
| @@ -1752,10 +1761,14 @@ xfs_icsb_cpu_notify( | |||
| 1752 | 1761 | ||
| 1753 | memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); | 1762 | memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); |
| 1754 | 1763 | ||
| 1755 | xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, XFS_ICSB_SB_LOCKED); | 1764 | xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, |
| 1756 | xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, XFS_ICSB_SB_LOCKED); | 1765 | XFS_ICSB_SB_LOCKED, 0); |
| 1757 | xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, XFS_ICSB_SB_LOCKED); | 1766 | xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, |
| 1767 | XFS_ICSB_SB_LOCKED, 0); | ||
| 1768 | xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, | ||
| 1769 | XFS_ICSB_SB_LOCKED, 0); | ||
| 1758 | XFS_SB_UNLOCK(mp, s); | 1770 | XFS_SB_UNLOCK(mp, s); |
| 1771 | xfs_icsb_unlock(mp); | ||
| 1759 | break; | 1772 | break; |
| 1760 | } | 1773 | } |
| 1761 | 1774 | ||
| @@ -1784,6 +1797,9 @@ xfs_icsb_init_counters( | |||
| 1784 | cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); | 1797 | cntp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, i); |
| 1785 | memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); | 1798 | memset(cntp, 0, sizeof(xfs_icsb_cnts_t)); |
| 1786 | } | 1799 | } |
| 1800 | |||
| 1801 | mutex_init(&mp->m_icsb_mutex); | ||
| 1802 | |||
| 1787 | /* | 1803 | /* |
| 1788 | * start with all counters disabled so that the | 1804 | * start with all counters disabled so that the |
| 1789 | * initial balance kicks us off correctly | 1805 | * initial balance kicks us off correctly |
| @@ -1792,6 +1808,22 @@ xfs_icsb_init_counters( | |||
| 1792 | return 0; | 1808 | return 0; |
| 1793 | } | 1809 | } |
| 1794 | 1810 | ||
| 1811 | void | ||
| 1812 | xfs_icsb_reinit_counters( | ||
| 1813 | xfs_mount_t *mp) | ||
| 1814 | { | ||
| 1815 | xfs_icsb_lock(mp); | ||
| 1816 | /* | ||
| 1817 | * start with all counters disabled so that the | ||
| 1818 | * initial balance kicks us off correctly | ||
| 1819 | */ | ||
| 1820 | mp->m_icsb_counters = -1; | ||
| 1821 | xfs_icsb_balance_counter(mp, XFS_SBS_ICOUNT, 0, 0); | ||
| 1822 | xfs_icsb_balance_counter(mp, XFS_SBS_IFREE, 0, 0); | ||
| 1823 | xfs_icsb_balance_counter(mp, XFS_SBS_FDBLOCKS, 0, 0); | ||
| 1824 | xfs_icsb_unlock(mp); | ||
| 1825 | } | ||
| 1826 | |||
| 1795 | STATIC void | 1827 | STATIC void |
| 1796 | xfs_icsb_destroy_counters( | 1828 | xfs_icsb_destroy_counters( |
| 1797 | xfs_mount_t *mp) | 1829 | xfs_mount_t *mp) |
| @@ -1800,9 +1832,10 @@ xfs_icsb_destroy_counters( | |||
| 1800 | unregister_hotcpu_notifier(&mp->m_icsb_notifier); | 1832 | unregister_hotcpu_notifier(&mp->m_icsb_notifier); |
| 1801 | free_percpu(mp->m_sb_cnts); | 1833 | free_percpu(mp->m_sb_cnts); |
| 1802 | } | 1834 | } |
| 1835 | mutex_destroy(&mp->m_icsb_mutex); | ||
| 1803 | } | 1836 | } |
| 1804 | 1837 | ||
| 1805 | STATIC inline void | 1838 | STATIC_INLINE void |
| 1806 | xfs_icsb_lock_cntr( | 1839 | xfs_icsb_lock_cntr( |
| 1807 | xfs_icsb_cnts_t *icsbp) | 1840 | xfs_icsb_cnts_t *icsbp) |
| 1808 | { | 1841 | { |
| @@ -1811,7 +1844,7 @@ xfs_icsb_lock_cntr( | |||
| 1811 | } | 1844 | } |
| 1812 | } | 1845 | } |
| 1813 | 1846 | ||
| 1814 | STATIC inline void | 1847 | STATIC_INLINE void |
| 1815 | xfs_icsb_unlock_cntr( | 1848 | xfs_icsb_unlock_cntr( |
| 1816 | xfs_icsb_cnts_t *icsbp) | 1849 | xfs_icsb_cnts_t *icsbp) |
| 1817 | { | 1850 | { |
| @@ -1819,7 +1852,7 @@ xfs_icsb_unlock_cntr( | |||
| 1819 | } | 1852 | } |
| 1820 | 1853 | ||
| 1821 | 1854 | ||
| 1822 | STATIC inline void | 1855 | STATIC_INLINE void |
| 1823 | xfs_icsb_lock_all_counters( | 1856 | xfs_icsb_lock_all_counters( |
| 1824 | xfs_mount_t *mp) | 1857 | xfs_mount_t *mp) |
| 1825 | { | 1858 | { |
| @@ -1832,7 +1865,7 @@ xfs_icsb_lock_all_counters( | |||
| 1832 | } | 1865 | } |
| 1833 | } | 1866 | } |
| 1834 | 1867 | ||
| 1835 | STATIC inline void | 1868 | STATIC_INLINE void |
| 1836 | xfs_icsb_unlock_all_counters( | 1869 | xfs_icsb_unlock_all_counters( |
| 1837 | xfs_mount_t *mp) | 1870 | xfs_mount_t *mp) |
| 1838 | { | 1871 | { |
| @@ -1888,6 +1921,17 @@ xfs_icsb_disable_counter( | |||
| 1888 | 1921 | ||
| 1889 | ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); | 1922 | ASSERT((field >= XFS_SBS_ICOUNT) && (field <= XFS_SBS_FDBLOCKS)); |
| 1890 | 1923 | ||
| 1924 | /* | ||
| 1925 | * If we are already disabled, then there is nothing to do | ||
| 1926 | * here. We check before locking all the counters to avoid | ||
| 1927 | * the expensive lock operation when being called in the | ||
| 1928 | * slow path and the counter is already disabled. This is | ||
| 1929 | * safe because the only time we set or clear this state is under | ||
| 1930 | * the m_icsb_mutex. | ||
| 1931 | */ | ||
| 1932 | if (xfs_icsb_counter_disabled(mp, field)) | ||
| 1933 | return 0; | ||
| 1934 | |||
| 1891 | xfs_icsb_lock_all_counters(mp); | 1935 | xfs_icsb_lock_all_counters(mp); |
| 1892 | if (!test_and_set_bit(field, &mp->m_icsb_counters)) { | 1936 | if (!test_and_set_bit(field, &mp->m_icsb_counters)) { |
| 1893 | /* drain back to superblock */ | 1937 | /* drain back to superblock */ |
| @@ -1948,8 +1992,8 @@ xfs_icsb_enable_counter( | |||
| 1948 | xfs_icsb_unlock_all_counters(mp); | 1992 | xfs_icsb_unlock_all_counters(mp); |
| 1949 | } | 1993 | } |
| 1950 | 1994 | ||
| 1951 | STATIC void | 1995 | void |
| 1952 | xfs_icsb_sync_counters_int( | 1996 | xfs_icsb_sync_counters_flags( |
| 1953 | xfs_mount_t *mp, | 1997 | xfs_mount_t *mp, |
| 1954 | int flags) | 1998 | int flags) |
| 1955 | { | 1999 | { |
| @@ -1981,40 +2025,39 @@ STATIC void | |||
| 1981 | xfs_icsb_sync_counters( | 2025 | xfs_icsb_sync_counters( |
| 1982 | xfs_mount_t *mp) | 2026 | xfs_mount_t *mp) |
| 1983 | { | 2027 | { |
| 1984 | xfs_icsb_sync_counters_int(mp, 0); | 2028 | xfs_icsb_sync_counters_flags(mp, 0); |
| 1985 | } | ||
| 1986 | |||
| 1987 | /* | ||
| 1988 | * lazy addition used for things like df, background sb syncs, etc | ||
| 1989 | */ | ||
| 1990 | void | ||
| 1991 | xfs_icsb_sync_counters_lazy( | ||
| 1992 | xfs_mount_t *mp) | ||
| 1993 | { | ||
| 1994 | xfs_icsb_sync_counters_int(mp, XFS_ICSB_LAZY_COUNT); | ||
| 1995 | } | 2029 | } |
| 1996 | 2030 | ||
| 1997 | /* | 2031 | /* |
| 1998 | * Balance and enable/disable counters as necessary. | 2032 | * Balance and enable/disable counters as necessary. |
| 1999 | * | 2033 | * |
| 2000 | * Thresholds for re-enabling counters are somewhat magic. | 2034 | * Thresholds for re-enabling counters are somewhat magic. inode counts are |
| 2001 | * inode counts are chosen to be the same number as single | 2035 | * chosen to be the same number as single on disk allocation chunk per CPU, and |
| 2002 | * on disk allocation chunk per CPU, and free blocks is | 2036 | * free blocks is something far enough zero that we aren't going thrash when we |
| 2003 | * something far enough zero that we aren't going thrash | 2037 | * get near ENOSPC. We also need to supply a minimum we require per cpu to |
| 2004 | * when we get near ENOSPC. | 2038 | * prevent looping endlessly when xfs_alloc_space asks for more than will |
| 2039 | * be distributed to a single CPU but each CPU has enough blocks to be | ||
| 2040 | * reenabled. | ||
| 2041 | * | ||
| 2042 | * Note that we can be called when counters are already disabled. | ||
| 2043 | * xfs_icsb_disable_counter() optimises the counter locking in this case to | ||
| 2044 | * prevent locking every per-cpu counter needlessly. | ||
| 2005 | */ | 2045 | */ |
| 2006 | #define XFS_ICSB_INO_CNTR_REENABLE 64 | 2046 | |
| 2047 | #define XFS_ICSB_INO_CNTR_REENABLE (uint64_t)64 | ||
| 2007 | #define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \ | 2048 | #define XFS_ICSB_FDBLK_CNTR_REENABLE(mp) \ |
| 2008 | (512 + XFS_ALLOC_SET_ASIDE(mp)) | 2049 | (uint64_t)(512 + XFS_ALLOC_SET_ASIDE(mp)) |
| 2009 | STATIC void | 2050 | STATIC void |
| 2010 | xfs_icsb_balance_counter( | 2051 | xfs_icsb_balance_counter( |
| 2011 | xfs_mount_t *mp, | 2052 | xfs_mount_t *mp, |
| 2012 | xfs_sb_field_t field, | 2053 | xfs_sb_field_t field, |
| 2013 | int flags) | 2054 | int flags, |
| 2055 | int min_per_cpu) | ||
| 2014 | { | 2056 | { |
| 2015 | uint64_t count, resid; | 2057 | uint64_t count, resid; |
| 2016 | int weight = num_online_cpus(); | 2058 | int weight = num_online_cpus(); |
| 2017 | int s; | 2059 | int s; |
| 2060 | uint64_t min = (uint64_t)min_per_cpu; | ||
| 2018 | 2061 | ||
| 2019 | if (!(flags & XFS_ICSB_SB_LOCKED)) | 2062 | if (!(flags & XFS_ICSB_SB_LOCKED)) |
| 2020 | s = XFS_SB_LOCK(mp); | 2063 | s = XFS_SB_LOCK(mp); |
| @@ -2027,19 +2070,19 @@ xfs_icsb_balance_counter( | |||
| 2027 | case XFS_SBS_ICOUNT: | 2070 | case XFS_SBS_ICOUNT: |
| 2028 | count = mp->m_sb.sb_icount; | 2071 | count = mp->m_sb.sb_icount; |
| 2029 | resid = do_div(count, weight); | 2072 | resid = do_div(count, weight); |
| 2030 | if (count < XFS_ICSB_INO_CNTR_REENABLE) | 2073 | if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) |
| 2031 | goto out; | 2074 | goto out; |
| 2032 | break; | 2075 | break; |
| 2033 | case XFS_SBS_IFREE: | 2076 | case XFS_SBS_IFREE: |
| 2034 | count = mp->m_sb.sb_ifree; | 2077 | count = mp->m_sb.sb_ifree; |
| 2035 | resid = do_div(count, weight); | 2078 | resid = do_div(count, weight); |
| 2036 | if (count < XFS_ICSB_INO_CNTR_REENABLE) | 2079 | if (count < max(min, XFS_ICSB_INO_CNTR_REENABLE)) |
| 2037 | goto out; | 2080 | goto out; |
| 2038 | break; | 2081 | break; |
| 2039 | case XFS_SBS_FDBLOCKS: | 2082 | case XFS_SBS_FDBLOCKS: |
| 2040 | count = mp->m_sb.sb_fdblocks; | 2083 | count = mp->m_sb.sb_fdblocks; |
| 2041 | resid = do_div(count, weight); | 2084 | resid = do_div(count, weight); |
| 2042 | if (count < XFS_ICSB_FDBLK_CNTR_REENABLE(mp)) | 2085 | if (count < max(min, XFS_ICSB_FDBLK_CNTR_REENABLE(mp))) |
| 2043 | goto out; | 2086 | goto out; |
| 2044 | break; | 2087 | break; |
| 2045 | default: | 2088 | default: |
| @@ -2054,32 +2097,39 @@ out: | |||
| 2054 | XFS_SB_UNLOCK(mp, s); | 2097 | XFS_SB_UNLOCK(mp, s); |
| 2055 | } | 2098 | } |
| 2056 | 2099 | ||
| 2057 | STATIC int | 2100 | int |
| 2058 | xfs_icsb_modify_counters_int( | 2101 | xfs_icsb_modify_counters( |
| 2059 | xfs_mount_t *mp, | 2102 | xfs_mount_t *mp, |
| 2060 | xfs_sb_field_t field, | 2103 | xfs_sb_field_t field, |
| 2061 | int delta, | 2104 | int64_t delta, |
| 2062 | int rsvd, | 2105 | int rsvd) |
| 2063 | int flags) | ||
| 2064 | { | 2106 | { |
| 2065 | xfs_icsb_cnts_t *icsbp; | 2107 | xfs_icsb_cnts_t *icsbp; |
| 2066 | long long lcounter; /* long counter for 64 bit fields */ | 2108 | long long lcounter; /* long counter for 64 bit fields */ |
| 2067 | int cpu, s, locked = 0; | 2109 | int cpu, ret = 0, s; |
| 2068 | int ret = 0, balance_done = 0; | ||
| 2069 | 2110 | ||
| 2111 | might_sleep(); | ||
| 2070 | again: | 2112 | again: |
| 2071 | cpu = get_cpu(); | 2113 | cpu = get_cpu(); |
| 2072 | icsbp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, cpu), | 2114 | icsbp = (xfs_icsb_cnts_t *)per_cpu_ptr(mp->m_sb_cnts, cpu); |
| 2073 | xfs_icsb_lock_cntr(icsbp); | 2115 | |
| 2116 | /* | ||
| 2117 | * if the counter is disabled, go to slow path | ||
| 2118 | */ | ||
| 2074 | if (unlikely(xfs_icsb_counter_disabled(mp, field))) | 2119 | if (unlikely(xfs_icsb_counter_disabled(mp, field))) |
| 2075 | goto slow_path; | 2120 | goto slow_path; |
| 2121 | xfs_icsb_lock_cntr(icsbp); | ||
| 2122 | if (unlikely(xfs_icsb_counter_disabled(mp, field))) { | ||
| 2123 | xfs_icsb_unlock_cntr(icsbp); | ||
| 2124 | goto slow_path; | ||
| 2125 | } | ||
| 2076 | 2126 | ||
| 2077 | switch (field) { | 2127 | switch (field) { |
| 2078 | case XFS_SBS_ICOUNT: | 2128 | case XFS_SBS_ICOUNT: |
| 2079 | lcounter = icsbp->icsb_icount; | 2129 | lcounter = icsbp->icsb_icount; |
| 2080 | lcounter += delta; | 2130 | lcounter += delta; |
| 2081 | if (unlikely(lcounter < 0)) | 2131 | if (unlikely(lcounter < 0)) |
| 2082 | goto slow_path; | 2132 | goto balance_counter; |
| 2083 | icsbp->icsb_icount = lcounter; | 2133 | icsbp->icsb_icount = lcounter; |
| 2084 | break; | 2134 | break; |
| 2085 | 2135 | ||
| @@ -2087,7 +2137,7 @@ again: | |||
| 2087 | lcounter = icsbp->icsb_ifree; | 2137 | lcounter = icsbp->icsb_ifree; |
| 2088 | lcounter += delta; | 2138 | lcounter += delta; |
| 2089 | if (unlikely(lcounter < 0)) | 2139 | if (unlikely(lcounter < 0)) |
| 2090 | goto slow_path; | 2140 | goto balance_counter; |
| 2091 | icsbp->icsb_ifree = lcounter; | 2141 | icsbp->icsb_ifree = lcounter; |
| 2092 | break; | 2142 | break; |
| 2093 | 2143 | ||
| @@ -2097,7 +2147,7 @@ again: | |||
| 2097 | lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); | 2147 | lcounter = icsbp->icsb_fdblocks - XFS_ALLOC_SET_ASIDE(mp); |
| 2098 | lcounter += delta; | 2148 | lcounter += delta; |
| 2099 | if (unlikely(lcounter < 0)) | 2149 | if (unlikely(lcounter < 0)) |
| 2100 | goto slow_path; | 2150 | goto balance_counter; |
| 2101 | icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); | 2151 | icsbp->icsb_fdblocks = lcounter + XFS_ALLOC_SET_ASIDE(mp); |
| 2102 | break; | 2152 | break; |
| 2103 | default: | 2153 | default: |
| @@ -2106,72 +2156,78 @@ again: | |||
| 2106 | } | 2156 | } |
| 2107 | xfs_icsb_unlock_cntr(icsbp); | 2157 | xfs_icsb_unlock_cntr(icsbp); |
| 2108 | put_cpu(); | 2158 | put_cpu(); |
| 2109 | if (locked) | ||
| 2110 | XFS_SB_UNLOCK(mp, s); | ||
| 2111 | return 0; | 2159 | return 0; |
| 2112 | 2160 | ||
| 2113 | /* | ||
| 2114 | * The slow path needs to be run with the SBLOCK | ||
| 2115 | * held so that we prevent other threads from | ||
| 2116 | * attempting to run this path at the same time. | ||
| 2117 | * this provides exclusion for the balancing code, | ||
| 2118 | * and exclusive fallback if the balance does not | ||
| 2119 | * provide enough resources to continue in an unlocked | ||
| 2120 | * manner. | ||
| 2121 | */ | ||
| 2122 | slow_path: | 2161 | slow_path: |
| 2123 | xfs_icsb_unlock_cntr(icsbp); | ||
| 2124 | put_cpu(); | 2162 | put_cpu(); |
| 2125 | 2163 | ||
| 2126 | /* need to hold superblock incase we need | 2164 | /* |
| 2127 | * to disable a counter */ | 2165 | * serialise with a mutex so we don't burn lots of cpu on |
| 2128 | if (!(flags & XFS_ICSB_SB_LOCKED)) { | 2166 | * the superblock lock. We still need to hold the superblock |
| 2129 | s = XFS_SB_LOCK(mp); | 2167 | * lock, however, when we modify the global structures. |
| 2130 | locked = 1; | 2168 | */ |
| 2131 | flags |= XFS_ICSB_SB_LOCKED; | 2169 | xfs_icsb_lock(mp); |
| 2132 | } | 2170 | |
| 2133 | if (!balance_done) { | 2171 | /* |
| 2134 | xfs_icsb_balance_counter(mp, field, flags); | 2172 | * Now running atomically. |
| 2135 | balance_done = 1; | 2173 | * |
| 2174 | * If the counter is enabled, someone has beaten us to rebalancing. | ||
| 2175 | * Drop the lock and try again in the fast path.... | ||
| 2176 | */ | ||
| 2177 | if (!(xfs_icsb_counter_disabled(mp, field))) { | ||
| 2178 | xfs_icsb_unlock(mp); | ||
| 2136 | goto again; | 2179 | goto again; |
| 2137 | } else { | ||
| 2138 | /* | ||
| 2139 | * we might not have enough on this local | ||
| 2140 | * cpu to allocate for a bulk request. | ||
| 2141 | * We need to drain this field from all CPUs | ||
| 2142 | * and disable the counter fastpath | ||
| 2143 | */ | ||
| 2144 | xfs_icsb_disable_counter(mp, field); | ||
| 2145 | } | 2180 | } |
| 2146 | 2181 | ||
| 2182 | /* | ||
| 2183 | * The counter is currently disabled. Because we are | ||
| 2184 | * running atomically here, we know a rebalance cannot | ||
| 2185 | * be in progress. Hence we can go straight to operating | ||
| 2186 | * on the global superblock. We do not call xfs_mod_incore_sb() | ||
| 2187 | * here even though we need to get the SB_LOCK. Doing so | ||
| 2188 | * will cause us to re-enter this function and deadlock. | ||
| 2189 | * Hence we get the SB_LOCK ourselves and then call | ||
| 2190 | * xfs_mod_incore_sb_unlocked() as the unlocked path operates | ||
| 2191 | * directly on the global counters. | ||
| 2192 | */ | ||
| 2193 | s = XFS_SB_LOCK(mp); | ||
| 2147 | ret = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); | 2194 | ret = xfs_mod_incore_sb_unlocked(mp, field, delta, rsvd); |
| 2195 | XFS_SB_UNLOCK(mp, s); | ||
| 2148 | 2196 | ||
| 2149 | if (locked) | 2197 | /* |
| 2150 | XFS_SB_UNLOCK(mp, s); | 2198 | * Now that we've modified the global superblock, we |
| 2199 | * may be able to re-enable the distributed counters | ||
| 2200 | * (e.g. lots of space just got freed). After that | ||
| 2201 | * we are done. | ||
| 2202 | */ | ||
| 2203 | if (ret != ENOSPC) | ||
| 2204 | xfs_icsb_balance_counter(mp, field, 0, 0); | ||
| 2205 | xfs_icsb_unlock(mp); | ||
| 2151 | return ret; | 2206 | return ret; |
| 2152 | } | ||
| 2153 | 2207 | ||
| 2154 | STATIC int | 2208 | balance_counter: |
| 2155 | xfs_icsb_modify_counters( | 2209 | xfs_icsb_unlock_cntr(icsbp); |
| 2156 | xfs_mount_t *mp, | 2210 | put_cpu(); |
| 2157 | xfs_sb_field_t field, | ||
| 2158 | int delta, | ||
| 2159 | int rsvd) | ||
| 2160 | { | ||
| 2161 | return xfs_icsb_modify_counters_int(mp, field, delta, rsvd, 0); | ||
| 2162 | } | ||
| 2163 | 2211 | ||
| 2164 | /* | 2212 | /* |
| 2165 | * Called when superblock is already locked | 2213 | * We may have multiple threads here if multiple per-cpu |
| 2166 | */ | 2214 | * counters run dry at the same time. This will mean we can |
| 2167 | STATIC int | 2215 | * do more balances than strictly necessary but it is not |
| 2168 | xfs_icsb_modify_counters_locked( | 2216 | * the common slowpath case. |
| 2169 | xfs_mount_t *mp, | 2217 | */ |
| 2170 | xfs_sb_field_t field, | 2218 | xfs_icsb_lock(mp); |
| 2171 | int delta, | 2219 | |
| 2172 | int rsvd) | 2220 | /* |
| 2173 | { | 2221 | * running atomically. |
| 2174 | return xfs_icsb_modify_counters_int(mp, field, delta, | 2222 | * |
| 2175 | rsvd, XFS_ICSB_SB_LOCKED); | 2223 | * This will leave the counter in the correct state for future |
| 2224 | * accesses. After the rebalance, we simply try again and our retry | ||
| 2225 | * will either succeed through the fast path or slow path without | ||
| 2226 | * another balance operation being required. | ||
| 2227 | */ | ||
| 2228 | xfs_icsb_balance_counter(mp, field, 0, delta); | ||
| 2229 | xfs_icsb_unlock(mp); | ||
| 2230 | goto again; | ||
| 2176 | } | 2231 | } |
| 2232 | |||
| 2177 | #endif | 2233 | #endif |
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index e5f396ff9a3d..82304b94646d 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #ifndef __XFS_MOUNT_H__ | 18 | #ifndef __XFS_MOUNT_H__ |
| 19 | #define __XFS_MOUNT_H__ | 19 | #define __XFS_MOUNT_H__ |
| 20 | 20 | ||
| 21 | |||
| 21 | typedef struct xfs_trans_reservations { | 22 | typedef struct xfs_trans_reservations { |
| 22 | uint tr_write; /* extent alloc trans */ | 23 | uint tr_write; /* extent alloc trans */ |
| 23 | uint tr_itruncate; /* truncate trans */ | 24 | uint tr_itruncate; /* truncate trans */ |
| @@ -306,11 +307,13 @@ typedef struct xfs_icsb_cnts { | |||
| 306 | #define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ | 307 | #define XFS_ICSB_LAZY_COUNT (1 << 1) /* accuracy not needed */ |
| 307 | 308 | ||
| 308 | extern int xfs_icsb_init_counters(struct xfs_mount *); | 309 | extern int xfs_icsb_init_counters(struct xfs_mount *); |
| 309 | extern void xfs_icsb_sync_counters_lazy(struct xfs_mount *); | 310 | extern void xfs_icsb_reinit_counters(struct xfs_mount *); |
| 311 | extern void xfs_icsb_sync_counters_flags(struct xfs_mount *, int); | ||
| 310 | 312 | ||
| 311 | #else | 313 | #else |
| 312 | #define xfs_icsb_init_counters(mp) (0) | 314 | #define xfs_icsb_init_counters(mp) (0) |
| 313 | #define xfs_icsb_sync_counters_lazy(mp) do { } while (0) | 315 | #define xfs_icsb_reinit_counters(mp) do { } while (0) |
| 316 | #define xfs_icsb_sync_counters_flags(mp, flags) do { } while (0) | ||
| 314 | #endif | 317 | #endif |
| 315 | 318 | ||
| 316 | typedef struct xfs_mount { | 319 | typedef struct xfs_mount { |
| @@ -419,6 +422,7 @@ typedef struct xfs_mount { | |||
| 419 | xfs_icsb_cnts_t *m_sb_cnts; /* per-cpu superblock counters */ | 422 | xfs_icsb_cnts_t *m_sb_cnts; /* per-cpu superblock counters */ |
| 420 | unsigned long m_icsb_counters; /* disabled per-cpu counters */ | 423 | unsigned long m_icsb_counters; /* disabled per-cpu counters */ |
| 421 | struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ | 424 | struct notifier_block m_icsb_notifier; /* hotplug cpu notifier */ |
| 425 | struct mutex m_icsb_mutex; /* balancer sync lock */ | ||
| 422 | #endif | 426 | #endif |
| 423 | } xfs_mount_t; | 427 | } xfs_mount_t; |
| 424 | 428 | ||
| @@ -563,11 +567,32 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d) | |||
| 563 | } | 567 | } |
| 564 | 568 | ||
| 565 | /* | 569 | /* |
| 570 | * Per-cpu superblock locking functions | ||
| 571 | */ | ||
| 572 | #ifdef HAVE_PERCPU_SB | ||
| 573 | STATIC_INLINE void | ||
| 574 | xfs_icsb_lock(xfs_mount_t *mp) | ||
| 575 | { | ||
| 576 | mutex_lock(&mp->m_icsb_mutex); | ||
| 577 | } | ||
| 578 | |||
| 579 | STATIC_INLINE void | ||
| 580 | xfs_icsb_unlock(xfs_mount_t *mp) | ||
| 581 | { | ||
| 582 | mutex_unlock(&mp->m_icsb_mutex); | ||
| 583 | } | ||
| 584 | #else | ||
| 585 | #define xfs_icsb_lock(mp) | ||
| 586 | #define xfs_icsb_unlock(mp) | ||
| 587 | #endif | ||
| 588 | |||
| 589 | /* | ||
| 566 | * This structure is for use by the xfs_mod_incore_sb_batch() routine. | 590 | * This structure is for use by the xfs_mod_incore_sb_batch() routine. |
| 591 | * xfs_growfs can specify a few fields which are more than int limit | ||
| 567 | */ | 592 | */ |
| 568 | typedef struct xfs_mod_sb { | 593 | typedef struct xfs_mod_sb { |
| 569 | xfs_sb_field_t msb_field; /* Field to modify, see below */ | 594 | xfs_sb_field_t msb_field; /* Field to modify, see below */ |
| 570 | int msb_delta; /* Change to make to specified field */ | 595 | int64_t msb_delta; /* Change to make to specified field */ |
| 571 | } xfs_mod_sb_t; | 596 | } xfs_mod_sb_t; |
| 572 | 597 | ||
| 573 | #define XFS_MOUNT_ILOCK(mp) mutex_lock(&((mp)->m_ilock)) | 598 | #define XFS_MOUNT_ILOCK(mp) mutex_lock(&((mp)->m_ilock)) |
| @@ -585,17 +610,17 @@ extern int xfs_unmountfs(xfs_mount_t *, struct cred *); | |||
| 585 | extern void xfs_unmountfs_close(xfs_mount_t *, struct cred *); | 610 | extern void xfs_unmountfs_close(xfs_mount_t *, struct cred *); |
| 586 | extern int xfs_unmountfs_writesb(xfs_mount_t *); | 611 | extern int xfs_unmountfs_writesb(xfs_mount_t *); |
| 587 | extern int xfs_unmount_flush(xfs_mount_t *, int); | 612 | extern int xfs_unmount_flush(xfs_mount_t *, int); |
| 588 | extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int, int); | 613 | extern int xfs_mod_incore_sb(xfs_mount_t *, xfs_sb_field_t, int64_t, int); |
| 589 | extern int xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t, | 614 | extern int xfs_mod_incore_sb_unlocked(xfs_mount_t *, xfs_sb_field_t, |
| 590 | int, int); | 615 | int64_t, int); |
| 591 | extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, | 616 | extern int xfs_mod_incore_sb_batch(xfs_mount_t *, xfs_mod_sb_t *, |
| 592 | uint, int); | 617 | uint, int); |
| 593 | extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); | 618 | extern struct xfs_buf *xfs_getsb(xfs_mount_t *, int); |
| 594 | extern int xfs_readsb(xfs_mount_t *, int); | 619 | extern int xfs_readsb(xfs_mount_t *, int); |
| 595 | extern void xfs_freesb(xfs_mount_t *); | 620 | extern void xfs_freesb(xfs_mount_t *); |
| 596 | extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int); | 621 | extern void xfs_do_force_shutdown(bhv_desc_t *, int, char *, int); |
| 597 | extern int xfs_syncsub(xfs_mount_t *, int, int, int *); | 622 | extern int xfs_syncsub(xfs_mount_t *, int, int *); |
| 598 | extern int xfs_sync_inodes(xfs_mount_t *, int, int, int *); | 623 | extern int xfs_sync_inodes(xfs_mount_t *, int, int *); |
| 599 | extern xfs_agnumber_t xfs_initialize_perag(struct bhv_vfs *, xfs_mount_t *, | 624 | extern xfs_agnumber_t xfs_initialize_perag(struct bhv_vfs *, xfs_mount_t *, |
| 600 | xfs_agnumber_t); | 625 | xfs_agnumber_t); |
| 601 | extern void xfs_xlatesb(void *, struct xfs_sb *, int, __int64_t); | 626 | extern void xfs_xlatesb(void *, struct xfs_sb *, int, __int64_t); |
diff --git a/fs/xfs/xfs_rename.c b/fs/xfs/xfs_rename.c index d98171deaa1c..4c6573d784cd 100644 --- a/fs/xfs/xfs_rename.c +++ b/fs/xfs/xfs_rename.c | |||
| @@ -565,7 +565,7 @@ xfs_rename( | |||
| 565 | IHOLD(target_ip); | 565 | IHOLD(target_ip); |
| 566 | IHOLD(src_ip); | 566 | IHOLD(src_ip); |
| 567 | 567 | ||
| 568 | error = xfs_bmap_finish(&tp, &free_list, first_block, &committed); | 568 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 569 | if (error) { | 569 | if (error) { |
| 570 | xfs_bmap_cancel(&free_list); | 570 | xfs_bmap_cancel(&free_list); |
| 571 | xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | | 571 | xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | |
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index 880c73271c05..6fff19dc3cf9 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c | |||
| @@ -147,7 +147,7 @@ xfs_growfs_rt_alloc( | |||
| 147 | /* | 147 | /* |
| 148 | * Free any blocks freed up in the transaction, then commit. | 148 | * Free any blocks freed up in the transaction, then commit. |
| 149 | */ | 149 | */ |
| 150 | error = xfs_bmap_finish(&tp, &flist, firstblock, &committed); | 150 | error = xfs_bmap_finish(&tp, &flist, &committed); |
| 151 | if (error) | 151 | if (error) |
| 152 | goto error_exit; | 152 | goto error_exit; |
| 153 | xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL); | 153 | xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL); |
| @@ -913,57 +913,6 @@ xfs_rtcheck_alloc_range( | |||
| 913 | } | 913 | } |
| 914 | #endif | 914 | #endif |
| 915 | 915 | ||
| 916 | #ifdef DEBUG | ||
| 917 | /* | ||
| 918 | * Check whether the given block in the bitmap has the given value. | ||
| 919 | */ | ||
| 920 | STATIC int /* 1 for matches, 0 for not */ | ||
| 921 | xfs_rtcheck_bit( | ||
| 922 | xfs_mount_t *mp, /* file system mount structure */ | ||
| 923 | xfs_trans_t *tp, /* transaction pointer */ | ||
| 924 | xfs_rtblock_t start, /* bit (block) to check */ | ||
| 925 | int val) /* 1 for free, 0 for allocated */ | ||
| 926 | { | ||
| 927 | int bit; /* bit number in the word */ | ||
| 928 | xfs_rtblock_t block; /* bitmap block number */ | ||
| 929 | xfs_buf_t *bp; /* buf for the block */ | ||
| 930 | xfs_rtword_t *bufp; /* pointer into the buffer */ | ||
| 931 | /* REFERENCED */ | ||
| 932 | int error; /* error value */ | ||
| 933 | xfs_rtword_t wdiff; /* difference between bit & expected */ | ||
| 934 | int word; /* word number in the buffer */ | ||
| 935 | xfs_rtword_t wval; /* word value from buffer */ | ||
| 936 | |||
| 937 | block = XFS_BITTOBLOCK(mp, start); | ||
| 938 | error = xfs_rtbuf_get(mp, tp, block, 0, &bp); | ||
| 939 | bufp = (xfs_rtword_t *)XFS_BUF_PTR(bp); | ||
| 940 | word = XFS_BITTOWORD(mp, start); | ||
| 941 | bit = (int)(start & (XFS_NBWORD - 1)); | ||
| 942 | wval = bufp[word]; | ||
| 943 | xfs_trans_brelse(tp, bp); | ||
| 944 | wdiff = (wval ^ -val) & ((xfs_rtword_t)1 << bit); | ||
| 945 | return !wdiff; | ||
| 946 | } | ||
| 947 | #endif /* DEBUG */ | ||
| 948 | |||
| 949 | #if 0 | ||
| 950 | /* | ||
| 951 | * Check that the given extent (block range) is free already. | ||
| 952 | */ | ||
| 953 | STATIC int /* error */ | ||
| 954 | xfs_rtcheck_free_range( | ||
| 955 | xfs_mount_t *mp, /* file system mount point */ | ||
| 956 | xfs_trans_t *tp, /* transaction pointer */ | ||
| 957 | xfs_rtblock_t bno, /* starting block number of extent */ | ||
| 958 | xfs_extlen_t len, /* length of extent */ | ||
| 959 | int *stat) /* out: 1 for free, 0 for not */ | ||
| 960 | { | ||
| 961 | xfs_rtblock_t new; /* dummy for xfs_rtcheck_range */ | ||
| 962 | |||
| 963 | return xfs_rtcheck_range(mp, tp, bno, len, 1, &new, stat); | ||
| 964 | } | ||
| 965 | #endif | ||
| 966 | |||
| 967 | /* | 916 | /* |
| 968 | * Check that the given range is either all allocated (val = 0) or | 917 | * Check that the given range is either all allocated (val = 0) or |
| 969 | * all free (val = 1). | 918 | * all free (val = 1). |
| @@ -2382,60 +2331,3 @@ xfs_rtpick_extent( | |||
| 2382 | *pick = b; | 2331 | *pick = b; |
| 2383 | return 0; | 2332 | return 0; |
| 2384 | } | 2333 | } |
| 2385 | |||
| 2386 | #ifdef DEBUG | ||
| 2387 | /* | ||
| 2388 | * Debug code: print out the value of a range in the bitmap. | ||
| 2389 | */ | ||
| 2390 | void | ||
| 2391 | xfs_rtprint_range( | ||
| 2392 | xfs_mount_t *mp, /* file system mount structure */ | ||
| 2393 | xfs_trans_t *tp, /* transaction pointer */ | ||
| 2394 | xfs_rtblock_t start, /* starting block to print */ | ||
| 2395 | xfs_extlen_t len) /* length to print */ | ||
| 2396 | { | ||
| 2397 | xfs_extlen_t i; /* block number in the extent */ | ||
| 2398 | |||
| 2399 | cmn_err(CE_DEBUG, "%Ld: ", (long long)start); | ||
| 2400 | for (i = 0; i < len; i++) | ||
| 2401 | cmn_err(CE_DEBUG, "%d", xfs_rtcheck_bit(mp, tp, start + i, 1)); | ||
| 2402 | cmn_err(CE_DEBUG, "\n"); | ||
| 2403 | } | ||
| 2404 | |||
| 2405 | /* | ||
| 2406 | * Debug code: print the summary file. | ||
| 2407 | */ | ||
| 2408 | void | ||
| 2409 | xfs_rtprint_summary( | ||
| 2410 | xfs_mount_t *mp, /* file system mount structure */ | ||
| 2411 | xfs_trans_t *tp) /* transaction pointer */ | ||
| 2412 | { | ||
| 2413 | xfs_suminfo_t c; /* summary data */ | ||
| 2414 | xfs_rtblock_t i; /* bitmap block number */ | ||
| 2415 | int l; /* summary information level */ | ||
| 2416 | int p; /* flag for printed anything */ | ||
| 2417 | xfs_fsblock_t sb; /* summary block number */ | ||
| 2418 | xfs_buf_t *sumbp; /* summary block buffer */ | ||
| 2419 | |||
| 2420 | sumbp = NULL; | ||
| 2421 | for (l = 0; l < mp->m_rsumlevels; l++) { | ||
| 2422 | for (p = 0, i = 0; i < mp->m_sb.sb_rbmblocks; i++) { | ||
| 2423 | (void)xfs_rtget_summary(mp, tp, l, i, &sumbp, &sb, &c); | ||
| 2424 | if (c) { | ||
| 2425 | if (!p) { | ||
| 2426 | cmn_err(CE_DEBUG, "%Ld-%Ld:", 1LL << l, | ||
| 2427 | XFS_RTMIN((1LL << l) + | ||
| 2428 | ((1LL << l) - 1LL), | ||
| 2429 | mp->m_sb.sb_rextents)); | ||
| 2430 | p = 1; | ||
| 2431 | } | ||
| 2432 | cmn_err(CE_DEBUG, " %Ld:%d", (long long)i, c); | ||
| 2433 | } | ||
| 2434 | } | ||
| 2435 | if (p) | ||
| 2436 | cmn_err(CE_DEBUG, "\n"); | ||
| 2437 | } | ||
| 2438 | if (sumbp) | ||
| 2439 | xfs_trans_brelse(tp, sumbp); | ||
| 2440 | } | ||
| 2441 | #endif /* DEBUG */ | ||
diff --git a/fs/xfs/xfs_rtalloc.h b/fs/xfs/xfs_rtalloc.h index 0e0b4d2ec202..799c1f871263 100644 --- a/fs/xfs/xfs_rtalloc.h +++ b/fs/xfs/xfs_rtalloc.h | |||
| @@ -134,24 +134,6 @@ xfs_rtpick_extent( | |||
| 134 | xfs_rtblock_t *pick); /* result rt extent */ | 134 | xfs_rtblock_t *pick); /* result rt extent */ |
| 135 | 135 | ||
| 136 | /* | 136 | /* |
| 137 | * Debug code: print out the value of a range in the bitmap. | ||
| 138 | */ | ||
| 139 | void | ||
| 140 | xfs_rtprint_range( | ||
| 141 | struct xfs_mount *mp, /* file system mount structure */ | ||
| 142 | struct xfs_trans *tp, /* transaction pointer */ | ||
| 143 | xfs_rtblock_t start, /* starting block to print */ | ||
| 144 | xfs_extlen_t len); /* length to print */ | ||
| 145 | |||
| 146 | /* | ||
| 147 | * Debug code: print the summary file. | ||
| 148 | */ | ||
| 149 | void | ||
| 150 | xfs_rtprint_summary( | ||
| 151 | struct xfs_mount *mp, /* file system mount structure */ | ||
| 152 | struct xfs_trans *tp); /* transaction pointer */ | ||
| 153 | |||
| 154 | /* | ||
| 155 | * Grow the realtime area of the filesystem. | 137 | * Grow the realtime area of the filesystem. |
| 156 | */ | 138 | */ |
| 157 | int | 139 | int |
diff --git a/fs/xfs/xfs_rw.c b/fs/xfs/xfs_rw.c index defb2febaaf5..1ea7c0ca6ae0 100644 --- a/fs/xfs/xfs_rw.c +++ b/fs/xfs/xfs_rw.c | |||
| @@ -42,7 +42,6 @@ | |||
| 42 | #include "xfs_attr.h" | 42 | #include "xfs_attr.h" |
| 43 | #include "xfs_bmap.h" | 43 | #include "xfs_bmap.h" |
| 44 | #include "xfs_acl.h" | 44 | #include "xfs_acl.h" |
| 45 | #include "xfs_mac.h" | ||
| 46 | #include "xfs_error.h" | 45 | #include "xfs_error.h" |
| 47 | #include "xfs_buf_item.h" | 46 | #include "xfs_buf_item.h" |
| 48 | #include "xfs_rw.h" | 47 | #include "xfs_rw.h" |
diff --git a/fs/xfs/xfs_trans.c b/fs/xfs/xfs_trans.c index ee2721e0de4d..301ff9445b6f 100644 --- a/fs/xfs/xfs_trans.c +++ b/fs/xfs/xfs_trans.c | |||
| @@ -339,7 +339,7 @@ xfs_trans_reserve( | |||
| 339 | */ | 339 | */ |
| 340 | if (blocks > 0) { | 340 | if (blocks > 0) { |
| 341 | error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, | 341 | error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, |
| 342 | -blocks, rsvd); | 342 | -((int64_t)blocks), rsvd); |
| 343 | if (error != 0) { | 343 | if (error != 0) { |
| 344 | current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); | 344 | current_restore_flags_nested(&tp->t_pflags, PF_FSTRANS); |
| 345 | return (XFS_ERROR(ENOSPC)); | 345 | return (XFS_ERROR(ENOSPC)); |
| @@ -380,7 +380,7 @@ xfs_trans_reserve( | |||
| 380 | */ | 380 | */ |
| 381 | if (rtextents > 0) { | 381 | if (rtextents > 0) { |
| 382 | error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FREXTENTS, | 382 | error = xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FREXTENTS, |
| 383 | -rtextents, rsvd); | 383 | -((int64_t)rtextents), rsvd); |
| 384 | if (error) { | 384 | if (error) { |
| 385 | error = XFS_ERROR(ENOSPC); | 385 | error = XFS_ERROR(ENOSPC); |
| 386 | goto undo_log; | 386 | goto undo_log; |
| @@ -410,7 +410,7 @@ undo_log: | |||
| 410 | undo_blocks: | 410 | undo_blocks: |
| 411 | if (blocks > 0) { | 411 | if (blocks > 0) { |
| 412 | (void) xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, | 412 | (void) xfs_mod_incore_sb(tp->t_mountp, XFS_SBS_FDBLOCKS, |
| 413 | blocks, rsvd); | 413 | (int64_t)blocks, rsvd); |
| 414 | tp->t_blk_res = 0; | 414 | tp->t_blk_res = 0; |
| 415 | } | 415 | } |
| 416 | 416 | ||
| @@ -432,7 +432,7 @@ void | |||
| 432 | xfs_trans_mod_sb( | 432 | xfs_trans_mod_sb( |
| 433 | xfs_trans_t *tp, | 433 | xfs_trans_t *tp, |
| 434 | uint field, | 434 | uint field, |
| 435 | long delta) | 435 | int64_t delta) |
| 436 | { | 436 | { |
| 437 | 437 | ||
| 438 | switch (field) { | 438 | switch (field) { |
| @@ -663,62 +663,62 @@ xfs_trans_unreserve_and_mod_sb( | |||
| 663 | if (tp->t_flags & XFS_TRANS_SB_DIRTY) { | 663 | if (tp->t_flags & XFS_TRANS_SB_DIRTY) { |
| 664 | if (tp->t_icount_delta != 0) { | 664 | if (tp->t_icount_delta != 0) { |
| 665 | msbp->msb_field = XFS_SBS_ICOUNT; | 665 | msbp->msb_field = XFS_SBS_ICOUNT; |
| 666 | msbp->msb_delta = (int)tp->t_icount_delta; | 666 | msbp->msb_delta = tp->t_icount_delta; |
| 667 | msbp++; | 667 | msbp++; |
| 668 | } | 668 | } |
| 669 | if (tp->t_ifree_delta != 0) { | 669 | if (tp->t_ifree_delta != 0) { |
| 670 | msbp->msb_field = XFS_SBS_IFREE; | 670 | msbp->msb_field = XFS_SBS_IFREE; |
| 671 | msbp->msb_delta = (int)tp->t_ifree_delta; | 671 | msbp->msb_delta = tp->t_ifree_delta; |
| 672 | msbp++; | 672 | msbp++; |
| 673 | } | 673 | } |
| 674 | if (tp->t_fdblocks_delta != 0) { | 674 | if (tp->t_fdblocks_delta != 0) { |
| 675 | msbp->msb_field = XFS_SBS_FDBLOCKS; | 675 | msbp->msb_field = XFS_SBS_FDBLOCKS; |
| 676 | msbp->msb_delta = (int)tp->t_fdblocks_delta; | 676 | msbp->msb_delta = tp->t_fdblocks_delta; |
| 677 | msbp++; | 677 | msbp++; |
| 678 | } | 678 | } |
| 679 | if (tp->t_frextents_delta != 0) { | 679 | if (tp->t_frextents_delta != 0) { |
| 680 | msbp->msb_field = XFS_SBS_FREXTENTS; | 680 | msbp->msb_field = XFS_SBS_FREXTENTS; |
| 681 | msbp->msb_delta = (int)tp->t_frextents_delta; | 681 | msbp->msb_delta = tp->t_frextents_delta; |
| 682 | msbp++; | 682 | msbp++; |
| 683 | } | 683 | } |
| 684 | if (tp->t_dblocks_delta != 0) { | 684 | if (tp->t_dblocks_delta != 0) { |
| 685 | msbp->msb_field = XFS_SBS_DBLOCKS; | 685 | msbp->msb_field = XFS_SBS_DBLOCKS; |
| 686 | msbp->msb_delta = (int)tp->t_dblocks_delta; | 686 | msbp->msb_delta = tp->t_dblocks_delta; |
| 687 | msbp++; | 687 | msbp++; |
| 688 | } | 688 | } |
| 689 | if (tp->t_agcount_delta != 0) { | 689 | if (tp->t_agcount_delta != 0) { |
| 690 | msbp->msb_field = XFS_SBS_AGCOUNT; | 690 | msbp->msb_field = XFS_SBS_AGCOUNT; |
| 691 | msbp->msb_delta = (int)tp->t_agcount_delta; | 691 | msbp->msb_delta = tp->t_agcount_delta; |
| 692 | msbp++; | 692 | msbp++; |
| 693 | } | 693 | } |
| 694 | if (tp->t_imaxpct_delta != 0) { | 694 | if (tp->t_imaxpct_delta != 0) { |
| 695 | msbp->msb_field = XFS_SBS_IMAX_PCT; | 695 | msbp->msb_field = XFS_SBS_IMAX_PCT; |
| 696 | msbp->msb_delta = (int)tp->t_imaxpct_delta; | 696 | msbp->msb_delta = tp->t_imaxpct_delta; |
| 697 | msbp++; | 697 | msbp++; |
| 698 | } | 698 | } |
| 699 | if (tp->t_rextsize_delta != 0) { | 699 | if (tp->t_rextsize_delta != 0) { |
| 700 | msbp->msb_field = XFS_SBS_REXTSIZE; | 700 | msbp->msb_field = XFS_SBS_REXTSIZE; |
| 701 | msbp->msb_delta = (int)tp->t_rextsize_delta; | 701 | msbp->msb_delta = tp->t_rextsize_delta; |
| 702 | msbp++; | 702 | msbp++; |
| 703 | } | 703 | } |
| 704 | if (tp->t_rbmblocks_delta != 0) { | 704 | if (tp->t_rbmblocks_delta != 0) { |
| 705 | msbp->msb_field = XFS_SBS_RBMBLOCKS; | 705 | msbp->msb_field = XFS_SBS_RBMBLOCKS; |
| 706 | msbp->msb_delta = (int)tp->t_rbmblocks_delta; | 706 | msbp->msb_delta = tp->t_rbmblocks_delta; |
| 707 | msbp++; | 707 | msbp++; |
| 708 | } | 708 | } |
| 709 | if (tp->t_rblocks_delta != 0) { | 709 | if (tp->t_rblocks_delta != 0) { |
| 710 | msbp->msb_field = XFS_SBS_RBLOCKS; | 710 | msbp->msb_field = XFS_SBS_RBLOCKS; |
| 711 | msbp->msb_delta = (int)tp->t_rblocks_delta; | 711 | msbp->msb_delta = tp->t_rblocks_delta; |
| 712 | msbp++; | 712 | msbp++; |
| 713 | } | 713 | } |
| 714 | if (tp->t_rextents_delta != 0) { | 714 | if (tp->t_rextents_delta != 0) { |
| 715 | msbp->msb_field = XFS_SBS_REXTENTS; | 715 | msbp->msb_field = XFS_SBS_REXTENTS; |
| 716 | msbp->msb_delta = (int)tp->t_rextents_delta; | 716 | msbp->msb_delta = tp->t_rextents_delta; |
| 717 | msbp++; | 717 | msbp++; |
| 718 | } | 718 | } |
| 719 | if (tp->t_rextslog_delta != 0) { | 719 | if (tp->t_rextslog_delta != 0) { |
| 720 | msbp->msb_field = XFS_SBS_REXTSLOG; | 720 | msbp->msb_field = XFS_SBS_REXTSLOG; |
| 721 | msbp->msb_delta = (int)tp->t_rextslog_delta; | 721 | msbp->msb_delta = tp->t_rextslog_delta; |
| 722 | msbp++; | 722 | msbp++; |
| 723 | } | 723 | } |
| 724 | } | 724 | } |
diff --git a/fs/xfs/xfs_trans.h b/fs/xfs/xfs_trans.h index c68e00105d23..f1d7ab236726 100644 --- a/fs/xfs/xfs_trans.h +++ b/fs/xfs/xfs_trans.h | |||
| @@ -39,13 +39,9 @@ typedef struct xfs_trans_header { | |||
| 39 | /* | 39 | /* |
| 40 | * Log item types. | 40 | * Log item types. |
| 41 | */ | 41 | */ |
| 42 | #define XFS_LI_5_3_BUF 0x1234 /* v1 bufs, 1-block inode buffers */ | ||
| 43 | #define XFS_LI_5_3_INODE 0x1235 /* 1-block inode buffers */ | ||
| 44 | #define XFS_LI_EFI 0x1236 | 42 | #define XFS_LI_EFI 0x1236 |
| 45 | #define XFS_LI_EFD 0x1237 | 43 | #define XFS_LI_EFD 0x1237 |
| 46 | #define XFS_LI_IUNLINK 0x1238 | 44 | #define XFS_LI_IUNLINK 0x1238 |
| 47 | #define XFS_LI_6_1_INODE 0x1239 /* 4K non-aligned inode bufs */ | ||
| 48 | #define XFS_LI_6_1_BUF 0x123a /* v1, 4K inode buffers */ | ||
| 49 | #define XFS_LI_INODE 0x123b /* aligned ino chunks, var-size ibufs */ | 45 | #define XFS_LI_INODE 0x123b /* aligned ino chunks, var-size ibufs */ |
| 50 | #define XFS_LI_BUF 0x123c /* v2 bufs, variable sized inode bufs */ | 46 | #define XFS_LI_BUF 0x123c /* v2 bufs, variable sized inode bufs */ |
| 51 | #define XFS_LI_DQUOT 0x123d | 47 | #define XFS_LI_DQUOT 0x123d |
| @@ -354,25 +350,25 @@ typedef struct xfs_trans { | |||
| 354 | xfs_trans_callback_t t_callback; /* transaction callback */ | 350 | xfs_trans_callback_t t_callback; /* transaction callback */ |
| 355 | void *t_callarg; /* callback arg */ | 351 | void *t_callarg; /* callback arg */ |
| 356 | unsigned int t_flags; /* misc flags */ | 352 | unsigned int t_flags; /* misc flags */ |
| 357 | long t_icount_delta; /* superblock icount change */ | 353 | int64_t t_icount_delta; /* superblock icount change */ |
| 358 | long t_ifree_delta; /* superblock ifree change */ | 354 | int64_t t_ifree_delta; /* superblock ifree change */ |
| 359 | long t_fdblocks_delta; /* superblock fdblocks chg */ | 355 | int64_t t_fdblocks_delta; /* superblock fdblocks chg */ |
| 360 | long t_res_fdblocks_delta; /* on-disk only chg */ | 356 | int64_t t_res_fdblocks_delta; /* on-disk only chg */ |
| 361 | long t_frextents_delta;/* superblock freextents chg*/ | 357 | int64_t t_frextents_delta;/* superblock freextents chg*/ |
| 362 | long t_res_frextents_delta; /* on-disk only chg */ | 358 | int64_t t_res_frextents_delta; /* on-disk only chg */ |
| 363 | #ifdef DEBUG | 359 | #ifdef DEBUG |
| 364 | long t_ag_freeblks_delta; /* debugging counter */ | 360 | int64_t t_ag_freeblks_delta; /* debugging counter */ |
| 365 | long t_ag_flist_delta; /* debugging counter */ | 361 | int64_t t_ag_flist_delta; /* debugging counter */ |
| 366 | long t_ag_btree_delta; /* debugging counter */ | 362 | int64_t t_ag_btree_delta; /* debugging counter */ |
| 367 | #endif | 363 | #endif |
| 368 | long t_dblocks_delta;/* superblock dblocks change */ | 364 | int64_t t_dblocks_delta;/* superblock dblocks change */ |
| 369 | long t_agcount_delta;/* superblock agcount change */ | 365 | int64_t t_agcount_delta;/* superblock agcount change */ |
| 370 | long t_imaxpct_delta;/* superblock imaxpct change */ | 366 | int64_t t_imaxpct_delta;/* superblock imaxpct change */ |
| 371 | long t_rextsize_delta;/* superblock rextsize chg */ | 367 | int64_t t_rextsize_delta;/* superblock rextsize chg */ |
| 372 | long t_rbmblocks_delta;/* superblock rbmblocks chg */ | 368 | int64_t t_rbmblocks_delta;/* superblock rbmblocks chg */ |
| 373 | long t_rblocks_delta;/* superblock rblocks change */ | 369 | int64_t t_rblocks_delta;/* superblock rblocks change */ |
| 374 | long t_rextents_delta;/* superblocks rextents chg */ | 370 | int64_t t_rextents_delta;/* superblocks rextents chg */ |
| 375 | long t_rextslog_delta;/* superblocks rextslog chg */ | 371 | int64_t t_rextslog_delta;/* superblocks rextslog chg */ |
| 376 | unsigned int t_items_free; /* log item descs free */ | 372 | unsigned int t_items_free; /* log item descs free */ |
| 377 | xfs_log_item_chunk_t t_items; /* first log item desc chunk */ | 373 | xfs_log_item_chunk_t t_items; /* first log item desc chunk */ |
| 378 | xfs_trans_header_t t_header; /* header for in-log trans */ | 374 | xfs_trans_header_t t_header; /* header for in-log trans */ |
| @@ -936,9 +932,9 @@ typedef struct xfs_trans { | |||
| 936 | #define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) | 932 | #define xfs_trans_set_sync(tp) ((tp)->t_flags |= XFS_TRANS_SYNC) |
| 937 | 933 | ||
| 938 | #ifdef DEBUG | 934 | #ifdef DEBUG |
| 939 | #define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (long)d) | 935 | #define xfs_trans_agblocks_delta(tp, d) ((tp)->t_ag_freeblks_delta += (int64_t)d) |
| 940 | #define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (long)d) | 936 | #define xfs_trans_agflist_delta(tp, d) ((tp)->t_ag_flist_delta += (int64_t)d) |
| 941 | #define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (long)d) | 937 | #define xfs_trans_agbtree_delta(tp, d) ((tp)->t_ag_btree_delta += (int64_t)d) |
| 942 | #else | 938 | #else |
| 943 | #define xfs_trans_agblocks_delta(tp, d) | 939 | #define xfs_trans_agblocks_delta(tp, d) |
| 944 | #define xfs_trans_agflist_delta(tp, d) | 940 | #define xfs_trans_agflist_delta(tp, d) |
| @@ -954,7 +950,7 @@ xfs_trans_t *_xfs_trans_alloc(struct xfs_mount *, uint); | |||
| 954 | xfs_trans_t *xfs_trans_dup(xfs_trans_t *); | 950 | xfs_trans_t *xfs_trans_dup(xfs_trans_t *); |
| 955 | int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint, | 951 | int xfs_trans_reserve(xfs_trans_t *, uint, uint, uint, |
| 956 | uint, uint); | 952 | uint, uint); |
| 957 | void xfs_trans_mod_sb(xfs_trans_t *, uint, long); | 953 | void xfs_trans_mod_sb(xfs_trans_t *, uint, int64_t); |
| 958 | struct xfs_buf *xfs_trans_get_buf(xfs_trans_t *, struct xfs_buftarg *, xfs_daddr_t, | 954 | struct xfs_buf *xfs_trans_get_buf(xfs_trans_t *, struct xfs_buftarg *, xfs_daddr_t, |
| 959 | int, uint); | 955 | int, uint); |
| 960 | int xfs_trans_read_buf(struct xfs_mount *, xfs_trans_t *, | 956 | int xfs_trans_read_buf(struct xfs_mount *, xfs_trans_t *, |
diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c index fc39b166d403..ceb4f6e99960 100644 --- a/fs/xfs/xfs_trans_ail.c +++ b/fs/xfs/xfs_trans_ail.c | |||
| @@ -90,7 +90,7 @@ xfs_trans_push_ail( | |||
| 90 | int flush_log; | 90 | int flush_log; |
| 91 | SPLDECL(s); | 91 | SPLDECL(s); |
| 92 | 92 | ||
| 93 | #define XFS_TRANS_PUSH_AIL_RESTARTS 10 | 93 | #define XFS_TRANS_PUSH_AIL_RESTARTS 1000 |
| 94 | 94 | ||
| 95 | AIL_LOCK(mp,s); | 95 | AIL_LOCK(mp,s); |
| 96 | lip = xfs_trans_first_ail(mp, &gen); | 96 | lip = xfs_trans_first_ail(mp, &gen); |
diff --git a/fs/xfs/xfs_vfsops.c b/fs/xfs/xfs_vfsops.c index 62336a4cc5a4..29f72f613782 100644 --- a/fs/xfs/xfs_vfsops.c +++ b/fs/xfs/xfs_vfsops.c | |||
| @@ -640,7 +640,7 @@ xfs_quiesce_fs( | |||
| 640 | * we can write the unmount record. | 640 | * we can write the unmount record. |
| 641 | */ | 641 | */ |
| 642 | do { | 642 | do { |
| 643 | xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, 0, NULL); | 643 | xfs_syncsub(mp, SYNC_REMOUNT|SYNC_ATTR|SYNC_WAIT, NULL); |
| 644 | pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); | 644 | pincount = xfs_flush_buftarg(mp->m_ddev_targp, 1); |
| 645 | if (!pincount) { | 645 | if (!pincount) { |
| 646 | delay(50); | 646 | delay(50); |
| @@ -806,7 +806,7 @@ xfs_statvfs( | |||
| 806 | 806 | ||
| 807 | statp->f_type = XFS_SB_MAGIC; | 807 | statp->f_type = XFS_SB_MAGIC; |
| 808 | 808 | ||
| 809 | xfs_icsb_sync_counters_lazy(mp); | 809 | xfs_icsb_sync_counters_flags(mp, XFS_ICSB_LAZY_COUNT); |
| 810 | s = XFS_SB_LOCK(mp); | 810 | s = XFS_SB_LOCK(mp); |
| 811 | statp->f_bsize = sbp->sb_blocksize; | 811 | statp->f_bsize = sbp->sb_blocksize; |
| 812 | lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; | 812 | lsize = sbp->sb_logstart ? sbp->sb_logblocks : 0; |
| @@ -872,6 +872,10 @@ xfs_statvfs( | |||
| 872 | * this by simply making sure the log gets flushed | 872 | * this by simply making sure the log gets flushed |
| 873 | * if SYNC_BDFLUSH is set, and by actually writing it | 873 | * if SYNC_BDFLUSH is set, and by actually writing it |
| 874 | * out otherwise. | 874 | * out otherwise. |
| 875 | * SYNC_IOWAIT - The caller wants us to wait for all data I/O to complete | ||
| 876 | * before we return (including direct I/O). Forms the drain | ||
| 877 | * side of the write barrier needed to safely quiesce the | ||
| 878 | * filesystem. | ||
| 875 | * | 879 | * |
| 876 | */ | 880 | */ |
| 877 | /*ARGSUSED*/ | 881 | /*ARGSUSED*/ |
| @@ -883,27 +887,20 @@ xfs_sync( | |||
| 883 | { | 887 | { |
| 884 | xfs_mount_t *mp = XFS_BHVTOM(bdp); | 888 | xfs_mount_t *mp = XFS_BHVTOM(bdp); |
| 885 | 889 | ||
| 886 | if (unlikely(flags == SYNC_QUIESCE)) | 890 | return xfs_syncsub(mp, flags, NULL); |
| 887 | return xfs_quiesce_fs(mp); | ||
| 888 | else | ||
| 889 | return xfs_syncsub(mp, flags, 0, NULL); | ||
| 890 | } | 891 | } |
| 891 | 892 | ||
| 892 | /* | 893 | /* |
| 893 | * xfs sync routine for internal use | 894 | * xfs sync routine for internal use |
| 894 | * | 895 | * |
| 895 | * This routine supports all of the flags defined for the generic vfs_sync | 896 | * This routine supports all of the flags defined for the generic vfs_sync |
| 896 | * interface as explained above under xfs_sync. In the interests of not | 897 | * interface as explained above under xfs_sync. |
| 897 | * changing interfaces within the 6.5 family, additional internally- | ||
| 898 | * required functions are specified within a separate xflags parameter, | ||
| 899 | * only available by calling this routine. | ||
| 900 | * | 898 | * |
| 901 | */ | 899 | */ |
| 902 | int | 900 | int |
| 903 | xfs_sync_inodes( | 901 | xfs_sync_inodes( |
| 904 | xfs_mount_t *mp, | 902 | xfs_mount_t *mp, |
| 905 | int flags, | 903 | int flags, |
| 906 | int xflags, | ||
| 907 | int *bypassed) | 904 | int *bypassed) |
| 908 | { | 905 | { |
| 909 | xfs_inode_t *ip = NULL; | 906 | xfs_inode_t *ip = NULL; |
| @@ -1176,6 +1173,13 @@ xfs_sync_inodes( | |||
| 1176 | } | 1173 | } |
| 1177 | 1174 | ||
| 1178 | } | 1175 | } |
| 1176 | /* | ||
| 1177 | * When freezing, we need to wait ensure all I/O (including direct | ||
| 1178 | * I/O) is complete to ensure no further data modification can take | ||
| 1179 | * place after this point | ||
| 1180 | */ | ||
| 1181 | if (flags & SYNC_IOWAIT) | ||
| 1182 | vn_iowait(vp); | ||
| 1179 | 1183 | ||
| 1180 | if (flags & SYNC_BDFLUSH) { | 1184 | if (flags & SYNC_BDFLUSH) { |
| 1181 | if ((flags & SYNC_ATTR) && | 1185 | if ((flags & SYNC_ATTR) && |
| @@ -1412,17 +1416,13 @@ xfs_sync_inodes( | |||
| 1412 | * xfs sync routine for internal use | 1416 | * xfs sync routine for internal use |
| 1413 | * | 1417 | * |
| 1414 | * This routine supports all of the flags defined for the generic vfs_sync | 1418 | * This routine supports all of the flags defined for the generic vfs_sync |
| 1415 | * interface as explained above under xfs_sync. In the interests of not | 1419 | * interface as explained above under xfs_sync. |
| 1416 | * changing interfaces within the 6.5 family, additional internally- | ||
| 1417 | * required functions are specified within a separate xflags parameter, | ||
| 1418 | * only available by calling this routine. | ||
| 1419 | * | 1420 | * |
| 1420 | */ | 1421 | */ |
| 1421 | int | 1422 | int |
| 1422 | xfs_syncsub( | 1423 | xfs_syncsub( |
| 1423 | xfs_mount_t *mp, | 1424 | xfs_mount_t *mp, |
| 1424 | int flags, | 1425 | int flags, |
| 1425 | int xflags, | ||
| 1426 | int *bypassed) | 1426 | int *bypassed) |
| 1427 | { | 1427 | { |
| 1428 | int error = 0; | 1428 | int error = 0; |
| @@ -1444,7 +1444,7 @@ xfs_syncsub( | |||
| 1444 | if (flags & SYNC_BDFLUSH) | 1444 | if (flags & SYNC_BDFLUSH) |
| 1445 | xfs_finish_reclaim_all(mp, 1); | 1445 | xfs_finish_reclaim_all(mp, 1); |
| 1446 | else | 1446 | else |
| 1447 | error = xfs_sync_inodes(mp, flags, xflags, bypassed); | 1447 | error = xfs_sync_inodes(mp, flags, bypassed); |
| 1448 | } | 1448 | } |
| 1449 | 1449 | ||
| 1450 | /* | 1450 | /* |
| @@ -1958,15 +1958,26 @@ xfs_showargs( | |||
| 1958 | return 0; | 1958 | return 0; |
| 1959 | } | 1959 | } |
| 1960 | 1960 | ||
| 1961 | /* | ||
| 1962 | * Second stage of a freeze. The data is already frozen, now we have to take | ||
| 1963 | * care of the metadata. New transactions are already blocked, so we need to | ||
| 1964 | * wait for any remaining transactions to drain out before proceding. | ||
| 1965 | */ | ||
| 1961 | STATIC void | 1966 | STATIC void |
| 1962 | xfs_freeze( | 1967 | xfs_freeze( |
| 1963 | bhv_desc_t *bdp) | 1968 | bhv_desc_t *bdp) |
| 1964 | { | 1969 | { |
| 1965 | xfs_mount_t *mp = XFS_BHVTOM(bdp); | 1970 | xfs_mount_t *mp = XFS_BHVTOM(bdp); |
| 1966 | 1971 | ||
| 1972 | /* wait for all modifications to complete */ | ||
| 1967 | while (atomic_read(&mp->m_active_trans) > 0) | 1973 | while (atomic_read(&mp->m_active_trans) > 0) |
| 1968 | delay(100); | 1974 | delay(100); |
| 1969 | 1975 | ||
| 1976 | /* flush inodes and push all remaining buffers out to disk */ | ||
| 1977 | xfs_quiesce_fs(mp); | ||
| 1978 | |||
| 1979 | ASSERT_ALWAYS(atomic_read(&mp->m_active_trans) == 0); | ||
| 1980 | |||
| 1970 | /* Push the superblock and write an unmount record */ | 1981 | /* Push the superblock and write an unmount record */ |
| 1971 | xfs_log_unmount_write(mp); | 1982 | xfs_log_unmount_write(mp); |
| 1972 | xfs_unmountfs_writesb(mp); | 1983 | xfs_unmountfs_writesb(mp); |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index bda774a04b8f..52c41714ec54 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
| @@ -51,7 +51,6 @@ | |||
| 51 | #include "xfs_refcache.h" | 51 | #include "xfs_refcache.h" |
| 52 | #include "xfs_trans_space.h" | 52 | #include "xfs_trans_space.h" |
| 53 | #include "xfs_log_priv.h" | 53 | #include "xfs_log_priv.h" |
| 54 | #include "xfs_mac.h" | ||
| 55 | 54 | ||
| 56 | STATIC int | 55 | STATIC int |
| 57 | xfs_open( | 56 | xfs_open( |
| @@ -1381,7 +1380,7 @@ xfs_inactive_symlink_rmt( | |||
| 1381 | /* | 1380 | /* |
| 1382 | * Commit the first transaction. This logs the EFI and the inode. | 1381 | * Commit the first transaction. This logs the EFI and the inode. |
| 1383 | */ | 1382 | */ |
| 1384 | if ((error = xfs_bmap_finish(&tp, &free_list, first_block, &committed))) | 1383 | if ((error = xfs_bmap_finish(&tp, &free_list, &committed))) |
| 1385 | goto error1; | 1384 | goto error1; |
| 1386 | /* | 1385 | /* |
| 1387 | * The transaction must have been committed, since there were | 1386 | * The transaction must have been committed, since there were |
| @@ -1790,8 +1789,7 @@ xfs_inactive( | |||
| 1790 | * Just ignore errors at this point. There is | 1789 | * Just ignore errors at this point. There is |
| 1791 | * nothing we can do except to try to keep going. | 1790 | * nothing we can do except to try to keep going. |
| 1792 | */ | 1791 | */ |
| 1793 | (void) xfs_bmap_finish(&tp, &free_list, first_block, | 1792 | (void) xfs_bmap_finish(&tp, &free_list, &committed); |
| 1794 | &committed); | ||
| 1795 | (void) xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL); | 1793 | (void) xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES, NULL); |
| 1796 | } | 1794 | } |
| 1797 | /* | 1795 | /* |
| @@ -2022,7 +2020,7 @@ xfs_create( | |||
| 2022 | IHOLD(ip); | 2020 | IHOLD(ip); |
| 2023 | vp = XFS_ITOV(ip); | 2021 | vp = XFS_ITOV(ip); |
| 2024 | 2022 | ||
| 2025 | error = xfs_bmap_finish(&tp, &free_list, first_block, &committed); | 2023 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 2026 | if (error) { | 2024 | if (error) { |
| 2027 | xfs_bmap_cancel(&free_list); | 2025 | xfs_bmap_cancel(&free_list); |
| 2028 | goto abort_rele; | 2026 | goto abort_rele; |
| @@ -2507,7 +2505,7 @@ xfs_remove( | |||
| 2507 | xfs_trans_set_sync(tp); | 2505 | xfs_trans_set_sync(tp); |
| 2508 | } | 2506 | } |
| 2509 | 2507 | ||
| 2510 | error = xfs_bmap_finish(&tp, &free_list, first_block, &committed); | 2508 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 2511 | if (error) { | 2509 | if (error) { |
| 2512 | REMOVE_DEBUG_TRACE(__LINE__); | 2510 | REMOVE_DEBUG_TRACE(__LINE__); |
| 2513 | goto error_rele; | 2511 | goto error_rele; |
| @@ -2715,7 +2713,7 @@ xfs_link( | |||
| 2715 | xfs_trans_set_sync(tp); | 2713 | xfs_trans_set_sync(tp); |
| 2716 | } | 2714 | } |
| 2717 | 2715 | ||
| 2718 | error = xfs_bmap_finish (&tp, &free_list, first_block, &committed); | 2716 | error = xfs_bmap_finish (&tp, &free_list, &committed); |
| 2719 | if (error) { | 2717 | if (error) { |
| 2720 | xfs_bmap_cancel(&free_list); | 2718 | xfs_bmap_cancel(&free_list); |
| 2721 | goto abort_return; | 2719 | goto abort_return; |
| @@ -2932,7 +2930,7 @@ xfs_mkdir( | |||
| 2932 | xfs_trans_set_sync(tp); | 2930 | xfs_trans_set_sync(tp); |
| 2933 | } | 2931 | } |
| 2934 | 2932 | ||
| 2935 | error = xfs_bmap_finish(&tp, &free_list, first_block, &committed); | 2933 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 2936 | if (error) { | 2934 | if (error) { |
| 2937 | IRELE(cdp); | 2935 | IRELE(cdp); |
| 2938 | goto error2; | 2936 | goto error2; |
| @@ -3183,7 +3181,7 @@ xfs_rmdir( | |||
| 3183 | xfs_trans_set_sync(tp); | 3181 | xfs_trans_set_sync(tp); |
| 3184 | } | 3182 | } |
| 3185 | 3183 | ||
| 3186 | error = xfs_bmap_finish (&tp, &free_list, first_block, &committed); | 3184 | error = xfs_bmap_finish (&tp, &free_list, &committed); |
| 3187 | if (error) { | 3185 | if (error) { |
| 3188 | xfs_bmap_cancel(&free_list); | 3186 | xfs_bmap_cancel(&free_list); |
| 3189 | xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | | 3187 | xfs_trans_cancel(tp, (XFS_TRANS_RELEASE_LOG_RES | |
| @@ -3533,7 +3531,7 @@ xfs_symlink( | |||
| 3533 | */ | 3531 | */ |
| 3534 | IHOLD(ip); | 3532 | IHOLD(ip); |
| 3535 | 3533 | ||
| 3536 | error = xfs_bmap_finish(&tp, &free_list, first_block, &committed); | 3534 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 3537 | if (error) { | 3535 | if (error) { |
| 3538 | goto error2; | 3536 | goto error2; |
| 3539 | } | 3537 | } |
| @@ -4145,7 +4143,7 @@ retry: | |||
| 4145 | /* | 4143 | /* |
| 4146 | * Complete the transaction | 4144 | * Complete the transaction |
| 4147 | */ | 4145 | */ |
| 4148 | error = xfs_bmap_finish(&tp, &free_list, firstfsb, &committed); | 4146 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 4149 | if (error) { | 4147 | if (error) { |
| 4150 | goto error0; | 4148 | goto error0; |
| 4151 | } | 4149 | } |
| @@ -4452,7 +4450,7 @@ xfs_free_file_space( | |||
| 4452 | /* | 4450 | /* |
| 4453 | * complete the transaction | 4451 | * complete the transaction |
| 4454 | */ | 4452 | */ |
| 4455 | error = xfs_bmap_finish(&tp, &free_list, firstfsb, &committed); | 4453 | error = xfs_bmap_finish(&tp, &free_list, &committed); |
| 4456 | if (error) { | 4454 | if (error) { |
| 4457 | goto error0; | 4455 | goto error0; |
| 4458 | } | 4456 | } |
