]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.git/commitdiff
patch netback-defensive.patch
authorSteven Smith <ssmith@weybridge.uk.xensource.com>
Tue, 30 Jun 2009 11:55:48 +0000 (12:55 +0100)
committerSteven Smith <ssmith@weybridge.uk.xensource.com>
Tue, 30 Jun 2009 11:55:48 +0000 (12:55 +0100)
drivers/xen/netback/netback.c

index 1bed34d49ef89fcd43f7f31ed1334ebc7b3ff2a2..0115519e84f6cab6b3554b7b0026ae97fbd76af1 100644 (file)
@@ -88,15 +88,17 @@ static inline unsigned long idx_to_kaddr(unsigned int idx)
        return (unsigned long)pfn_to_kaddr(idx_to_pfn(idx));
 }
 
-/* extra field used in struct page */
+/* we use an extra field in struct page to map pages to pending reqs */
+#define NETIF_INDEX_MASK 0xABCD0000UL    /* magic sanity check value */
 static inline void netif_set_page_index(struct page *pg, unsigned int index)
 {
-       *(unsigned long *)&pg->mapping = index;
+       *(unsigned long *)&pg->mapping = index | NETIF_INDEX_MASK;
 }
 
 static inline int netif_page_index(struct page *pg)
 {
-       unsigned long idx = (unsigned long)pg->mapping;
+       unsigned long val = (unsigned long)pg->mapping;
+       unsigned long idx = val & ~NETIF_INDEX_MASK;
 
        if (!PageForeign(pg))
                return -1;
@@ -104,6 +106,19 @@ static inline int netif_page_index(struct page *pg)
        if ((idx >= MAX_PENDING_REQS) || (mmap_pages[idx] != pg))
                return -1;
 
+       if (unlikely((val & NETIF_INDEX_MASK) != NETIF_INDEX_MASK)) {
+               printk(KERN_ERR "apparent netback page %p doesn't have NETIF_INDEX_MASK magic: %lx, dtor %#lx\n",
+                      pg, val, pg->index);
+               printk(KERN_ERR "-- page flags are %lx - %s; %s; %s\n",
+                      pg->flags,
+                      PageForeign(pg) ? "FOREIGN" : "not-foreign",
+                      PageNetback(pg) ? "NETBACK" : "not-netback",
+                      PageBlkback(pg) ? "BLKBACK" : "not-blkback");
+               printk(KERN_ERR "-- page flags are %lx\n", pg->flags);
+               printk(KERN_ERR "-- page count is %d\n", page_count(pg));
+               BUG();
+       }
+
        return idx;
 }