added core/kmod 4-2.1

This commit is contained in:
Kevin Mihelich 2012-02-02 19:59:03 -05:00
parent bfcc68ac23
commit 512a503664
7 changed files with 456 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

77
core/kmod/PKGBUILD Normal file
View file

@ -0,0 +1,77 @@
# $Id: PKGBUILD 148462 2012-02-01 13:16:32Z dreisner $
# Maintainer: Dave Reisner <dreisner@archlinux.org>
# ALARM: Kevin Mihelich <kevin@archlinuxarm.org>
# - fix for v5, credit: ambrop7 (issue #127)
plugrel=1
pkgname=kmod
pkgver=4
pkgrel=2.1
pkgdesc="Linux kernel module handling"
arch=('i686' 'x86_64')
url="http://git.profusion.mobi/cgit.cgi/kmod.git"
license=('GPL2')
depends=('glibc' 'zlib')
makedepends=('docbook2x')
options=('!libtool')
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
v5-alignment-fix.patch
"depmod-search.conf")
md5sums=('e14450a066a48accd0af1995b3c0232d'
'5f497ab3466ee1a616b6e6c97b330706'
'23a9257a152862753ce4c4ee7287761a'
'3a57671b0f37b1203b207f35a4442ae3'
'1fe88eee9302104b179124ce6bfc55d2'
'99d003b8337d9372b043b0d449a6b59a'
'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"
[[ $CARCH == "arm" ]] && patch -p1 -i "${srcdir}/v5-alignment-fix.patch"
./configure \
--sysconfdir=/etc \
--with-rootprefix= \
--with-zlib
make
}
check() {
make -C "$pkgname-$pkgver" check
}
package() {
make -C "$pkgname-$pkgver" DESTDIR="$pkgdir" install
# binary directories
install -dm755 "$pkgdir"/{,s}bin
# configuration directories
install -dm755 "$pkgdir"/{etc,lib}/{depmod,modprobe}.d
# add symlinks to kmod
ln -s /usr/bin/kmod "$pkgdir/bin/lsmod"
for tool in {ins,rm,dep}mod mod{info,probe}; do
ln -s ../usr/bin/kmod "$pkgdir/sbin/$tool"
done
# install depmod.d file for search/ dir
install -Dm644 "$srcdir/depmod-search.conf" "$pkgdir/lib/depmod.d/search.conf"
}
# vim: ft=sh syn=sh et

View file

@ -0,0 +1,5 @@
#
# /etc/depmod.d/depmod.conf
#
search updates extramodules built-in

View file

@ -0,0 +1,58 @@
diff --git a/libkmod/libkmod-hash.c b/libkmod/libkmod-hash.c
index f58e9db..8f647b4 100644
--- a/libkmod/libkmod-hash.c
+++ b/libkmod/libkmod-hash.c
@@ -83,6 +83,10 @@ void hash_free(struct hash *hash)
free(hash);
}
+struct unaligned_short {
+ unsigned short v;
+} __attribute__((packed));
+
static inline unsigned int hash_superfast(const char *key, unsigned int len)
{
/* Paul Hsieh (http://www.azillionmonkeys.com/qed/hash.html)
@@ -90,14 +94,14 @@ static inline unsigned int hash_superfast(const char *key, unsigned int len)
* EFL's eina and possible others.
*/
unsigned int tmp, hash = len, rem = len & 3;
- const unsigned short *itr = (const unsigned short *)key;
+ const struct unaligned_short *itr = (const unsigned short *)key;
len /= 4;
/* Main loop */
for (; len > 0; len--) {
- hash += itr[0];
- tmp = (itr[1] << 11) ^ hash;
+ hash += itr[0].v;
+ tmp = (itr[1].v << 11) ^ hash;
hash = (hash << 16) ^ tmp;
itr += 2;
hash += hash >> 11;
@@ -106,14 +110,14 @@ static inline unsigned int hash_superfast(const char *key, unsigned int len)
/* Handle end cases */
switch (rem) {
case 3:
- hash += *itr;
+ hash += itr->v;
hash ^= hash << 16;
hash ^= key[2] << 18;
hash += hash >> 11;
break;
case 2:
- hash += *itr;
+ hash += itr->v;
hash ^= hash << 11;
hash += hash >> 17;
break;
@@ -243,6 +247,7 @@ void *hash_find(const struct hash *hash, const char *key)
if (entry == NULL)
return NULL;
return (void *)entry->value;
+
}
int hash_del(struct hash *hash, const char *key)