Although this bug was reported to affect Linux 3.10+, a different issue has made the module impossible to load since Linux 3.4!
I fixed this and the dependency on linux-headers with an NMU, for which
the diff is below.
Ben.
---
diff -Nru blktap-dkms-2.0.91/blktap.h blktap-dkms-2.0.93/blktap.h
--- blktap-dkms-2.0.91/blktap.h 2011-12-10 14:36:49.000000000 +0000
+++ blktap-dkms-2.0.93/blktap.h 2013-11-18 14:31:42.000000000 +0000
@@ -29,6 +29,7 @@
#include <linux/cdev.h>
#include <linux/init.h>
#include <linux/scatterlist.h>
+#include <linux/mutex.h>
#include "linux-blktap.h"
extern int blktap_debug_level;
@@ -67,6 +68,7 @@
struct task_struct *task;
struct vm_area_struct *vma;
+ struct mutex vma_lock;
struct blktap_front_ring ring;
unsigned long ring_vstart;
unsigned long user_vstart;
diff -Nru blktap-dkms-2.0.91/debian/changelog
blktap-dkms-2.0.93/debian/changelog
--- blktap-dkms-2.0.91/debian/changelog 2013-03-22 11:51:00.000000000 +0000
+++ blktap-dkms-2.0.93/debian/changelog 2013-11-18 14:37:48.000000000 +0000
@@ -1,3 +1,13 @@
+blktap-dkms (2.0.93-0.1) unstable; urgency=high
+
+ * Non-maintainer upload.
+ * copyright: Update details for new upstream maintainer
+ * New upstream release
+ - Fix compatibility with Linux 3.4+ (Closes: #717157)
+ * Remove dependency on obsolete linux-headers packages (Closes: #728266)
+
+ -- Ben Hutchings <[email protected]> Mon, 18 Nov 2013 13:53:20 +0000
+
blktap-dkms (2.0.91-3) experimental; urgency=low
* Uploading to experimental during the freeze.
diff -Nru blktap-dkms-2.0.91/debian/control blktap-dkms-2.0.93/debian/control
--- blktap-dkms-2.0.91/debian/control 2013-03-22 11:51:00.000000000 +0000
+++ blktap-dkms-2.0.93/debian/control 2013-11-18 14:39:53.000000000 +0000
@@ -11,7 +11,8 @@
Package: blktap-dkms
Architecture: i386 amd64
-Depends: ${misc:Depends}, dkms, linux-libc-dev, libc6-dev,
${xcp-kernel-header-depends}
+Depends: ${misc:Depends}, dkms, linux-libc-dev, libc6-dev
+Recommends: ${xcp-kernel-header-recommends}
Description: Xen API blktap kernel component DKMS package
The Xen Cloud Platform (XCP) is an open source enterprise-ready server
virtualization and cloud computing platform, delivering the Xen Hypervisor
diff -Nru blktap-dkms-2.0.91/debian/copyright
blktap-dkms-2.0.93/debian/copyright
--- blktap-dkms-2.0.91/debian/copyright 2013-03-22 11:51:00.000000000 +0000
+++ blktap-dkms-2.0.93/debian/copyright 2013-11-18 14:36:23.000000000 +0000
@@ -1,15 +1,16 @@
Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=173
Upstream-Name: blktap-dkms
-Upstream-Contact: Jonathan Ludlam <[email protected]>
-Source: git clone http://github.com/jonludlam/blktap-dkms.git
+Upstream-Contact: Mike McClurg <[email protected]>
+Source: git clone https://github.com/mcclurmc/blktap-dkms.git
Files: debian/*
Copyright: (c) 2011, Jon Ludlam <[email protected]>
(c) 2011, Thomas Goirand <[email protected]>
+ 2012, Mike McClurg <[email protected]>
License: 2 clauses BSD
Files: *
-Copyright: (c) 2011, Citrix Systems, Inc.
+Copyright: (c) 2011-2012, Citrix Systems, Inc.
License: GPL-2
License: 2 clauses BSD
diff -Nru blktap-dkms-2.0.91/debian/debian_control_vars
blktap-dkms-2.0.93/debian/debian_control_vars
--- blktap-dkms-2.0.91/debian/debian_control_vars 2013-03-22
11:51:00.000000000 +0000
+++ blktap-dkms-2.0.93/debian/debian_control_vars 2013-11-18
14:23:48.000000000 +0000
@@ -1 +1 @@
-xcp-kernel-header-depends= linux-headers-generic [i386 amd64] | linux-headers
+xcp-kernel-header-recommends= linux-headers-686-pae [i386],
linux-headers-amd64 [amd64]
diff -Nru
blktap-dkms-2.0.91/debian/patches/compatibility_with_linux_3.7_onward.patch
blktap-dkms-2.0.93/debian/patches/compatibility_with_linux_3.7_onward.patch
--- blktap-dkms-2.0.91/debian/patches/compatibility_with_linux_3.7_onward.patch
2013-03-22 11:51:00.000000000 +0000
+++ blktap-dkms-2.0.93/debian/patches/compatibility_with_linux_3.7_onward.patch
1970-01-01 01:00:00.000000000 +0100
@@ -1,58 +0,0 @@
-Description: Changed flag VM_RESERVED to VM_DONTDUMP to provide compatibility
with Linux 3.7 onwards.
-Origin: upstream,
https://github.com/xen-org/blktap-dkms/commit/3bd35d662de12139b7ed5b6dc1076a231a651d10
-Author: Vincent Bernardoff <[email protected]>
-Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/blktap-dkms/+bug/1078843
-Date: 2013-02-26
-
-diff --git a/ring.c b/ring.c
-index 3e33f7a..f1a3b59 100644
---- a/ring.c
-+++ b/ring.c
-@@ -14,7 +14,7 @@
- * GNU General Public License version 2 for more details.
- *
- * You should have received a copy of the GNU General Public License
-- * version 2 along with Blktap2. If not, see
-+ * version 2 along with Blktap2. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- *
-@@ -27,12 +27,19 @@
- #include <linux/blkdev.h>
- #include <linux/mman.h>
-
-+/* VM_RESERVED has disappeared starting from Linux 3.7 and has been
-+ * replaced by VM_DONTDUMP since then.
-+ */
-+#ifndef VM_DONTDUMP
-+#define VM_DONTDUMP VM_RESERVED
-+#endif
-+
- #include "blktap.h"
-
- int blktap_ring_major;
- static struct cdev blktap_ring_cdev;
-
-- /*
-+ /*
- * BLKTAP - immediately before the mmap area,
- * we have a bunch of pages reserved for shared memory rings.
- */
-@@ -435,7 +442,7 @@ blktap_ring_mmap_request(struct blktap *tap,
- }
-
- vma->vm_flags |= VM_DONTCOPY;
-- vma->vm_flags |= VM_RESERVED;
-+ vma->vm_flags |= VM_DONTDUMP;
-
- return 0;
- }
-@@ -471,7 +478,7 @@ blktap_ring_mmap_sring(struct blktap *tap, struct
vm_area_struct *vma)
- vma->vm_private_data = tap;
-
- vma->vm_flags |= VM_DONTCOPY;
-- vma->vm_flags |= VM_RESERVED;
-+ vma->vm_flags |= VM_DONTDUMP;
-
- vma->vm_ops = &blktap_ring_vm_operations;
-
diff -Nru blktap-dkms-2.0.91/debian/patches/series
blktap-dkms-2.0.93/debian/patches/series
--- blktap-dkms-2.0.91/debian/patches/series 2013-03-22 11:51:00.000000000
+0000
+++ blktap-dkms-2.0.93/debian/patches/series 2013-11-18 14:27:56.000000000
+0000
@@ -1,2 +1 @@
fixes-DEST_MODULE_LOCATION-in-dkms.conf.patch
-compatibility_with_linux_3.7_onward.patch
diff -Nru blktap-dkms-2.0.91/debian/ubuntu_control_vars
blktap-dkms-2.0.93/debian/ubuntu_control_vars
--- blktap-dkms-2.0.91/debian/ubuntu_control_vars 2013-03-22
11:51:00.000000000 +0000
+++ blktap-dkms-2.0.93/debian/ubuntu_control_vars 2013-11-18
14:23:10.000000000 +0000
@@ -0,0 +1 @@
+xcp-kernel-header-recommends= linux-headers-generic
diff -Nru blktap-dkms-2.0.91/dkms.conf blktap-dkms-2.0.93/dkms.conf
--- blktap-dkms-2.0.91/dkms.conf 2011-12-10 14:36:49.000000000 +0000
+++ blktap-dkms-2.0.93/dkms.conf 2013-11-18 14:31:54.000000000 +0000
@@ -1,4 +1,4 @@
-PACKAGE_VERSION="2.0.91"
+PACKAGE_VERSION="2.0.93"
PACKAGE_NAME="blktap"
CLEAN="make -C ${kernel_source_dir}
M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build clean"
MAKE="make -C ${kernel_source_dir}
M=${dkms_tree}/${PACKAGE_NAME}/${PACKAGE_VERSION}/build modules"
diff -Nru blktap-dkms-2.0.91/ring.c blktap-dkms-2.0.93/ring.c
--- blktap-dkms-2.0.91/ring.c 2011-11-28 20:16:07.000000000 +0000
+++ blktap-dkms-2.0.93/ring.c 2013-11-18 14:31:42.000000000 +0000
@@ -26,6 +26,7 @@
#include <linux/poll.h>
#include <linux/blkdev.h>
#include <linux/mman.h>
+#include <linux/mm.h>
#include "blktap.h"
@@ -96,9 +97,9 @@
struct blktap_ring_response rsp;
RING_IDX rc, rp;
- down_read(¤t->mm->mmap_sem);
+ mutex_lock(&ring->vma_lock);
if (!ring->vma) {
- up_read(¤t->mm->mmap_sem);
+ mutex_unlock(&ring->vma_lock);
return;
}
@@ -113,7 +114,7 @@
ring->ring.rsp_cons = rc;
- up_read(¤t->mm->mmap_sem);
+ mutex_unlock(&ring->vma_lock);
}
#define MMAP_VADDR(_start, _req, _seg) \
@@ -203,7 +204,7 @@
pgoff = 1 + request->usr_idx * BLKTAP_SEGMENT_MAX;
- addr = do_mmap_pgoff(filp, addr, len, prot, flags, pgoff);
+ addr = vm_mmap(filp, addr, len, prot, flags, pgoff << PAGE_SHIFT);
return IS_ERR_VALUE(addr) ? addr : 0;
}
@@ -223,7 +224,7 @@
addr = MMAP_VADDR(ring->user_vstart, request->usr_idx, 0);
len = request->nr_pages << PAGE_SHIFT;
- err = do_munmap(current->mm, addr, len);
+ err = vm_munmap(addr, len);
WARN_ON_ONCE(err);
}
@@ -597,10 +598,10 @@
poll_wait(filp, &tap->pool->wait, wait);
poll_wait(filp, &ring->poll_wait, wait);
- down_read(¤t->mm->mmap_sem);
+ mutex_lock(&ring->vma_lock);
if (ring->vma && tap->device.gd)
blktap_device_run_queue(tap, filp);
- up_read(¤t->mm->mmap_sem);
+ mutex_unlock(&ring->vma_lock);
work = ring->ring.req_prod_pvt - ring->ring.sring->req_prod;
RING_PUSH_REQUESTS(&ring->ring);
@@ -646,6 +647,7 @@
init_waitqueue_head(&ring->poll_wait);
ring->devno = MKDEV(blktap_ring_major, tap->minor);
+ mutex_init(&ring->vma_lock);
return 0;
}
--
Ben Hutchings
Teamwork is essential - it allows you to blame someone else.
signature.asc
Description: This is a digitally signed message part

