---- linux-2.6.33/scripts/mod/modpost.c~ 2010-02-24 19:52:17.000000000 +0100
-+++ linux-2.6.33/scripts/mod/modpost.c 2010-03-07 14:26:47.242168558 +0100
-@@ -15,7 +15,8 @@
- #include <stdio.h>
- #include <ctype.h>
- #include "modpost.h"
--#include "../../include/generated/autoconf.h"
-+// PLD architectures don't use CONFIG_SYMBOL_PREFIX
-+//#include "../../include/generated/autoconf.h"
- #include "../../include/linux/license.h"
-
- /* Some toolchains use a `_' prefix for all user symbols. */
-
---- linux-3.0/scripts/kconfig/lxdialog/check-lxdialog.sh~ 2011-07-22 04:17:23.000000000 +0200
-+++ linux-3.0/scripts/kconfig/lxdialog/check-lxdialog.sh 2011-08-25 21:26:04.799150642 +0200
-@@ -9,6 +9,12 @@
- $cc -print-file-name=lib${lib}.${ext} | grep -q /
- if [ $? -eq 0 ]; then
- echo "-l${lib}"
-+ for libt in tinfow tinfo ; do
-+ $cc -print-file-name=lib${libt}.${ext} | grep -q /
-+ if [ $? -eq 0 ]; then
-+ echo "-l${libt}"
-+ fi
-+ done
- exit
- fi
- done
-
-diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
-index 7a0c800..ec5ebbb 100644
---- a/drivers/net/ethernet/realtek/r8169.c
-+++ b/drivers/net/ethernet/realtek/r8169.c
-@@ -6927,6 +6927,14 @@ rtl_init_one(struct pci_dev *pdev, const
- for (i = 0; i < ETH_ALEN; i++)
- dev->dev_addr[i] = RTL_R8(MAC0 + i);
-
-+ if (!is_valid_ether_addr(dev->dev_addr)) {
-+ /* Report it and use a random ethernet address instead */
-+ netdev_err(dev, "Invalid MAC address: %pM\n", dev->dev_addr);
-+ random_ether_addr(dev->dev_addr);
-+ netdev_info(dev, "Using random MAC address: %pM\n",
-+ dev->dev_addr);
-+ }
-+
- SET_ETHTOOL_OPS(dev, &rtl8169_ethtool_ops);
- dev->watchdog_timeo = RTL8169_TX_TIMEOUT;
-
-commit 110dc24ad2ae4e9b94b08632fe1eb2fcdff83045
-Author: Dave Chinner <dchinner@redhat.com>
-Date: Tue May 20 08:18:09 2014 +1000
-
- xfs: log vector rounding leaks log space
-
- The addition of direct formatting of log items into the CIL
- linear buffer added alignment restrictions that the start of each
- vector needed to be 64 bit aligned. Hence padding was added in
- xlog_finish_iovec() to round up the vector length to ensure the next
- vector started with the correct alignment.
-
- This adds a small number of bytes to the size of
- the linear buffer that is otherwise unused. The issue is that we
- then use the linear buffer size to determine the log space used by
- the log item, and this includes the unused space. Hence when we
- account for space used by the log item, it's more than is actually
- written into the iclogs, and hence we slowly leak this space.
-
- This results on log hangs when reserving space, with threads getting
- stuck with these stack traces:
-
- Call Trace:
- [<ffffffff81d15989>] schedule+0x29/0x70
- [<ffffffff8150d3a2>] xlog_grant_head_wait+0xa2/0x1a0
- [<ffffffff8150d55d>] xlog_grant_head_check+0xbd/0x140
- [<ffffffff8150ee33>] xfs_log_reserve+0x103/0x220
- [<ffffffff814b7f05>] xfs_trans_reserve+0x2f5/0x310
- .....
-
- The 4 bytes is significant. Brain Foster did all the hard work in
- tracking down a reproducable leak to inode chunk allocation (it went
- away with the ikeep mount option). His rough numbers were that
- creating 50,000 inodes leaked 11 log blocks. This turns out to be
- roughly 800 inode chunks or 1600 inode cluster buffers. That
- works out at roughly 4 bytes per cluster buffer logged, and at that
- I started looking for a 4 byte leak in the buffer logging code.
-
- What I found was that a struct xfs_buf_log_format structure for an
- inode cluster buffer is 28 bytes in length. This gets rounded up to
- 32 bytes, but the vector length remains 28 bytes. Hence the CIL
- ticket reservation is decremented by 32 bytes (via lv->lv_buf_len)
- for that vector rather than 28 bytes which are written into the log.
-
- The fix for this problem is to separately track the bytes used by
- the log vectors in the item and use that instead of the buffer
- length when accounting for the log space that will be used by the
- formatted log item.
-
- Again, thanks to Brian Foster for doing all the hard work and long
- hours to isolate this leak and make finding the bug relatively
- simple.
-
- Signed-off-by: Dave Chinner <dchinner@redhat.com>
- Reviewed-by: Christoph Hellwig <hch@lst.de>
- Reviewed-by: Brian Foster <bfoster@redhat.com>
- Signed-off-by: Dave Chinner <david@fromorbit.com>
-
-diff --git a/fs/xfs/xfs_log.h b/fs/xfs/xfs_log.h
-index 2c40044..84e0deb 100644
---- a/fs/xfs/xfs_log.h
-+++ b/fs/xfs/xfs_log.h
-@@ -24,7 +24,8 @@ struct xfs_log_vec {
- struct xfs_log_iovec *lv_iovecp; /* iovec array */
- struct xfs_log_item *lv_item; /* owner */
- char *lv_buf; /* formatted buffer */
-- int lv_buf_len; /* size of formatted buffer */
-+ int lv_bytes; /* accounted space in buffer */
-+ int lv_buf_len; /* aligned size of buffer */
- int lv_size; /* size of allocated lv */
- };
-
-@@ -52,15 +53,21 @@ xlog_prepare_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec **vecp,
- return vec->i_addr;
- }
-
-+/*
-+ * We need to make sure the next buffer is naturally aligned for the biggest
-+ * basic data type we put into it. We already accounted for this padding when
-+ * sizing the buffer.
-+ *
-+ * However, this padding does not get written into the log, and hence we have to
-+ * track the space used by the log vectors separately to prevent log space hangs
-+ * due to inaccurate accounting (i.e. a leak) of the used log space through the
-+ * CIL context ticket.
-+ */
- static inline void
- xlog_finish_iovec(struct xfs_log_vec *lv, struct xfs_log_iovec *vec, int len)
- {
-- /*
-- * We need to make sure the next buffer is naturally aligned for the
-- * biggest basic data type we put into it. We already accounted for
-- * this when sizing the buffer.
-- */
- lv->lv_buf_len += round_up(len, sizeof(uint64_t));
-+ lv->lv_bytes += len;
- vec->i_len = len;
- }
-
-diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c
-index 7e54553..de835da 100644
---- a/fs/xfs/xfs_log_cil.c
-+++ b/fs/xfs/xfs_log_cil.c
-@@ -97,7 +97,7 @@ xfs_cil_prepare_item(
- {
- /* Account for the new LV being passed in */
- if (lv->lv_buf_len != XFS_LOG_VEC_ORDERED) {
-- *diff_len += lv->lv_buf_len;
-+ *diff_len += lv->lv_bytes;
- *diff_iovecs += lv->lv_niovecs;
- }
-
-@@ -111,7 +111,7 @@ xfs_cil_prepare_item(
- else if (old_lv != lv) {
- ASSERT(lv->lv_buf_len != XFS_LOG_VEC_ORDERED);
-
-- *diff_len -= old_lv->lv_buf_len;
-+ *diff_len -= old_lv->lv_bytes;
- *diff_iovecs -= old_lv->lv_niovecs;
- kmem_free(old_lv);
- }
-@@ -239,7 +239,7 @@ xlog_cil_insert_format_items(
- * that the space reservation accounting is correct.
- */
- *diff_iovecs -= lv->lv_niovecs;
-- *diff_len -= lv->lv_buf_len;
-+ *diff_len -= lv->lv_bytes;
- } else {
- /* allocate new data chunk */
- lv = kmem_zalloc(buf_size, KM_SLEEP|KM_NOFS);
-@@ -259,6 +259,7 @@ xlog_cil_insert_format_items(
-
- /* The allocated data region lies beyond the iovec region */
- lv->lv_buf_len = 0;
-+ lv->lv_bytes = 0;
- lv->lv_buf = (char *)lv + buf_size - nbytes;
- ASSERT(IS_ALIGNED((unsigned long)lv->lv_buf, sizeof(uint64_t)));
-
+Move setting up operation and write hint to xfs_alloc_ioend, and\r
+then just copy over all needed information from the previous bio\r
+in xfs_chain_bio and stop passing various parameters to it.\r
+\r
+Signed-off-by: Christoph Hellwig <hch@lst.de>\r
+---\r
+ fs/xfs/xfs_aops.c | 35 +++++++++++++++++------------------\r
+ 1 file changed, 17 insertions(+), 18 deletions(-)\r
+\r
+diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c\r
+index a6f0f4761a37..9cceb90e77c5 100644\r
+--- a/fs/xfs/xfs_aops.c\r
++++ b/fs/xfs/xfs_aops.c\r
+@@ -665,7 +665,6 @@ xfs_submit_ioend(\r
+ \r
+ ioend->io_bio->bi_private = ioend;\r
+ ioend->io_bio->bi_end_io = xfs_end_bio;\r
+- ioend->io_bio->bi_opf = REQ_OP_WRITE | wbc_to_write_flags(wbc);\r
+ \r
+ /*\r
+ * If we are failing the IO now, just mark the ioend with an\r
+@@ -679,7 +678,6 @@ xfs_submit_ioend(\r
+ return status;\r
+ }\r
+ \r
+- ioend->io_bio->bi_write_hint = ioend->io_inode->i_write_hint;\r
+ submit_bio(ioend->io_bio);\r
+ return 0;\r
+ }\r
+@@ -691,7 +689,8 @@ xfs_alloc_ioend(\r
+ xfs_exntst_t state,\r
+ xfs_off_t offset,\r
+ struct block_device *bdev,\r
+- sector_t sector)\r
++ sector_t sector,\r
++ struct writeback_control *wbc)\r
+ {\r
+ struct xfs_ioend *ioend;\r
+ struct bio *bio;\r
+@@ -699,6 +698,8 @@ xfs_alloc_ioend(\r
+ bio = bio_alloc_bioset(GFP_NOFS, BIO_MAX_PAGES, &xfs_ioend_bioset);\r
+ bio_set_dev(bio, bdev);\r
+ bio->bi_iter.bi_sector = sector;\r
++ bio->bi_opf = REQ_OP_WRITE | wbc_to_write_flags(wbc);\r
++ bio->bi_write_hint = inode->i_write_hint;\r
+ \r
+ ioend = container_of(bio, struct xfs_ioend, io_inline_bio);\r
+ INIT_LIST_HEAD(&ioend->io_list);\r
+@@ -719,24 +720,22 @@ xfs_alloc_ioend(\r
+ * so that the bi_private linkage is set up in the right direction for the\r
+ * traversal in xfs_destroy_ioend().\r
+ */\r
+-static void\r
++static struct bio *\r
+ xfs_chain_bio(\r
+- struct xfs_ioend *ioend,\r
+- struct writeback_control *wbc,\r
+- struct block_device *bdev,\r
+- sector_t sector)\r
++ struct bio *prev)\r
+ {\r
+ struct bio *new;\r
+ \r
+ new = bio_alloc(GFP_NOFS, BIO_MAX_PAGES);\r
+- bio_set_dev(new, bdev);\r
+- new->bi_iter.bi_sector = sector;\r
+- bio_chain(ioend->io_bio, new);\r
+- bio_get(ioend->io_bio); /* for xfs_destroy_ioend */\r
+- ioend->io_bio->bi_opf = REQ_OP_WRITE | wbc_to_write_flags(wbc);\r
+- ioend->io_bio->bi_write_hint = ioend->io_inode->i_write_hint;\r
+- submit_bio(ioend->io_bio);\r
+- ioend->io_bio = new;\r
++ bio_copy_dev(new, prev);\r
++ new->bi_iter.bi_sector = bio_end_sector(prev);\r
++ new->bi_opf = prev->bi_opf;\r
++ new->bi_write_hint = prev->bi_write_hint;\r
++\r
++ bio_chain(prev, new);\r
++ bio_get(prev); /* for xfs_destroy_ioend */\r
++ submit_bio(prev);\r
++ return new;\r
+ }\r
+ \r
+ /*\r
+@@ -614,14 +614,14 @@ xfs_add_to_ioend(\r
+ if (wpc->ioend)\r
+ list_add(&wpc->ioend->io_list, iolist);\r
+ wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type, offset,\r
+- bdev, sector);\r
++ bdev, sector, wbc);\r
+ }\r
+ \r
+ if (!__bio_try_merge_page(wpc->ioend->io_bio, page, len, poff)) {\r
+ if (iop)\r
+ atomic_inc(&iop->write_count);\r
+ if (bio_full(wpc->ioend->io_bio))\r
+- xfs_chain_bio(wpc->ioend, wbc, bdev, sector);\r
++ wpc->ioend->io_bio = xfs_chain_bio(wpc->ioend->io_bio);\r
+ __bio_add_page(wpc->ioend->io_bio, page, len, poff);\r
+ }\r
+ \r
+-- \r
+2.20.1\r
+\r
+\r
+Link every newly allocated writeback bio to cgroup pointed to by the\r
+writeback control structure, and charge every byte written back to it.\r
+\r
+Tested-by: Stefan Priebe - Profihost AG <s.priebe@profihost.ag>\r
+Signed-off-by: Christoph Hellwig <hch@lst.de>\r
+---\r
+ fs/xfs/xfs_aops.c | 4 +++-\r
+ fs/xfs/xfs_super.c | 2 ++\r
+ 2 files changed, 5 insertions(+), 1 deletion(-)\r
+\r
+diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c\r
+index 9cceb90e77c5..73c291aeae17 100644\r
+--- a/fs/xfs/xfs_aops.c\r
++++ b/fs/xfs/xfs_aops.c\r
+@@ -700,6 +700,7 @@ xfs_alloc_ioend(\r
+ bio->bi_iter.bi_sector = sector;\r
+ bio->bi_opf = REQ_OP_WRITE | wbc_to_write_flags(wbc);\r
+ bio->bi_write_hint = inode->i_write_hint;\r
++ wbc_init_bio(wbc, bio);\r
+ \r
+ ioend = container_of(bio, struct xfs_ioend, io_inline_bio);\r
+ INIT_LIST_HEAD(&ioend->io_list);\r
+@@ -727,7 +728,7 @@ xfs_chain_bio(\r
+ struct bio *new;\r
+ \r
+ new = bio_alloc(GFP_NOFS, BIO_MAX_PAGES);\r
+- bio_copy_dev(new, prev);\r
++ bio_copy_dev(new, prev);/* also copies over blkcg information */\r
+ new->bi_iter.bi_sector = bio_end_sector(prev);\r
+ new->bi_opf = prev->bi_opf;\r
+ new->bi_write_hint = prev->bi_write_hint;\r
+@@ -782,6 +783,7 @@ xfs_add_to_ioend(\r
+ }\r
+ \r
+ wpc->ioend->io_size += len;\r
++ wbc_account_io(wbc, page, len);\r
+ }\r
+ \r
+ STATIC void\r
+diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c\r
+index 594c119824cc..ee0df8f611ff 100644\r
+--- a/fs/xfs/xfs_super.c\r
++++ b/fs/xfs/xfs_super.c\r
+@@ -1685,6 +1685,8 @@ xfs_fs_fill_super(\r
+ sb->s_maxbytes = xfs_max_file_offset(sb->s_blocksize_bits);\r
+ sb->s_max_links = XFS_MAXLINK;\r
+ sb->s_time_gran = 1;\r
++ sb->s_iflags |= SB_I_CGROUPWB;\r
++\r
+ set_posix_acl_flag(sb);\r
+ \r
+ /* version 5 superblocks support inode version counters. */\r
+-- \r
+2.20.1\r
+\r