summaryrefslogtreecommitdiff
path: root/core/kmod
diff options
context:
space:
mode:
authorroot <root@rshg054.dnsready.net>2012-02-02 23:14:44 +0000
committerroot <root@rshg054.dnsready.net>2012-02-02 23:14:44 +0000
commit22e5f5bf64eba5c65674eeb3a8167de2854dbe0e (patch)
treeeb874eff6206b4a1557f42bc02ee9e54c43bc882 /core/kmod
parentac5ada660240f37d7347e42123071990f616e418 (diff)
Thu Feb 2 23:14:44 UTC 2012
Diffstat (limited to 'core/kmod')
-rw-r--r--core/kmod/0001-partially-fix-parsing-of-alias-with-dots.patch34
-rw-r--r--core/kmod/0002-libkmod-module-used-shared-code-in-module-creation.patch196
-rw-r--r--core/kmod/0003-modprobe-handle-all-error-returns-from-init_module.patch34
-rw-r--r--core/kmod/0004-modprobe-remove-0-refcnt-deps.patch52
-rw-r--r--core/kmod/PKGBUILD17
5 files changed, 331 insertions, 2 deletions
diff --git a/core/kmod/0001-partially-fix-parsing-of-alias-with-dots.patch b/core/kmod/0001-partially-fix-parsing-of-alias-with-dots.patch
new file mode 100644
index 000000000..b69d095d3
--- /dev/null
+++ b/core/kmod/0001-partially-fix-parsing-of-alias-with-dots.patch
@@ -0,0 +1,34 @@
+From cdaf4b2f3ef60365c6b8006a63410368a7b38f39 Mon Sep 17 00:00:00 2001
+From: Dave Reisner <dreisner@archlinux.org>
+Date: Tue, 31 Jan 2012 00:12:32 -0500
+Subject: [PATCH 1/4] partially fix parsing of alias with dots
+
+---
+ libkmod/libkmod-util.c | 4 +---
+ 1 files changed, 1 insertions(+), 3 deletions(-)
+
+diff --git a/libkmod/libkmod-util.c b/libkmod/libkmod-util.c
+index 7c2611b..6a9f697 100644
+--- a/libkmod/libkmod-util.c
++++ b/libkmod/libkmod-util.c
+@@ -134,8 +134,7 @@ inline int alias_normalize(const char *alias, char buf[PATH_MAX], size_t *len)
+ case ']':
+ return -EINVAL;
+ case '[':
+- while (alias[s] != ']' &&
+- alias[s] != '.' && alias[s] != '\0')
++ while (alias[s] != ']' && alias[s] != '\0')
+ s++;
+
+ if (alias[s] != ']')
+@@ -144,7 +143,6 @@ inline int alias_normalize(const char *alias, char buf[PATH_MAX], size_t *len)
+ s++;
+ break;
+ case '\0':
+- case '.':
+ goto finish;
+ default:
+ buf[s] = c;
+--
+1.7.9
+
diff --git a/core/kmod/0002-libkmod-module-used-shared-code-in-module-creation.patch b/core/kmod/0002-libkmod-module-used-shared-code-in-module-creation.patch
new file mode 100644
index 000000000..76cc35049
--- /dev/null
+++ b/core/kmod/0002-libkmod-module-used-shared-code-in-module-creation.patch
@@ -0,0 +1,196 @@
+From 1d2f64689b2456ade81d6d489c4f5bfb5fdb92fd Mon Sep 17 00:00:00 2001
+From: Dave Reisner <dreisner@archlinux.org>
+Date: Tue, 31 Jan 2012 00:13:43 -0500
+Subject: [PATCH 2/4] libkmod-module: used shared code in module creation
+
+---
+ libkmod/libkmod-module.c | 135 ++++++++++++++++++++++++++-------------------
+ 1 files changed, 78 insertions(+), 57 deletions(-)
+
+diff --git a/libkmod/libkmod-module.c b/libkmod/libkmod-module.c
+index 47b1709..48e4aa1 100644
+--- a/libkmod/libkmod-module.c
++++ b/libkmod/libkmod-module.c
+@@ -162,6 +162,76 @@ fail:
+ return err;
+ }
+
++/*
++ * Memory layout with alias:
++ *
++ * struct kmod_module {
++ * hashkey -----.
++ * alias -----. |
++ * name ----. | |
++ * } | | |
++ * name <----------' | |
++ * alias <-----------' |
++ * name\alias <--------'
++ *
++ * Memory layout without alias:
++ *
++ * struct kmod_module {
++ * hashkey ---.
++ * alias -----|----> NULL
++ * name ----. |
++ * } | |
++ * name <----------'-'
++ *
++ * @key is "name\alias" or "name" (in which case alias == NULL)
++ */
++static int kmod_module_new(struct kmod_ctx *ctx, const char *key,
++ const char *name, size_t namelen,
++ const char *alias, size_t aliaslen,
++ struct kmod_module **mod)
++{
++ struct kmod_module *m;
++ size_t keylen;
++
++ m = kmod_pool_get_module(ctx, key);
++ if (m != NULL) {
++ *mod = kmod_module_ref(m);
++ return 0;
++ }
++
++ if (alias == NULL)
++ keylen = namelen;
++ else
++ keylen = namelen + aliaslen + 1;
++
++ m = malloc(sizeof(*m) + (alias == NULL ? 1 : 2) * (keylen + 1));
++ if (m == NULL) {
++ free(m);
++ return -ENOMEM;
++ }
++
++ memset(m, 0, sizeof(*m));
++
++ m->ctx = kmod_ref(ctx);
++ m->name = (char *)m + sizeof(*m);
++ memcpy(m->name, key, keylen + 1);
++ if (alias == NULL) {
++ m->hashkey = m->name;
++ m->alias = NULL;
++ } else {
++ m->name[namelen] = '\0';
++ m->alias = m->name + namelen + 1;
++ m->hashkey = m->name + keylen + 1;
++ memcpy(m->hashkey, key, keylen + 1);
++ }
++
++ m->refcount = 1;
++ kmod_pool_add_module(ctx, m, m->hashkey);
++ *mod = m;
++
++ return 0;
++}
++
+ /**
+ * kmod_module_new_from_name:
+ * @ctx: kmod library context
+@@ -188,54 +258,15 @@ KMOD_EXPORT int kmod_module_new_from_name(struct kmod_ctx *ctx,
+ const char *name,
+ struct kmod_module **mod)
+ {
+- struct kmod_module *m;
+ size_t namelen;
+ char name_norm[PATH_MAX];
+- char *namesep;
+
+ if (ctx == NULL || name == NULL || mod == NULL)
+ return -ENOENT;
+
+- if (alias_normalize(name, name_norm, &namelen) < 0) {
+- DBG(ctx, "invalid alias: %s\n", name);
+- return -EINVAL;
+- }
++ modname_normalize(name, name_norm, &namelen);
+
+- m = kmod_pool_get_module(ctx, name_norm);
+- if (m != NULL) {
+- *mod = kmod_module_ref(m);
+- return 0;
+- }
+-
+- namesep = strchr(name_norm, '/');
+- m = malloc(sizeof(*m) + (namesep == NULL ? 1 : 2) * namelen + 2);
+- if (m == NULL) {
+- free(m);
+- return -ENOMEM;
+- }
+-
+- memset(m, 0, sizeof(*m));
+-
+- m->ctx = kmod_ref(ctx);
+- m->name = (char *)m + sizeof(*m);
+- memcpy(m->name, name_norm, namelen + 1);
+-
+- if (namesep) {
+- size_t len = namesep - name_norm;
+-
+- m->name[len] = '\0';
+- m->alias = m->name + len + 1;
+- m->hashkey = m->name + namelen + 1;
+- memcpy(m->hashkey, name_norm, namelen + 1);
+- } else {
+- m->hashkey = m->name;
+- }
+-
+- m->refcount = 1;
+- kmod_pool_add_module(ctx, m, m->hashkey);
+- *mod = m;
+-
+- return 0;
++ return kmod_module_new(ctx, name_norm, name_norm, namelen, NULL, 0, mod);
+ }
+
+ int kmod_module_new_from_alias(struct kmod_ctx *ctx, const char *alias,
+@@ -251,9 +282,9 @@ int kmod_module_new_from_alias(struct kmod_ctx *ctx, const char *alias,
+
+ memcpy(key, name, namelen);
+ memcpy(key + namelen + 1, alias, aliaslen + 1);
+- key[namelen] = '/';
++ key[namelen] = '\\';
+
+- err = kmod_module_new_from_name(ctx, key, mod);
++ err = kmod_module_new(ctx, key, name, namelen, alias, aliaslen, mod);
+ if (err < 0)
+ return err;
+
+@@ -323,7 +354,7 @@ KMOD_EXPORT int kmod_module_new_from_path(struct kmod_ctx *ctx,
+ free(abspath);
+ else {
+ ERR(ctx, "kmod_module '%s' already exists with different path: new-path='%s' old-path='%s'\n",
+- name, abspath, m->path);
++ name, abspath, m->path);
+ free(abspath);
+ return -EEXIST;
+ }
+@@ -332,21 +363,11 @@ KMOD_EXPORT int kmod_module_new_from_path(struct kmod_ctx *ctx,
+ return 0;
+ }
+
+- m = malloc(sizeof(*m) + namelen + 1);
+- if (m == NULL)
+- return -errno;
+-
+- memset(m, 0, sizeof(*m));
++ err = kmod_module_new(ctx, name, name, namelen, NULL, 0, &m);
++ if (err < 0)
++ return err;
+
+- m->ctx = kmod_ref(ctx);
+- m->name = (char *)m + sizeof(*m);
+- memcpy(m->name, name, namelen + 1);
+ m->path = abspath;
+- m->hashkey = m->name;
+- m->refcount = 1;
+-
+- kmod_pool_add_module(ctx, m, m->hashkey);
+-
+ *mod = m;
+
+ return 0;
+--
+1.7.9
+
diff --git a/core/kmod/0003-modprobe-handle-all-error-returns-from-init_module.patch b/core/kmod/0003-modprobe-handle-all-error-returns-from-init_module.patch
new file mode 100644
index 000000000..5bbc93a90
--- /dev/null
+++ b/core/kmod/0003-modprobe-handle-all-error-returns-from-init_module.patch
@@ -0,0 +1,34 @@
+From fdf78d80d298353c29e1fe8c00602669dd9662bb Mon Sep 17 00:00:00 2001
+From: Dave Reisner <dreisner@archlinux.org>
+Date: Mon, 30 Jan 2012 23:05:26 -0500
+Subject: [PATCH 3/4] modprobe: handle all error returns from init_module
+
+---
+ tools/kmod-modprobe.c | 4 +++-
+ 1 files changed, 3 insertions(+), 1 deletions(-)
+
+diff --git a/tools/kmod-modprobe.c b/tools/kmod-modprobe.c
+index 3e51506..c882856 100644
+--- a/tools/kmod-modprobe.c
++++ b/tools/kmod-modprobe.c
+@@ -551,6 +551,8 @@ static int insmod_do_insert_module(struct kmod_module *mod, const char *opts)
+
+ err = kmod_module_insert_module(mod, flags, opts);
+ switch (err) {
++ case 0:
++ break;
+ case -EEXIST:
+ /*
+ * We checked for EEXIST with an earlier call to
+@@ -564,7 +566,7 @@ static int insmod_do_insert_module(struct kmod_module *mod, const char *opts)
+ ERR("Module %s already in kernel.\n",
+ kmod_module_get_name(mod));
+ break;
+- case -EPERM:
++ default:
+ ERR("could not insert '%s': %s\n", kmod_module_get_name(mod),
+ strerror(-err));
+ break;
+--
+1.7.9
+
diff --git a/core/kmod/0004-modprobe-remove-0-refcnt-deps.patch b/core/kmod/0004-modprobe-remove-0-refcnt-deps.patch
new file mode 100644
index 000000000..80cc73130
--- /dev/null
+++ b/core/kmod/0004-modprobe-remove-0-refcnt-deps.patch
@@ -0,0 +1,52 @@
+From 4e3dd21aff55b5bbaa08b037fc2a5625bfffc0a5 Mon Sep 17 00:00:00 2001
+From: Dave Reisner <dreisner@archlinux.org>
+Date: Mon, 30 Jan 2012 23:39:30 -0500
+Subject: [PATCH 4/4] modprobe: remove 0 refcnt deps
+
+---
+ tools/kmod-modprobe.c | 15 +++++++++++++--
+ 1 files changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/tools/kmod-modprobe.c b/tools/kmod-modprobe.c
+index c882856..bd991a5 100644
+--- a/tools/kmod-modprobe.c
++++ b/tools/kmod-modprobe.c
+@@ -381,7 +381,7 @@ static int rmmod_do_deps_list(struct kmod_list *list, bool stop_on_errors)
+ static int rmmod_do_module(struct kmod_module *mod, bool do_dependencies)
+ {
+ const char *modname = kmod_module_get_name(mod);
+- struct kmod_list *pre = NULL, *post = NULL;
++ struct kmod_list *pre = NULL, *post = NULL, *deps, *itr;
+ const char *cmd = NULL;
+ int err;
+
+@@ -422,7 +422,7 @@ static int rmmod_do_module(struct kmod_module *mod, bool do_dependencies)
+ rmmod_do_deps_list(post, false);
+
+ if (do_dependencies && remove_dependencies) {
+- struct kmod_list *deps = kmod_module_get_dependencies(mod);
++ deps = kmod_module_get_dependencies(mod);
+
+ err = rmmod_do_deps_list(deps, true);
+ if (err < 0)
+@@ -451,6 +451,17 @@ static int rmmod_do_module(struct kmod_module *mod, bool do_dependencies)
+
+ rmmod_do_deps_list(pre, false);
+
++ deps = kmod_module_get_dependencies(mod);
++ if (deps != NULL) {
++ kmod_list_foreach_reverse(itr, deps) {
++ struct kmod_module *dep = kmod_module_get_module(itr);
++ if (kmod_module_get_refcnt(dep) == 0)
++ rmmod_do_remove_module(dep);
++ kmod_module_unref(dep);
++ }
++ kmod_module_unref_list(deps);
++ }
++
+ error:
+ kmod_module_unref_list(pre);
+ kmod_module_unref_list(post);
+--
+1.7.9
+
diff --git a/core/kmod/PKGBUILD b/core/kmod/PKGBUILD
index 5147f866f..ac327eac1 100644
--- a/core/kmod/PKGBUILD
+++ b/core/kmod/PKGBUILD
@@ -1,9 +1,9 @@
-# $Id: PKGBUILD 147035 2012-01-21 00:32:01Z dreisner $
+# $Id: PKGBUILD 148463 2012-02-01 13:16:33Z dreisner $
# Maintainer: Dave Reisner <dreisner@archlinux.org>
pkgname=kmod
pkgver=4
-pkgrel=1
+pkgrel=2
pkgdesc="Linux kernel module handling"
arch=('i686' 'x86_64')
url="http://git.profusion.mobi/cgit.cgi/kmod.git"
@@ -15,13 +15,26 @@ provides=('module-init-tools=3.16')
conflicts=('module-init-tools')
replaces=('module-init-tools')
source=("http://packages.profusion.mobi/$pkgname/$pkgname-$pkgver.tar.xz"
+ 0001-partially-fix-parsing-of-alias-with-dots.patch
+ 0002-libkmod-module-used-shared-code-in-module-creation.patch
+ 0003-modprobe-handle-all-error-returns-from-init_module.patch
+ 0004-modprobe-remove-0-refcnt-deps.patch
"depmod-search.conf")
md5sums=('e14450a066a48accd0af1995b3c0232d'
+ '5f497ab3466ee1a616b6e6c97b330706'
+ '23a9257a152862753ce4c4ee7287761a'
+ '3a57671b0f37b1203b207f35a4442ae3'
+ '1fe88eee9302104b179124ce6bfc55d2'
'4b8cbcbc54b9029c99fd730e257d4436')
build() {
cd "$pkgname-$pkgver"
+ patch -Np1 <"$srcdir/0001-partially-fix-parsing-of-alias-with-dots.patch"
+ patch -Np1 <"$srcdir/0002-libkmod-module-used-shared-code-in-module-creation.patch"
+ patch -Np1 <"$srcdir/0003-modprobe-handle-all-error-returns-from-init_module.patch"
+ patch -Np1 <"$srcdir/0004-modprobe-remove-0-refcnt-deps.patch"
+
./configure \
--sysconfdir=/etc \
--with-rootprefix= \