diff options
author | Natanael Copa <ncopa@alpinelinux.org> | 2011-05-27 14:01:15 +0000 |
---|---|---|
committer | Natanael Copa <ncopa@alpinelinux.org> | 2011-05-27 14:01:15 +0000 |
commit | bae2bf4baba677c57de6f9bc086c2ce9693b349b (patch) | |
tree | eccfa52ce7ac10f4b98742807a619ea04f6840e8 /main/apk-tools | |
parent | 9be2ab52dcb8e6f2863a79374e995db437fb6240 (diff) | |
download | aports-bae2bf4baba677c57de6f9bc086c2ce9693b349b.tar.bz2 aports-bae2bf4baba677c57de6f9bc086c2ce9693b349b.tar.xz |
main/apk-tools: misc fixes for apk cache and remount rw/ro
Diffstat (limited to 'main/apk-tools')
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" |