]> xenbits.xensource.com Git - people/ssmith/nc2-2.6.27.bak/.git/commitdiff
patch netback-defensive.patch
authorSteven Smith <ssmith@weybridge.uk.xensource.com>
Thu, 28 May 2009 10:54:20 +0000 (11:54 +0100)
committerSteven Smith <ssmith@weybridge.uk.xensource.com>
Thu, 28 May 2009 10:54:20 +0000 (11:54 +0100)
drivers/xen/netback/netback.c

index febf5bb236f08b5d1268bb1b71998c615ffe0749..20891ceb86a7416da6e8ee3b21e9478a04505be4 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;
 }