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
|
--- a/fs/aufs/dynop.c 2012-10-09 15:41:32.652989534 -0400
+++ b/fs/aufs/dynop.c 2012-10-09 15:41:58.562989820 -0400
@@ -149,9 +149,11 @@
#define DySet(func, dst, src, h_op, h_sb) do { \
DyDbgInc(cnt); \
if (h_op->func) { \
- if (src.func) \
- dst.func = src.func; \
- else \
+ if (src.func) { \
+ pax_open_kernel(); \
+ *(void **)&dst.func = src.func; \
+ pax_close_kernel(); \
+ } else \
AuDbg("%s %s\n", au_sbtype(h_sb), #func); \
} \
} while (0)
@@ -159,7 +161,9 @@
#define DySetForce(func, dst, src) do { \
AuDebugOn(!src.func); \
DyDbgInc(cnt); \
- dst.func = src.func; \
+ pax_open_kernel(); \
+ *(void **)&dst.func = src.func; \
+ pax_close_kernel(); \
} while (0)
#define DySetAop(func) \
@@ -266,15 +270,17 @@
*/
static void dy_adx(struct au_dyaop *dyaop, int do_dx)
{
+ pax_open_kernel();
if (!do_dx) {
- dyaop->da_op.direct_IO = NULL;
- dyaop->da_op.get_xip_mem = NULL;
+ *(void **)&dyaop->da_op.direct_IO = NULL;
+ *(void **)&dyaop->da_op.get_xip_mem = NULL;
} else {
- dyaop->da_op.direct_IO = aufs_aop.direct_IO;
- dyaop->da_op.get_xip_mem = aufs_aop.get_xip_mem;
+ *(void **)&dyaop->da_op.direct_IO = aufs_aop.direct_IO;
+ *(void **)&dyaop->da_op.get_xip_mem = aufs_aop.get_xip_mem;
if (!dyaop->da_get_xip_mem)
- dyaop->da_op.get_xip_mem = NULL;
+ *(void **)&dyaop->da_op.get_xip_mem = NULL;
}
+ pax_close_kernel();
}
static struct au_dyaop *dy_aget(struct au_branch *br,
--- a/fs/aufs/f_op_sp.c 2012-10-09 15:41:32.652989534 -0400
+++ b/fs/aufs/f_op_sp.c 2012-10-09 15:41:58.562989820 -0400
@@ -104,7 +104,7 @@
static int aufs_open_sp(struct inode *inode, struct file *file);
static struct au_sp_fop {
int done;
- struct file_operations fop; /* not 'const' */
+ file_operations_no_const fop; /* not 'const' */
spinlock_t spin;
} au_sp_fop[AuSp_Last] = {
[AuSp_FIFO] = {
@@ -157,8 +157,10 @@
h_file = au_hf_top(file);
spin_lock(&p->spin);
if (!p->done) {
- p->fop = *h_file->f_op;
+ pax_open_kernel();
+ memcpy((void *)&p->fop, h_file->f_op, sizeof(p->fop));
p->fop.owner = THIS_MODULE;
+ pax_close_kernel();
if (p->fop.aio_read)
p->fop.aio_read = aufs_aio_read_sp;
if (p->fop.aio_write)
diff -Naur linux-3.8.3-pentoo/fs/aufs/sysfs.c linux-3.8.3-pentoo-aufsfix/fs/aufs/sysfs.c
--- linux-3.8.3-pentoo/fs/aufs/sysfs.c 2013-04-29 00:07:50.478827567 -0400
+++ linux-3.8.3-pentoo-aufsfix/fs/aufs/sysfs.c 2013-04-28 23:46:23.724793109 -0400
@@ -208,8 +208,10 @@
struct attribute *attr = &br->br_attr;
sysfs_attr_init(attr);
- attr->name = br->br_name;
- attr->mode = S_IRUGO;
+ pax_open_kernel();
+ *(void **)&attr->name = br->br_name;
+ *(void **)&attr->mode = S_IRUGO;
+ pax_close_kernel();
}
void sysaufs_brs_del(struct super_block *sb, aufs_bindex_t bindex)
|