linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Willy Tarreau <w@1wt.eu>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Andrew Barry <abarry@cray.com>,
	David Gibson <david@gibson.dropbear.id.au>,
	Hugh Dickins <hughd@google.com>, Mel Gorman <mgorman@suse.de>,
	Minchan Kim <minchan.kim@gmail.com>,
	Hillf Danton <dhillf@gmail.com>,
	Paul Mackerras <paulus@samba.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Willy Tarreau <w@1wt.eu>
Subject: [ 049/180] hugepages: fix use after free bug in "quota" handling
Date: Tue, 02 Oct 2012 00:52:46 +0200	[thread overview]
Message-ID: <20121001225159.689540332@1wt.eu> (raw)
In-Reply-To: <6a854f579a99b4fe2efaca1057e8ae22@local>

2.6.32-longterm review patch.  If anyone has any objections, please let me know.

------------------

From: David Gibson <david@gibson.dropbear.id.au>

commit 90481622d75715bfcb68501280a917dbfe516029 upstream

hugetlbfs_{get,put}_quota() are badly named.  They don't interact with the
general quota handling code, and they don't much resemble its behaviour.
Rather than being about maintaining limits on on-disk block usage by
particular users, they are instead about maintaining limits on in-memory
page usage (including anonymous MAP_PRIVATE copied-on-write pages)
associated with a particular hugetlbfs filesystem instance.

Worse, they work by having callbacks to the hugetlbfs filesystem code from
the low-level page handling code, in particular from free_huge_page().
This is a layering violation of itself, but more importantly, if the
kernel does a get_user_pages() on hugepages (which can happen from KVM
amongst others), then the free_huge_page() can be delayed until after the
associated inode has already been freed.  If an unmount occurs at the
wrong time, even the hugetlbfs superblock where the "quota" limits are
stored may have been freed.

Andrew Barry proposed a patch to fix this by having hugepages, instead of
storing a pointer to their address_space and reaching the superblock from
there, had the hugepages store pointers directly to the superblock,
bumping the reference count as appropriate to avoid it being freed.
Andrew Morton rejected that version, however, on the grounds that it made
the existing layering violation worse.

This is a reworked version of Andrew's patch, which removes the extra, and
some of the existing, layering violation.  It works by introducing the
concept of a hugepage "subpool" at the lower hugepage mm layer - that is a
finite logical pool of hugepages to allocate from.  hugetlbfs now creates
a subpool for each filesystem instance with a page limit set, and a
pointer to the subpool gets added to each allocated hugepage, instead of
the address_space pointer used now.  The subpool has its own lifetime and
is only freed once all pages in it _and_ all other references to it (i.e.
superblocks) are gone.

subpools are optional - a NULL subpool pointer is taken by the code to
mean that no subpool limits are in effect.

Previous discussion of this bug found in:  "Fix refcounting in hugetlbfs
quota handling.". See:  https://lkml.org/lkml/2011/8/11/28 or
http://marc.info/?l=linux-mm&m=126928970510627&w=1

v2: Fixed a bug spotted by Hillf Danton, and removed the extra parameter to
alloc_huge_page() - since it already takes the vma, it is not necessary.

Signed-off-by: Andrew Barry <abarry@cray.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Cc: Hugh Dickins <hughd@google.com>
Cc: Mel Gorman <mgorman@suse.de>
Cc: Minchan Kim <minchan.kim@gmail.com>
Cc: Hillf Danton <dhillf@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
[dannf: backported to Debian's 2.6.32]
Signed-off-by: Willy Tarreau <w@1wt.eu>
---
 fs/hugetlbfs/inode.c    |   54 +++++++-----------
 include/linux/hugetlb.h |   14 ++++--
 mm/hugetlb.c            |  135 +++++++++++++++++++++++++++++++++++++---------
 3 files changed, 139 insertions(+), 64 deletions(-)

diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 87a1258..2179de8 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -601,9 +601,15 @@ static int hugetlbfs_statfs(struct dentry *dentry, struct kstatfs *buf)
 		spin_lock(&sbinfo->stat_lock);
 		/* If no limits set, just report 0 for max/free/used
 		 * blocks, like simple_statfs() */
-		if (sbinfo->max_blocks >= 0) {
-			buf->f_blocks = sbinfo->max_blocks;
-			buf->f_bavail = buf->f_bfree = sbinfo->free_blocks;
+		if (sbinfo->spool) {
+			long free_pages;
+
+			spin_lock(&sbinfo->spool->lock);
+			buf->f_blocks = sbinfo->spool->max_hpages;
+			free_pages = sbinfo->spool->max_hpages
+				- sbinfo->spool->used_hpages;
+			buf->f_bavail = buf->f_bfree = free_pages;
+			spin_unlock(&sbinfo->spool->lock);
 			buf->f_files = sbinfo->max_inodes;
 			buf->f_ffree = sbinfo->free_inodes;
 		}
@@ -619,6 +625,10 @@ static void hugetlbfs_put_super(struct super_block *sb)
 
 	if (sbi) {
 		sb->s_fs_info = NULL;
+
+		if (sbi->spool)
+			hugepage_put_subpool(sbi->spool);
+
 		kfree(sbi);
 	}
 }
@@ -842,10 +852,14 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent)
 	sb->s_fs_info = sbinfo;
 	sbinfo->hstate = config.hstate;
 	spin_lock_init(&sbinfo->stat_lock);
-	sbinfo->max_blocks = config.nr_blocks;
-	sbinfo->free_blocks = config.nr_blocks;
 	sbinfo->max_inodes = config.nr_inodes;
 	sbinfo->free_inodes = config.nr_inodes;
+	sbinfo->spool = NULL;
+	if (config.nr_blocks != -1) {
+		sbinfo->spool = hugepage_new_subpool(config.nr_blocks);
+		if (!sbinfo->spool)
+			goto out_free;
+	}
 	sb->s_maxbytes = MAX_LFS_FILESIZE;
 	sb->s_blocksize = huge_page_size(config.hstate);
 	sb->s_blocksize_bits = huge_page_shift(config.hstate);
@@ -865,38 +879,12 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent)
 	sb->s_root = root;
 	return 0;
 out_free:
+	if (sbinfo->spool)
+		kfree(sbinfo->spool);
 	kfree(sbinfo);
 	return -ENOMEM;
 }
 
-int hugetlb_get_quota(struct address_space *mapping, long delta)
-{
-	int ret = 0;
-	struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(mapping->host->i_sb);
-
-	if (sbinfo->free_blocks > -1) {
-		spin_lock(&sbinfo->stat_lock);
-		if (sbinfo->free_blocks - delta >= 0)
-			sbinfo->free_blocks -= delta;
-		else
-			ret = -ENOMEM;
-		spin_unlock(&sbinfo->stat_lock);
-	}
-
-	return ret;
-}
-
-void hugetlb_put_quota(struct address_space *mapping, long delta)
-{
-	struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(mapping->host->i_sb);
-
-	if (sbinfo->free_blocks > -1) {
-		spin_lock(&sbinfo->stat_lock);
-		sbinfo->free_blocks += delta;
-		spin_unlock(&sbinfo->stat_lock);
-	}
-}
-
 static int hugetlbfs_get_sb(struct file_system_type *fs_type,
 	int flags, const char *dev_name, void *data, struct vfsmount *mnt)
 {
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 41a59af..6b3feef 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -12,6 +12,15 @@ struct user_struct;
 #include <linux/shm.h>
 #include <asm/tlbflush.h>
 
+struct hugepage_subpool {
+	spinlock_t lock;
+	long count;
+	long max_hpages, used_hpages;
+};
+
+struct hugepage_subpool *hugepage_new_subpool(long nr_blocks);
+void hugepage_put_subpool(struct hugepage_subpool *spool);
+
 int PageHuge(struct page *page);
 
 static inline int is_vm_hugetlb_page(struct vm_area_struct *vma)
@@ -138,12 +147,11 @@ struct hugetlbfs_config {
 };
 
 struct hugetlbfs_sb_info {
-	long	max_blocks;   /* blocks allowed */
-	long	free_blocks;  /* blocks free */
 	long	max_inodes;   /* inodes allowed */
 	long	free_inodes;  /* inodes free */
 	spinlock_t	stat_lock;
 	struct hstate *hstate;
+	struct hugepage_subpool *spool;
 };
 
 
@@ -166,8 +174,6 @@ extern const struct file_operations hugetlbfs_file_operations;
 extern const struct vm_operations_struct hugetlb_vm_ops;
 struct file *hugetlb_file_setup(const char *name, size_t size, int acct,
 				struct user_struct **user, int creat_flags);
-int hugetlb_get_quota(struct address_space *mapping, long delta);
-void hugetlb_put_quota(struct address_space *mapping, long delta);
 
 static inline int is_file_hugepages(struct file *file)
 {
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 5e1e508..20f9240 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -49,6 +49,84 @@ static unsigned long __initdata default_hstate_size;
  */
 static DEFINE_SPINLOCK(hugetlb_lock);
 
+static inline void unlock_or_release_subpool(struct hugepage_subpool *spool)
+{
+	bool free = (spool->count == 0) && (spool->used_hpages == 0);
+
+	spin_unlock(&spool->lock);
+
+	/* If no pages are used, and no other handles to the subpool
+	 * remain, free the subpool the subpool remain */
+	if (free)
+		kfree(spool);
+}
+
+struct hugepage_subpool *hugepage_new_subpool(long nr_blocks)
+{
+	struct hugepage_subpool *spool;
+
+	spool = kmalloc(sizeof(*spool), GFP_KERNEL);
+	if (!spool)
+		return NULL;
+
+	spin_lock_init(&spool->lock);
+	spool->count = 1;
+	spool->max_hpages = nr_blocks;
+	spool->used_hpages = 0;
+
+	return spool;
+}
+
+void hugepage_put_subpool(struct hugepage_subpool *spool)
+{
+	spin_lock(&spool->lock);
+	BUG_ON(!spool->count);
+	spool->count--;
+	unlock_or_release_subpool(spool);
+}
+
+static int hugepage_subpool_get_pages(struct hugepage_subpool *spool,
+				      long delta)
+{
+	int ret = 0;
+
+	if (!spool)
+		return 0;
+
+	spin_lock(&spool->lock);
+	if ((spool->used_hpages + delta) <= spool->max_hpages) {
+		spool->used_hpages += delta;
+	} else {
+		ret = -ENOMEM;
+	}
+	spin_unlock(&spool->lock);
+
+	return ret;
+}
+
+static void hugepage_subpool_put_pages(struct hugepage_subpool *spool,
+				       long delta)
+{
+	if (!spool)
+		return;
+
+	spin_lock(&spool->lock);
+	spool->used_hpages -= delta;
+	/* If hugetlbfs_put_super couldn't free spool due to
+	* an outstanding quota reference, free it now. */
+	unlock_or_release_subpool(spool);
+}
+
+static inline struct hugepage_subpool *subpool_inode(struct inode *inode)
+{
+	return HUGETLBFS_SB(inode->i_sb)->spool;
+}
+
+static inline struct hugepage_subpool *subpool_vma(struct vm_area_struct *vma)
+{
+	return subpool_inode(vma->vm_file->f_dentry->d_inode);
+}
+
 /*
  * Region tracking -- allows tracking of reservations and instantiated pages
  *                    across the pages in a mapping.
@@ -541,9 +619,9 @@ static void free_huge_page(struct page *page)
 	 */
 	struct hstate *h = page_hstate(page);
 	int nid = page_to_nid(page);
-	struct address_space *mapping;
+	struct hugepage_subpool *spool =
+		(struct hugepage_subpool *)page_private(page);
 
-	mapping = (struct address_space *) page_private(page);
 	set_page_private(page, 0);
 	page->mapping = NULL;
 	BUG_ON(page_count(page));
@@ -558,8 +636,7 @@ static void free_huge_page(struct page *page)
 		enqueue_huge_page(h, page);
 	}
 	spin_unlock(&hugetlb_lock);
-	if (mapping)
-		hugetlb_put_quota(mapping, 1);
+	hugepage_subpool_put_pages(spool, 1);
 }
 
 static void prep_new_huge_page(struct hstate *h, struct page *page, int nid)
@@ -927,11 +1004,12 @@ static void return_unused_surplus_pages(struct hstate *h,
 /*
  * Determine if the huge page at addr within the vma has an associated
  * reservation.  Where it does not we will need to logically increase
- * reservation and actually increase quota before an allocation can occur.
- * Where any new reservation would be required the reservation change is
- * prepared, but not committed.  Once the page has been quota'd allocated
- * an instantiated the change should be committed via vma_commit_reservation.
- * No action is required on failure.
+ * reservation and actually increase subpool usage before an allocation
+ * can occur.  Where any new reservation would be required the
+ * reservation change is prepared, but not committed.  Once the page
+ * has been allocated from the subpool and instantiated the change should
+ * be committed via vma_commit_reservation.  No action is required on
+ * failure.
  */
 static long vma_needs_reservation(struct hstate *h,
 			struct vm_area_struct *vma, unsigned long addr)
@@ -980,24 +1058,24 @@ static void vma_commit_reservation(struct hstate *h,
 static struct page *alloc_huge_page(struct vm_area_struct *vma,
 				    unsigned long addr, int avoid_reserve)
 {
+	struct hugepage_subpool *spool = subpool_vma(vma);
 	struct hstate *h = hstate_vma(vma);
 	struct page *page;
-	struct address_space *mapping = vma->vm_file->f_mapping;
-	struct inode *inode = mapping->host;
 	long chg;
 
 	/*
-	 * Processes that did not create the mapping will have no reserves and
-	 * will not have accounted against quota. Check that the quota can be
-	 * made before satisfying the allocation
-	 * MAP_NORESERVE mappings may also need pages and quota allocated
-	 * if no reserve mapping overlaps.
+	 * Processes that did not create the mapping will have no
+	 * reserves and will not have accounted against subpool
+	 * limit. Check that the subpool limit can be made before
+	 * satisfying the allocation MAP_NORESERVE mappings may also
+	 * need pages and subpool limit allocated allocated if no reserve
+	 * mapping overlaps.
 	 */
 	chg = vma_needs_reservation(h, vma, addr);
 	if (chg < 0)
 		return ERR_PTR(-VM_FAULT_OOM);
 	if (chg)
-		if (hugetlb_get_quota(inode->i_mapping, chg))
+		if (hugepage_subpool_get_pages(spool, chg))
 			return ERR_PTR(-VM_FAULT_SIGBUS);
 
 	spin_lock(&hugetlb_lock);
@@ -1007,13 +1085,13 @@ static struct page *alloc_huge_page(struct vm_area_struct *vma,
 	if (!page) {
 		page = alloc_buddy_huge_page(h, vma, addr);
 		if (!page) {
-			hugetlb_put_quota(inode->i_mapping, chg);
+			hugepage_subpool_put_pages(spool, chg);
 			return ERR_PTR(-VM_FAULT_SIGBUS);
 		}
 	}
 
 	set_page_refcounted(page);
-	set_page_private(page, (unsigned long) mapping);
+	set_page_private(page, (unsigned long)spool);
 
 	vma_commit_reservation(h, vma, addr);
 
@@ -1698,6 +1776,7 @@ static void hugetlb_vm_op_close(struct vm_area_struct *vma)
 {
 	struct hstate *h = hstate_vma(vma);
 	struct resv_map *reservations = vma_resv_map(vma);
+	struct hugepage_subpool *spool = subpool_vma(vma);
 	unsigned long reserve;
 	unsigned long start;
 	unsigned long end;
@@ -1713,7 +1792,7 @@ static void hugetlb_vm_op_close(struct vm_area_struct *vma)
 
 		if (reserve) {
 			hugetlb_acct_memory(h, -reserve);
-			hugetlb_put_quota(vma->vm_file->f_mapping, reserve);
+			hugepage_subpool_put_pages(spool, reserve);
 		}
 	}
 }
@@ -1910,7 +1989,7 @@ static int unmap_ref_private(struct mm_struct *mm, struct vm_area_struct *vma,
 	address = address & huge_page_mask(h);
 	pgoff = ((address - vma->vm_start) >> PAGE_SHIFT)
 		+ (vma->vm_pgoff >> PAGE_SHIFT);
-	mapping = (struct address_space *)page_private(page);
+	mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
 
 	vma_prio_tree_foreach(iter_vma, &iter, &mapping->i_mmap, pgoff, pgoff) {
 		/* Do not unmap the current VMA */
@@ -2364,11 +2443,12 @@ int hugetlb_reserve_pages(struct inode *inode,
 {
 	long ret, chg;
 	struct hstate *h = hstate_inode(inode);
+	struct hugepage_subpool *spool = subpool_inode(inode);
 
 	/*
 	 * Only apply hugepage reservation if asked. At fault time, an
 	 * attempt will be made for VM_NORESERVE to allocate a page
-	 * and filesystem quota without using reserves
+	 * without using reserves
 	 */
 	if (acctflag & VM_NORESERVE)
 		return 0;
@@ -2395,17 +2475,17 @@ int hugetlb_reserve_pages(struct inode *inode,
 	if (chg < 0)
 		return chg;
 
-	/* There must be enough filesystem quota for the mapping */
-	if (hugetlb_get_quota(inode->i_mapping, chg))
+	/* There must be enough pages in the subpool for the mapping */
+	if (hugepage_subpool_get_pages(spool, chg))
 		return -ENOSPC;
 
 	/*
 	 * Check enough hugepages are available for the reservation.
-	 * Hand back the quota if there are not
+	 * Hand the pages back to the subpool if there are not
 	 */
 	ret = hugetlb_acct_memory(h, chg);
 	if (ret < 0) {
-		hugetlb_put_quota(inode->i_mapping, chg);
+		hugepage_subpool_put_pages(spool, chg);
 		return ret;
 	}
 
@@ -2429,11 +2509,12 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed)
 {
 	struct hstate *h = hstate_inode(inode);
 	long chg = region_truncate(&inode->i_mapping->private_list, offset);
+	struct hugepage_subpool *spool = subpool_inode(inode);
 
 	spin_lock(&inode->i_lock);
 	inode->i_blocks -= (blocks_per_huge_page(h) * freed);
 	spin_unlock(&inode->i_lock);
 
-	hugetlb_put_quota(inode->i_mapping, (chg - freed));
+	hugepage_subpool_put_pages(spool, (chg - freed));
 	hugetlb_acct_memory(h, -(chg - freed));
 }
-- 
1.7.2.1.45.g54fbc




  parent reply	other threads:[~2012-10-01 23:32 UTC|newest]

Thread overview: 220+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <6a854f579a99b4fe2efaca1057e8ae22@local>
2012-10-01 22:51 ` [ 000/180] 2.6.32.60-longterm review Willy Tarreau
2012-10-01 22:51 ` [ 001/180] netxen: support for GbE port settings Willy Tarreau
2012-10-03 17:38   ` Sony Chacko
2012-10-01 22:51 ` [ 002/180] Fix sparc build with newer tools Willy Tarreau
2012-10-01 22:52 ` [ 003/180] powerpc/pmac: Fix SMP kernels on pre-core99 UP machines Willy Tarreau
2012-10-01 22:52 ` [ 004/180] Bluetooth: btusb: fix bInterval for high/super speed isochronous endpoints Willy Tarreau
2012-10-01 22:52 ` [ 005/180] jbd2: clear BH_Delay & BH_Unwritten in journal_unmap_buffer Willy Tarreau
2012-10-01 22:52 ` [ 006/180] fix pgd_lock deadlock Willy Tarreau
2012-10-01 22:52 ` [ 007/180] futex: Fix uninterruptible loop due to gate_area Willy Tarreau
2012-10-01 22:52 ` [ 008/180] 2.6.32.x: ntp: Fix leap-second hrtimer livelock Willy Tarreau
2012-10-03 14:50   ` Ben Hutchings
2012-10-03 16:01     ` Willy Tarreau
2012-10-03 17:01       ` John Stultz
2012-10-03 17:34         ` Ben Hutchings
2012-10-03 17:45           ` Willy Tarreau
2012-10-03 17:43         ` Willy Tarreau
2012-10-01 22:52 ` [ 009/180] 2.6.32.x: ntp: Correct TAI offset during leap second Willy Tarreau
2012-10-01 22:52 ` [ 010/180] 2.6.32.x: timekeeping: Fix CLOCK_MONOTONIC inconsistency during leapsecond Willy Tarreau
2012-10-01 22:52 ` [ 011/180] 2.6.32.x: time: Move common updates to a function Willy Tarreau
2012-10-01 22:52 ` [ 012/180] 2.6.32.x: hrtimer: Provide clock_was_set_delayed() Willy Tarreau
2012-10-01 22:52 ` [ 013/180] 2.6.32.x: timekeeping: Fix leapsecond triggered load spike issue Willy Tarreau
2012-10-01 22:52 ` [ 014/180] 2.6.32.x: timekeeping: Maintain ktime_t based offsets for hrtimers Willy Tarreau
2012-10-01 22:52 ` [ 015/180] 2.6.32.x: hrtimers: Move lock held region in hrtimer_interrupt() Willy Tarreau
2012-10-01 22:52 ` [ 016/180] 2.6.32.x: timekeeping: Provide hrtimer update function Willy Tarreau
2012-10-01 22:52 ` [ 017/180] 2.6.32.x: hrtimer: Update hrtimer base offsets each hrtimer_interrupt Willy Tarreau
2012-10-01 22:52 ` [ 018/180] 2.6.32.x: timekeeping: Add missing update call in timekeeping_resume() Willy Tarreau
2012-10-01 22:52 ` [ 019/180] 2.6.32.y: time: Improve sanity checking of timekeeping inputs Willy Tarreau
2012-10-01 22:52 ` [ 020/180] 2.6.32.y: time: Avoid making adjustments if we havent accumulated anything Willy Tarreau
2012-10-01 22:52 ` [ 021/180] 2.6.32.y: time: Move ktime_t overflow checking into timespec_valid_strict Willy Tarreau
2012-10-01 22:52 ` [ 022/180] ioat2: kill pending flag Willy Tarreau
2012-10-04 14:47   ` Ben Hutchings
2012-10-04 20:16     ` Willy Tarreau
2012-10-01 22:52 ` [ 023/180] drm/i915: Attempt to fix watermark setup on 85x (v2) Willy Tarreau
2012-10-01 22:52 ` [ 024/180] usb: Fix deadlock in hid_reset when Dell iDRAC is reset Willy Tarreau
2012-10-01 22:52 ` [ 025/180] eCryptfs: Copy up lower inode attrs after setting lower xattr Willy Tarreau
2012-10-01 22:52 ` [ 026/180] eCryptfs: Improve statfs reporting Willy Tarreau
2012-10-02  5:46   ` Tyler Hicks
2012-10-02  5:57     ` Willy Tarreau
2012-10-02 12:24     ` Tim Gardner
2012-10-03 15:13       ` Ben Hutchings
2012-10-01 22:52 ` [ 027/180] eCryptfs: Clear ECRYPTFS_NEW_FILE flag during truncate Willy Tarreau
2012-10-01 22:52 ` [ 028/180] oprofile: use KM_NMI slot for kmap_atomic Willy Tarreau
2012-10-01 22:52 ` [ 029/180] tty_audit: fix tty_audit_add_data live lock on audit disabled Willy Tarreau
2012-10-01 22:52 ` [ 030/180] bonding: 802.3ad - fix agg_device_up Willy Tarreau
2012-10-01 22:52 ` [ 031/180] usbnet: increase URB reference count before usb_unlink_urb Willy Tarreau
2012-10-01 22:52 ` [ 032/180] usbnet: dont clear urb->dev in tx_complete Willy Tarreau
2012-10-01 22:52 ` [ 033/180] sched: Fix signed unsigned comparison in check_preempt_tick() Willy Tarreau
2012-10-01 22:52 ` [ 034/180] x86/PCI: amd: factor out MMCONFIG discovery Willy Tarreau
2012-10-01 22:52 ` [ 035/180] PNP: fix "work around Dell 1536/1546 BIOS MMCONFIG bug that breaks USB" Willy Tarreau
2012-10-01 22:52 ` [ 036/180] KVM: Remove ability to assign a device without iommu support Willy Tarreau
2012-10-01 22:52 ` [ 037/180] KVM: Device assignment permission checks Willy Tarreau
2012-10-01 22:52 ` [ 038/180] KVM: x86: Prevent starting PIT timers in the absence of irqchip support Willy Tarreau
2012-10-01 22:52 ` [ 039/180] rose: Add length checks to CALL_REQUEST parsing Willy Tarreau
2012-10-01 22:52 ` [ 040/180] KVM: x86: extend "struct x86_emulate_ops" with "get_cpuid" Willy Tarreau
2012-10-04 17:15   ` Ben Hutchings
2012-10-01 22:52 ` [ 041/180] KVM: x86: fix missing checks in syscall emulation Willy Tarreau
2012-10-04 17:20   ` Ben Hutchings
2012-10-01 22:52 ` [ 042/180] block: Fix io_context leak after clone with CLONE_IO Willy Tarreau
2012-10-01 22:52 ` [ 043/180] block: Fix io_context leak after failure of " Willy Tarreau
2012-10-01 22:52 ` [ 044/180] KVM: x86: disallow multiple KVM_CREATE_IRQCHIP Willy Tarreau
2012-10-01 22:52 ` [ 045/180] KVM: Ensure all vcpus are consistent with in-kernel irqchip settings Willy Tarreau
2012-10-04 17:35   ` Ben Hutchings
2012-10-01 22:52 ` [ 046/180] xfs: Fix possible memory corruption in xfs_readlink Willy Tarreau
2012-10-03 15:01   ` Herton Ronaldo Krzesinski
2012-10-03 16:05     ` Willy Tarreau
2012-10-01 22:52 ` [ 047/180] fcaps: clear the same personality flags as suid when fcaps are used Willy Tarreau
2012-10-01 22:52 ` [ 048/180] security: fix compile error in commoncap.c Willy Tarreau
2012-10-01 22:52 ` Willy Tarreau [this message]
2012-10-01 22:52 ` [ 050/180] net: sock: validate data_len before allocating skb in sock_alloc_send_pskb() Willy Tarreau
2012-10-01 22:52 ` [ 051/180] dl2k: use standard #defines from mii.h Willy Tarreau
2012-10-01 22:52 ` [ 052/180] dl2k: Clean up rio_ioctl Willy Tarreau
2012-10-01 22:52 ` [ 053/180] hfsplus: Fix potential buffer overflows Willy Tarreau
2012-10-01 22:52 ` [ 054/180] cred: copy_process() should clear child->replacement_session_keyring Willy Tarreau
2012-10-01 22:52 ` [ 055/180] tcp: Dont change unlocked socket state in tcp_v4_err() Willy Tarreau
2012-10-01 22:52 ` [ 056/180] x86: Derandom delay_tsc for 64 bit Willy Tarreau
2012-10-01 22:52 ` [ 057/180] ipsec: be careful of non existing mac headers Willy Tarreau
2012-10-01 22:52 ` [ 058/180] block, sx8: fix pointer math issue getting fw version Willy Tarreau
2012-10-01 22:52 ` [ 059/180] nilfs2: fix NULL pointer dereference in nilfs_load_super_block() Willy Tarreau
2012-10-01 22:52 ` [ 060/180] USB: ftdi_sio: fix problem when the manufacture is a NULL string Willy Tarreau
2012-10-01 22:52 ` [ 061/180] ntp: Fix integer overflow when setting time Willy Tarreau
2012-10-01 22:52 ` [ 062/180] SUNRPC: We must not use list_for_each_entry_safe() in rpc_wake_up() Willy Tarreau
2012-10-01 22:53 ` [ 063/180] ext4: check for zero length extent Willy Tarreau
2012-10-01 22:53 ` [ 064/180] xfs: Fix oops on IO error during xlog_recover_process_iunlinks() Willy Tarreau
2012-10-01 22:53 ` [ 065/180] nfsd: dont allow zero length strings in cache_parse() Willy Tarreau
2012-10-01 22:53 ` [ 066/180] sched/x86: Fix overflow in cyc2ns_offset Willy Tarreau
2012-10-01 22:53 ` [ 067/180] Bluetooth: add NULL pointer check in HCI Willy Tarreau
2012-10-01 22:53 ` [ 068/180] Bluetooth: hci_ldisc: fix NULL-pointer dereference on tty_close Willy Tarreau
2012-10-01 22:53 ` [ 069/180] sparc64: Fix bootup crash on sun4v Willy Tarreau
2012-10-01 22:53 ` [ 070/180] video:uvesafb: Fix oops that uvesafb try to execute NX-protected page Willy Tarreau
2012-10-01 22:53 ` [ 071/180] USB: serial: fix race between probe and open Willy Tarreau
2012-10-01 22:53 ` [ 072/180] xhci: Dont write zeroed pointers to xHC registers Willy Tarreau
2012-10-01 22:53 ` [ 073/180] xHCI: Correct the #define XHCI_LEGACY_DISABLE_SMI Willy Tarreau
2012-10-01 22:53 ` [ 074/180] crypto: sha512 - Fix byte counter overflow in SHA-512 Willy Tarreau
2012-10-01 22:53 ` [ 075/180] PCI: Add quirk for still enabled interrupts on Intel Sandy Bridge GPUs Willy Tarreau
2012-10-01 22:53 ` [ 076/180] phonet: Check input from user before allocating Willy Tarreau
2012-10-01 22:53 ` [ 077/180] netlink: fix races after skb queueing Willy Tarreau
2012-10-01 22:53 ` [ 078/180] net: fix a race in sock_queue_err_skb() Willy Tarreau
2012-10-01 22:53 ` [ 079/180] atl1: fix kernel panic in case of DMA errors Willy Tarreau
2012-10-01 22:53 ` [ 080/180] net/ethernet: ks8851_mll fix rx frame buffer overflow Willy Tarreau
2012-10-01 22:53 ` [ 081/180] net_sched: gred: Fix oops in gred_dump() in WRED mode Willy Tarreau
2012-10-01 22:53 ` [ 082/180] ARM: 7410/1: Add extra clobber registers for assembly in kernel_execve Willy Tarreau
2012-10-01 22:53 ` [ 083/180] netem: fix possible skb leak Willy Tarreau
2012-10-01 22:53 ` [ 084/180] ALSA: echoaudio: Remove incorrect part of assertion Willy Tarreau
2012-10-01 22:53 ` [ 085/180] NFSv4: Revalidate uid/gid after open Willy Tarreau
2012-10-01 22:53 ` [ 086/180] ext3: Fix error handling on inode bitmap corruption Willy Tarreau
2012-10-01 22:53 ` [ 087/180] ext4: fix " Willy Tarreau
2012-10-01 22:53 ` [ 088/180] xhci: Reset reserved command ring TRBs on cleanup Willy Tarreau
2012-10-01 22:53 ` [ 089/180] SCSI: fix scsi_wait_scan Willy Tarreau
2012-10-04 20:34   ` Ben Hutchings
2012-10-04 20:38     ` Willy Tarreau
2012-10-04 20:57       ` Ben Hutchings
2012-10-04 21:08         ` Willy Tarreau
2012-10-01 22:53 ` [ 090/180] powerpc: Fix kernel panic during kernel module load Willy Tarreau
2012-10-01 22:53 ` [ 091/180] fuse: fix stat call on 32 bit platforms Willy Tarreau
2012-10-01 22:53 ` [ 092/180] udf: Avoid run away loop when partition table length is corrupted Willy Tarreau
2012-10-04 21:23   ` Ben Hutchings
2012-10-04 21:48     ` Willy Tarreau
2012-10-01 22:53 ` [ 093/180] stable: Allow merging of backports for serious user-visible performance issues Willy Tarreau
2012-10-01 22:53 ` [ 094/180] eCryptfs: Properly check for O_RDONLY flag before doing privileged open Willy Tarreau
2012-10-01 22:53 ` [ 095/180] USB: cdc-wdm: fix lockup on error in wdm_read Willy Tarreau
2012-10-01 22:53 ` [ 096/180] mm: Hold a file reference in madvise_remove Willy Tarreau
2012-10-01 22:53 ` [ 097/180] ntp: Fix STA_INS/DEL clearing bug Willy Tarreau
2012-10-01 22:53 ` [ 098/180] MIPS: Properly align the .data..init_task section Willy Tarreau
2012-10-01 22:53 ` [ 099/180] powerpc/ftrace: Fix assembly trampoline register usage Willy Tarreau
2012-10-02 13:45   ` Paul Gortmaker
2012-10-02 13:59     ` Willy Tarreau
2012-10-04 21:31   ` Ben Hutchings
2012-10-01 22:53 ` [ 100/180] powerpc: Add "memory" attribute for mfmsr() Willy Tarreau
2012-10-04 21:32   ` Ben Hutchings
2012-10-01 22:53 ` [ 101/180] SCSI: libsas: continue revalidation Willy Tarreau
2012-10-04 21:33   ` Ben Hutchings
2012-10-01 22:53 ` [ 102/180] SCSI: libsas: fix sas_discover_devices return code handling Willy Tarreau
2012-10-01 22:53 ` [ 103/180] SCSI: fix eh wakeup (scsi_schedule_eh vs scsi_restart_operations) Willy Tarreau
2012-10-01 22:53 ` [ 104/180] SCSI: Avoid dangling pointer in scsi_requeue_command() Willy Tarreau
2012-10-01 22:53 ` [ 105/180] usbdevfs: Correct amount of data copied to user in processcompl_compat Willy Tarreau
2012-10-01 22:53 ` [ 106/180] locks: fix checking of fcntl_setlease argument Willy Tarreau
2012-10-01 22:53 ` [ 107/180] ACPI/AC: prevent OOPS on some boxes due to missing check power_supply_register() return value check Willy Tarreau
2012-10-01 22:53 ` [ 108/180] Btrfs: call the ordered free operation without any locks held Willy Tarreau
2012-10-01 22:53 ` [ 109/180] nfsd4: our filesystems are normally case sensitive Willy Tarreau
2012-10-01 22:53 ` [ 110/180] ext4: dont let i_reserved_meta_blocks go negative Willy Tarreau
2012-10-04 21:55   ` Ben Hutchings
2012-10-05 11:59     ` Brian Foster
2012-10-05 12:37       ` Willy Tarreau
2012-10-05 13:00         ` Brian Foster
2012-10-07  1:47       ` Ben Hutchings
2012-10-07  6:21         ` Willy Tarreau
2012-10-01 22:53 ` [ 111/180] sctp: Fix list corruption resulting from freeing an association on a list Willy Tarreau
2012-10-01 22:53 ` [ 112/180] cipso: dont follow a NULL pointer when setsockopt() is called Willy Tarreau
2012-10-01 22:53 ` [ 113/180] wanmain: comparing array with NULL Willy Tarreau
2012-10-01 22:53 ` [ 114/180] USB: kaweth.c: use GFP_ATOMIC under spin_lock Willy Tarreau
2012-10-01 22:53 ` [ 115/180] tcp: perform DMA to userspace only if there is a task waiting for it Willy Tarreau
2012-10-01 22:53 ` [ 116/180] net/tun: fix ioctl() based info leaks Willy Tarreau
2012-10-01 22:53 ` [ 117/180] USB: echi-dbgp: increase the controller wait time to come out of halt Willy Tarreau
2012-10-01 22:53 ` [ 118/180] ALSA: mpu401: Fix missing initialization of irq field Willy Tarreau
2012-10-01 22:53 ` [ 119/180] futex: Test for pi_mutex on fault in futex_wait_requeue_pi() Willy Tarreau
2012-10-01 22:53 ` [ 120/180] futex: Fix bug in WARN_ON for NULL q.pi_state Willy Tarreau
2012-10-01 22:53 ` [ 121/180] futex: Forbid uaddr == uaddr2 in futex_wait_requeue_pi() Willy Tarreau
2012-10-01 22:53 ` [ 122/180] pcdp: use early_ioremap/early_iounmap to access pcdp table Willy Tarreau
2012-10-01 22:54 ` [ 123/180] mm: mmu_notifier: fix freed page still mapped in secondary MMU Willy Tarreau
2012-10-01 22:54 ` [ 124/180] fuse: verify all ioctl retry iov elements Willy Tarreau
2012-10-01 22:54 ` [ 125/180] xhci: Increase reset timeout for Renesas 720201 host Willy Tarreau
2012-10-01 22:54 ` [ 126/180] usb: serial: mos7840: Fixup mos7840_chars_in_buffer() Willy Tarreau
2012-10-01 22:54 ` [ 127/180] ALSA: hda - fix Copyright debug message Willy Tarreau
2012-10-01 22:54 ` [ 128/180] vfs: missed source of ->f_pos races Willy Tarreau
2012-10-01 22:54 ` [ 129/180] NFSv3: Ensure that do_proc_get_root() reports errors correctly Willy Tarreau
2012-10-01 22:54 ` [ 130/180] NFS: Alias the nfs module to nfs4 Willy Tarreau
2012-10-01 22:54 ` [ 131/180] svcrpc: fix svc_xprt_enqueue/svc_recv busy-looping Willy Tarreau
2012-10-01 22:54 ` [ 132/180] svcrpc: sends on closed socket should stop immediately Willy Tarreau
2012-10-01 22:54 ` [ 133/180] cciss: fix incorrect scsi status reporting Willy Tarreau
2012-10-04 22:49   ` Ben Hutchings
2012-10-04 23:27     ` Willy Tarreau
2012-10-01 22:54 ` [ 134/180] USB: CDC ACM: Fix NULL pointer dereference Willy Tarreau
2012-10-01 22:54 ` [ 135/180] Remove user-triggerable BUG from mpol_to_str Willy Tarreau
2012-10-01 22:54 ` [ 136/180] udf: Fix data corruption for files in ICB Willy Tarreau
2012-10-01 22:54 ` [ 137/180] ext3: Fix fdatasync() for files with only i_size changes Willy Tarreau
2012-10-01 22:54 ` [ 138/180] PARISC: Redefine ATOMIC_INIT and ATOMIC64_INIT to drop the casts Willy Tarreau
2012-10-01 22:54 ` [ 139/180] dccp: check ccid before dereferencing Willy Tarreau
2012-10-01 22:54 ` [ 140/180] ia64: Add accept4() syscall Willy Tarreau
2012-10-01 22:54 ` [ 141/180] tcp: do_tcp_sendpages() must try to push data out on oom conditions Willy Tarreau
2012-10-01 22:54 ` [ 142/180] tcp: drop SYN+FIN messages Willy Tarreau
2012-10-01 22:54 ` [ 143/180] xen: correctly check for pending events when restoring irq flags Willy Tarreau
2012-10-01 22:54 ` [ 144/180] x86, amd, xen: Avoid NULL pointer paravirt references Willy Tarreau
2012-10-01 22:54 ` [ 145/180] x86, tls: Off by one limit check Willy Tarreau
2012-10-01 22:54 ` [ 146/180] sparc64: Eliminate obsolete __handle_softirq() function Willy Tarreau
2012-10-01 22:54 ` [ 147/180] udf: Fortify loading of sparing table Willy Tarreau
2012-10-04 23:15   ` Ben Hutchings
2012-10-04 23:28     ` Willy Tarreau
2012-10-01 22:54 ` [ 148/180] mtd: cafe_nand: fix an & vs | mistake Willy Tarreau
2012-10-01 22:54 ` [ 149/180] epoll: introduce POLLFREE to flush ->signalfd_wqh before kfree() Willy Tarreau
2012-10-01 22:54 ` [ 150/180] epoll: ep_unregister_pollwait() can use the freed pwq->whead Willy Tarreau
2012-10-01 22:54 ` [ 151/180] epoll: limit paths Willy Tarreau
2012-10-01 22:54 ` [ 152/180] Dont limit non-nested epoll paths Willy Tarreau
2012-10-01 22:54 ` [ 153/180] epoll: clear the tfile_check_list on -ELOOP Willy Tarreau
2012-10-01 22:54 ` [ 154/180] random: Reorder struct entropy_store to remove padding on 64bits Willy Tarreau
2012-10-01 22:54 ` [ 155/180] random: update interface comments to reflect reality Willy Tarreau
2012-10-01 22:54 ` [ 156/180] random: simplify fips mode Willy Tarreau
2012-10-01 22:54 ` [ 157/180] x86, cpu: Add CPU flags for F16C and RDRND Willy Tarreau
2012-10-01 22:54 ` [ 158/180] x86, cpufeature: Update CPU feature RDRND to RDRAND Willy Tarreau
2012-10-01 22:54 ` [ 159/180] random: Add support for architectural random hooks Willy Tarreau
2012-10-01 22:54 ` [ 160/180] x86, random: Architectural inlines to get random integers with RDRAND Willy Tarreau
2012-10-01 22:54 ` [ 161/180] x86, random: Verify RDRAND functionality and allow it to be disabled Willy Tarreau
2012-10-01 22:54 ` [ 162/180] fix typo/thinko in get_random_bytes() Willy Tarreau
2012-10-01 22:54 ` [ 163/180] random: Use arch_get_random_int instead of cycle counter if avail Willy Tarreau
2012-10-01 22:54 ` [ 164/180] random: Use arch-specific RNG to initialize the entropy store Willy Tarreau
2012-10-01 22:54 ` [ 165/180] random: Adjust the number of loops when initializing Willy Tarreau
2012-10-01 22:54 ` [ 166/180] drivers/char/random.c: fix boot id uniqueness race Willy Tarreau
2012-10-01 22:54 ` [ 167/180] random: make add_interrupt_randomness() do something sane Willy Tarreau
2012-10-01 22:54 ` [ 168/180] random: use lockless techniques in the interrupt path Willy Tarreau
2012-10-01 22:54 ` [ 169/180] random: create add_device_randomness() interface Willy Tarreau
2012-10-01 22:54 ` [ 170/180] random: use the arch-specific rng in xfer_secondary_pool Willy Tarreau
2012-10-01 22:54 ` [ 171/180] random: add new get_random_bytes_arch() function Willy Tarreau
2012-10-01 22:54 ` [ 172/180] random: mix in architectural randomness in extract_buf() Willy Tarreau
2012-10-01 22:54 ` [ 173/180] MAINTAINERS: Theodore Tso is taking over the random driver Willy Tarreau
2012-10-01 22:54 ` [ 174/180] usb: feed USB device information to the /dev/random driver Willy Tarreau
2012-10-01 22:54 ` [ 175/180] net: feed /dev/random with the MAC address when registering a device Willy Tarreau
2012-10-01 22:54 ` [ 176/180] random: remove rand_initialize_irq() Willy Tarreau
2012-10-01 22:54 ` [ 177/180] random: Add comment to random_initialize() Willy Tarreau
2012-10-01 22:54 ` [ 178/180] rtc: wm831x: Feed the write counter into device_add_randomness() Willy Tarreau
2012-10-01 22:54 ` [ 179/180] mfd: wm831x: Feed the device UUID " Willy Tarreau
2012-10-01 22:54 ` [ 180/180] dmi: Feed DMI table to /dev/random driver Willy Tarreau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20121001225159.689540332@1wt.eu \
    --to=w@1wt.eu \
    --cc=abarry@cray.com \
    --cc=akpm@linux-foundation.org \
    --cc=david@gibson.dropbear.id.au \
    --cc=dhillf@gmail.com \
    --cc=hughd@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mgorman@suse.de \
    --cc=minchan.kim@gmail.com \
    --cc=paulus@samba.org \
    --cc=stable@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).