[PC周辺] VMware Workstation 4.5.3 build-19414 + vmware-any-any-update110 + Linux 2.6.22 git 20070720版 (mm_struct.dumpable and unregister_chrdev) (20070721)

まず,vmmon の compile で

Using 2.6.x kernel build system.
make: ディレクトリ `/tmp/vmware-config0/vmmon-only' に入ります
make -C /usr/src/linux-headers-2.6.22-2007072001/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.22-2007072001' に入ります
  CC [M]  /tmp/vmware-config0/vmmon-only/linux/driver.o
/tmp/vmware-config0/vmmon-only/linux/driver.c: In function '__LinuxDriver_Ioctl':
/tmp/vmware-config0/vmmon-only/linux/driver.c:1833: error: 'struct mm_struct' has no member named 'dumpable'
make[2]: *** [/tmp/vmware-config0/vmmon-only/linux/driver.o] エラー 1
make[1]: *** [_module_/tmp/vmware-config0/vmmon-only] エラー 2
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.22-2007072001' から出ます
make: *** [vmmon.ko] エラー 2
make: ディレクトリ `/tmp/vmware-config0/vmmon-only' から出ます
Unable to build the vmmon module.

とかでこける.これは <URL:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=6c5d523826dc639df709ed0f88c5d2ce25379652> の影響.mm_struct.dumpable に変更があったとのこと.

diff -uwr vmmon-only/linux/driver.c vmmon-only.new/linux/driver.c
--- vmmon-only/linux/driver.c   2007-04-09 10:20:35.000000000 +0900
+++ vmmon-only.new/linux/driver.c       2007-07-21 18:18:34.000000000 +0900
@@ -1494,6 +1494,26 @@
  */

 #include <linux/sched.h>
+static void set_dumpable0(struct mm_struct *mm, int value)
+{
+       switch (value) {
+       case 0:
+               clear_bit(MMF_DUMPABLE, &mm->flags);
+               smp_wmb();
+               clear_bit(MMF_DUMP_SECURELY, &mm->flags);
+               break;
+       case 1:
+               set_bit(MMF_DUMPABLE, &mm->flags);
+               smp_wmb();
+               clear_bit(MMF_DUMP_SECURELY, &mm->flags);
+               break;
+       case 2:
+               set_bit(MMF_DUMP_SECURELY, &mm->flags);
+               smp_wmb();
+               set_bit(MMF_DUMPABLE, &mm->flags);
+               break;
+       }
+}
 static int
 __LinuxDriver_Ioctl(
                   struct file *filp,
@@ -1830,7 +1850,7 @@
           current->egid == current->gid &&
          current->fsgid == current->gid) {
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 7)
-        current->mm->dumpable = 1;
+        set_dumpable0(current->mm, 1);
 #else
         current->dumpable = 1;
 #endif

という感じでやるきなしなし対応.

set_dumpable(current->mm, 1);

として,include/linux/sched.h に用意されているっぽい

extern void set_dumpable(struct mm_struct *mm, int value);

を使ってもいいのだけれども,insmod 時に

vmmon: Unknown symbol set_dumpable

とかでこけるようになる(上記 pache は fs/exec.c から set_dumpable を copy して流用している).

次に,vmnet の compile で,

make: ディレクトリ `/tmp/vmware-config0/vmnet-only' に入ります
make -C /usr/src/linux-headers-2.6.22-2007072001/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. modules
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.22-2007072001' に入ります
  CC [M]  /tmp/vmware-config0/vmnet-only/driver.o
/tmp/vmware-config0/vmnet-only/driver.c: In function 'cleanup_module':
/tmp/vmware-config0/vmnet-only/driver.c:531: error: void value not ignored as it ought to be
make[2]: *** [/tmp/vmware-config0/vmnet-only/driver.o] エラー 1
make[1]: *** [_module_/tmp/vmware-config0/vmnet-only] エラー 2
make[1]: ディレクトリ `/usr/src/linux-headers-2.6.22-2007072001' から出ます
make: *** [vmnet.ko] エラー 2
make: ディレクトリ `/tmp/vmware-config0/vmnet-only' から出ます
Unable to build the vmnet module.

とかでこける.これは <URL:http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e53252d97e670a38b1d2e9723b48077bba11ddda>

-extern int unregister_chrdev(unsigned int, const char *);
+extern void unregister_chrdev(unsigned int, const char *);

といった変更による.ということで,

diff -uwr vmnet-only/driver.c vmnet-only.new/driver.c
--- vmnet-only/driver.c 2007-05-14 15:03:03.000000000 +0900
+++ vmnet-only.new/driver.c     2007-07-21 18:29:45.000000000 +0900
@@ -528,11 +528,7 @@
    int retval;

    unregister_ioctl32_handlers();
-   retval =  unregister_chrdev(VNET_MAJOR_NUMBER, "vmnet");
-   if (retval != 0 ) {
-      LOG(0, (KERN_WARNING "/dev/vmnet: could not unregister major device %d\n", 
-             VNET_MAJOR_NUMBER));
-   }
+   unregister_chrdev(VNET_MAJOR_NUMBER, "vmnet");
    VNetProtoUnregister();
    VNetProc_Cleanup();
 #ifdef CONFIG_NETFILTER

といった感じに.


Last-modified: Thu Aug 02 15:01:04 +0900 2007

全インデックス