summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2011-05-27 14:01:15 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2011-05-27 14:01:15 +0000
commitbae2bf4baba677c57de6f9bc086c2ce9693b349b (patch)
treeeccfa52ce7ac10f4b98742807a619ea04f6840e8
parent9be2ab52dcb8e6f2863a79374e995db437fb6240 (diff)
downloadaports-bae2bf4baba677c57de6f9bc086c2ce9693b349b.tar.bz2
aports-bae2bf4baba677c57de6f9bc086c2ce9693b349b.tar.xz
main/apk-tools: misc fixes for apk cache and remount rw/ro
ref #663 ref #662
-rw-r--r--main/apk-tools/0001-db-remount-read-only-after-the-file-handles-have-bee.patch45
-rw-r--r--main/apk-tools/0002-db-more-fix-for-read-only-cache-remounting.patch91
-rw-r--r--main/apk-tools/APKBUILD8
3 files changed, 142 insertions, 2 deletions
diff --git a/main/apk-tools/0001-db-remount-read-only-after-the-file-handles-have-bee.patch b/main/apk-tools/0001-db-remount-read-only-after-the-file-handles-have-bee.patch
new file mode 100644
index 000000000..45b75a332
--- /dev/null
+++ b/main/apk-tools/0001-db-remount-read-only-after-the-file-handles-have-bee.patch
@@ -0,0 +1,45 @@
+From 38e54240a38266c0c1864e51e4ca7468a429646e Mon Sep 17 00:00:00 2001
+From: Natanael Copa <ncopa@alpinelinux.org>
+Date: Fri, 27 May 2011 11:38:50 +0000
+Subject: [PATCH 1/2] db: remount read-only after the file handles have been
+ closed
+
+The apk cache might be on the readonly media so we need wait with
+remounting til after atleast this filehandle is closed.
+---
+ src/database.c | 12 ++++++------
+ 1 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/src/database.c b/src/database.c
+index 1d4c573..0fc59df 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -1397,12 +1397,6 @@ void apk_db_close(struct apk_database *db)
+ struct hlist_node *dc, *dn;
+ int i;
+
+- if (db->cache_remount_dir) {
+- do_remount(db->cache_remount_dir, "ro");
+- free(db->cache_remount_dir);
+- db->cache_remount_dir = NULL;
+- }
+-
+ apk_id_cache_free(&db->id_cache);
+
+ list_for_each_entry(ipkg, &db->installed.packages, installed_pkgs_list) {
+@@ -1436,6 +1430,12 @@ void apk_db_close(struct apk_database *db)
+ close(db->lock_fd);
+ if (db->root != NULL)
+ free(db->root);
++
++ if (db->cache_remount_dir) {
++ do_remount(db->cache_remount_dir, "ro");
++ free(db->cache_remount_dir);
++ db->cache_remount_dir = NULL;
++ }
+ }
+
+ static int fire_triggers(apk_hash_item item, void *ctx)
+--
+1.7.5.2
+
diff --git a/main/apk-tools/0002-db-more-fix-for-read-only-cache-remounting.patch b/main/apk-tools/0002-db-more-fix-for-read-only-cache-remounting.patch
new file mode 100644
index 000000000..7fee4d735
--- /dev/null
+++ b/main/apk-tools/0002-db-more-fix-for-read-only-cache-remounting.patch
@@ -0,0 +1,91 @@
+From 95555ede4d732878d576415e5d338b0104b78ad6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <timo.teras@iki.fi>
+Date: Fri, 27 May 2011 16:49:25 +0300
+Subject: [PATCH 2/2] db: more fix for read-only cache remounting
+
+remount to read-write before trying to create the cache directory
+subdirs. fix a fd leak that might prevent remounting back to rw.
+---
+ src/apk_database.h | 1 -
+ src/database.c | 31 ++++++++++++++-----------------
+ src/url.c | 1 +
+ 3 files changed, 15 insertions(+), 18 deletions(-)
+
+diff --git a/src/apk_database.h b/src/apk_database.h
+index 9b032e7..b28a77b 100644
+--- a/src/apk_database.h
++++ b/src/apk_database.h
+@@ -110,7 +110,6 @@ struct apk_database {
+ apk_blob_t *arch;
+ unsigned int local_repos;
+ int permanent : 1;
+- int ro_cache : 1;
+ int compat_newfeatures : 1;
+ int compat_notinstallable : 1;
+
+diff --git a/src/database.c b/src/database.c
+index 0fc59df..9617b4e 100644
+--- a/src/database.c
++++ b/src/database.c
+@@ -1218,10 +1218,22 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
+
+ db->cache_dir = apk_linked_cache_dir;
+ db->cache_fd = fd;
++ if ((dbopts->open_flags & (APK_OPENF_WRITE | APK_OPENF_CACHE_WRITE)) &&
++ fstatvfs(fd, &stvfs) == 0 && (stvfs.f_flag & ST_RDONLY) != 0) {
++ /* remount cache read-write */
++ db->cache_remount_dir = find_mountpoint(db->root_fd, db->cache_dir);
++ if (db->cache_remount_dir == NULL) {
++ apk_warning("Unable to find cache directory mount point");
++ } else if (do_remount(db->cache_remount_dir, "rw") != 0) {
++ free(db->cache_remount_dir);
++ db->cache_remount_dir = NULL;
++ apk_error("Unable to remount cache read-write");
++ r = EROFS;
++ goto ret_r;
++ }
++ }
+ mkdirat(db->cache_fd, "tmp", 0644);
+ db->cachetmp_fd = openat(db->cache_fd, "tmp", O_RDONLY | O_CLOEXEC);
+- if (fstatvfs(fd, &stvfs) == 0 && (stvfs.f_flag & ST_RDONLY) != 0)
+- db->ro_cache = 1;
+ } else {
+ if (fd >= 0)
+ close(fd);
+@@ -1264,21 +1276,6 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
+ }
+ }
+
+- if ((dbopts->open_flags & (APK_OPENF_WRITE | APK_OPENF_CACHE_WRITE)) &&
+- db->ro_cache) {
+- /* remount cache read-write */
+- db->cache_remount_dir = find_mountpoint(db->root_fd, db->cache_dir);
+- if (db->cache_remount_dir == NULL) {
+- apk_warning("Unable to find cache directory mount point");
+- } else if (do_remount(db->cache_remount_dir, "rw") != 0) {
+- free(db->cache_remount_dir);
+- db->cache_remount_dir = NULL;
+- apk_error("Unable to remount cache read-write");
+- r = EROFS;
+- goto ret_r;
+- }
+- }
+-
+ if (!(dbopts->open_flags & APK_OPENF_NO_SYS_REPOS)) {
+ list_for_each_entry(repo, &dbopts->repository_list, list) {
+ r = apk_db_add_repository(db, APK_BLOB_STR(repo->url));
+diff --git a/src/url.c b/src/url.c
+index 0a17a7a..1fa9d66 100644
+--- a/src/url.c
++++ b/src/url.c
+@@ -136,6 +136,7 @@ int apk_url_download(const char *url, int atfd, const char *file)
+ exit(0);
+ }
+
++ close(fd);
+ waitpid(pid, &status, 0);
+ status = translate_wget(status);
+ if (status != 0) {
+--
+1.7.5.2
+
diff --git a/main/apk-tools/APKBUILD b/main/apk-tools/APKBUILD
index f677bfae3..33dbef2c1 100644
--- a/main/apk-tools/APKBUILD
+++ b/main/apk-tools/APKBUILD
@@ -1,12 +1,14 @@
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=apk-tools
pkgver=2.1.0
-pkgrel=0
+pkgrel=1
pkgdesc="Alpine Package Keeper - package manager for alpine"
subpackages="$pkgname-static"
depends=
makedepends="zlib-dev openssl-dev pkgconfig"
source="http://git.alpinelinux.org/cgit/$pkgname.git/snapshot/$pkgname-$pkgver.tar.bz2
+ 0001-db-remount-read-only-after-the-file-handles-have-bee.patch
+ 0002-db-more-fix-for-read-only-cache-remounting.patch
"
url="http://git.alpinelinux.org/cgit/apk-tools/"
@@ -48,4 +50,6 @@ static() {
"$subpkgdir"/sbin/apk.static
}
-md5sums="9f6d71c9be814afece7a4b73430bd078 apk-tools-2.1.0.tar.bz2"
+md5sums="9f6d71c9be814afece7a4b73430bd078 apk-tools-2.1.0.tar.bz2
+6eb78a324be996c831d4850c81ad5821 0001-db-remount-read-only-after-the-file-handles-have-bee.patch
+9ca0a44c17b43e95a7f1bd8107db74da 0002-db-more-fix-for-read-only-cache-remounting.patch"