summaryrefslogtreecommitdiff
blob: b5f8c7b5a6d6c8eb6c092d7afd94182db7431352 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# Copyright 1999-2010 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: $

EAPI="2"

inherit eutils linux-mod

DESCRIPTION="An entirely re-designed and re-implemented Unionfs."
HOMEPAGE="http://aufs.sourceforge.net/"
SRC_URI="http://www.fh-kl.de/~torsten.kockler/gentoo/${P}.tar.bz2"

LICENSE="GPL-2"
SLOT="0"
KEYWORDS="~amd64 ~x86"
IUSE="hinotify ksize nfs nfsexport"

MODULE_NAMES="aufs(addon/fs/${PN}:)"
BUILD_PARAMS="KDIR=${KV_DIR} -f local.mk"
BUILD_TARGETS="all"

check_patch() {
	get_version

	# Check if ksize Patch has to be applied
	if use ksize ; then
		APPLY_KSIZE_PATCH="n"
		# If ksize patch is not applied
		if ! grep -qs "EXPORT_SYMBOL(ksize);" "${KV_DIR}/mm/slab.c" ; then
			APPLY_KSIZE_PATCH="y"
		fi
	fi

	# Check if lhash Patch has to be applied
	if use nfs && kernel_is ge 2 6 19 ; then
		APPLY_LHASH_PATCH="n"
		# If lhash patch is not applied
		if ! grep -qs "EXPORT_SYMBOL(__lookup_hash);" "${KV_DIR}/fs/namei.c" \
		&& ! grep -qs "struct dentry * __lookup_hash(struct qstr *name, struct dentry
		* base, struct nameidata *nd);" "${KV_DIR}/fs/namei.h" ; then
			APPLY_LHASH_PATCH="y"
		fi
	fi
}

pkg_setup() {
	# kernel version check
	if kernel_is lt 2 6 16 ; then
		eerror "${PN} is being developed and tested on linux-2.6.16 and later."
		eerror "Make sure you have a proper kernel version!"
		die "Wrong kernel version"
	fi

	check_patch

	# If a patch has to be applied
	if [[ ${APPLY_KSIZE_PATCH} == "y" ]] || [[ ${APPLY_LHASH_PATCH} == "y" ]] ; then
		ewarn "Patching your kernel..."
		cd ${KV_DIR}
	fi

	# If the ksize patch has to be applied
	if [[ ${APPLY_KSIZE_PATCH} == "y" ]] ; then
		epatch "${FILESDIR}"/${P}-ksize.patch
	fi

	# If the lhash patch has to be applied
	if [[ ${APPLY_LHASH_PATCH} == "y" ]] ; then
		epatch "${FILESDIR}"/${P}-lhash.patch
	fi

	linux-mod_pkg_setup
}

src_unpack(){
	unpack ${A}
	cd "${S}"

	# Enable ksize Patch in priv_def.mk
	if use ksize ; then
		echo "CONFIG_AUFS_KSIZE_PATCH = y" >> priv_def.mk || die "setting ksize in priv_def.mk failed!"
	fi

	# Enable lhash Patch in priv_def.mk
	if use nfs && kernel_is ge 2 6 19 ; then
		echo "CONFIG_AUFS_LHASH_PATCH = y" >> priv_def.mk || die "setting lhash in priv_def.mk failed!"
	fi

	# Enable hinotify in priv_def.mk
	if use hinotify && kernel_is ge 2 6 18 ; then
		echo "CONFIG_AUFS_HINOTIFY = y" >> priv_def.mk || die "setting hinotify in priv_def.mk failed!"
	fi

	# Enable nfsexport in priv_def.mk
	if use nfsexport && kernel_is ge 2 6 18 ; then
		echo "CONFIG_AUFS_EXPORT = y" >> priv_def.mk || die "setting nfsexport in priv_def.mk failed!"
	fi

	# Disable SYSAUFS for kernel less than 2.6.18
	if kernel_is lt 2 6 18 ; then
		echo "CONFIG_AUFS_SYSAUFS = " >> priv_def.mk || die "unsetting sysaufs in priv_def.mk failed!"
	fi

	# Check if a vserver-kernel is installed
	if [[ -e ${KV_DIR}/include/linux/vserver ]] ; then
		einfo "vserver kernel seems to be installed"
		einfo "using vserver patch"
		echo "AUFS_DEF_CONFIG = -DVSERVER" >> priv_def.mk || die "setting vserver in priv_def.mk failed!"
	fi
}

src_install() {
	exeinto /sbin
	exeopts -m0500
	doexe mount.aufs umount.aufs auplink aulchown || die
	doman aufs.5 || die
	linux-mod_src_install
}

pkg_postinst() {
	elog "To be able to use aufs, you have to load the kernel module by typing:"
	elog "modprobe aufs"
	elog "For further information refer to the aufs man page"

	# Tell the user to recompile his kernel
	if [[ ${APPLY_KSIZE_PATCH} == "y" ]] || [[ ${APPLY_LHASH_PATCH} == "y" ]] ; then
		echo
		ewarn "Remember to re-compile your kernel to make the patch(es) work"
		ewarn
	fi

	linux-mod_pkg_postinst
}

pkg_prerm() {
	[[ $(has_version "${CATEGORY}/${PF}"[ksize]) || $(has_version
	"${CATEGORY}"/"${PF}"[nfs])  ]] && DO_CHECK="y"
}

pkg_postrm() {
	# Tell the user that his kernel has already been patched
	if [[ DO_CHECK == "y" ]] ; then
		check_patch
		if [[ ${APPLY_KSIZE_PATCH} == "n" ]] || [[ ${APPLY_LHASH_PATCH} == "n" ]] ; then
			ewarn "Your kernel has been patched previously by this ebuild."
			ewarn "You can undo the patches by executing the following:"
			echo
			ewarn "cd ${KV_DIR}; make mrproper, re-emerge and re-compile your kernel - ${KV_FULL}"
		fi
	fi

	linux-mod_pkg_postrm
}