diff options
author | Jeff Dike <jdike@addtoit.com> | 2007-07-23 21:43:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-24 15:24:58 -0400 |
commit | da3e30e78ed9652322dccb49fa149e7b4e985f74 (patch) | |
tree | f0d8556e419be265e645d0a6f5ead070ee0aded2 | |
parent | 1a65f493c335abc3822291b52f3565776ce39a1b (diff) |
uml: fix aio compilation bug
Restructure do_aio thanks to commments from Ulrich and Al.
Uli started this by seeing that UML's initialization of a struct iocb
initialized fields that it shouldn't.
Al followed up by adding the following cleanups:
eliminating a variable by just using an anonymous structure in
its place.
hoisting a duplicated line out of the switch.
simplifying the error checking at the end.
I added a severity to the printk.
Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Ulrich Drepper <drepper@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | arch/um/os-Linux/aio.c | 47 |
1 files changed, 17 insertions, 30 deletions
diff --git a/arch/um/os-Linux/aio.c b/arch/um/os-Linux/aio.c index b126df4ea168..59348359f9ab 100644 --- a/arch/um/os-Linux/aio.c +++ b/arch/um/os-Linux/aio.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include "init.h" | 14 | #include "init.h" |
15 | #include "user.h" | 15 | #include "user.h" |
16 | #include "mode.h" | 16 | #include "mode.h" |
17 | #include "kern_constants.h" | ||
17 | 18 | ||
18 | struct aio_thread_req { | 19 | struct aio_thread_req { |
19 | enum aio_type type; | 20 | enum aio_type type; |
@@ -65,47 +66,33 @@ static long io_getevents(aio_context_t ctx_id, long min_nr, long nr, | |||
65 | static int do_aio(aio_context_t ctx, enum aio_type type, int fd, char *buf, | 66 | static int do_aio(aio_context_t ctx, enum aio_type type, int fd, char *buf, |
66 | int len, unsigned long long offset, struct aio_context *aio) | 67 | int len, unsigned long long offset, struct aio_context *aio) |
67 | { | 68 | { |
68 | struct iocb iocb, *iocbp = &iocb; | 69 | struct iocb *iocbp = & ((struct iocb) { |
70 | .aio_data = (unsigned long) aio, | ||
71 | .aio_fildes = fd, | ||
72 | .aio_buf = (unsigned long) buf, | ||
73 | .aio_nbytes = len, | ||
74 | .aio_offset = offset | ||
75 | }); | ||
69 | char c; | 76 | char c; |
70 | int err; | ||
71 | 77 | ||
72 | iocb = ((struct iocb) { .aio_data = (unsigned long) aio, | 78 | switch (type) { |
73 | .aio_reqprio = 0, | ||
74 | .aio_fildes = fd, | ||
75 | .aio_buf = (unsigned long) buf, | ||
76 | .aio_nbytes = len, | ||
77 | .aio_offset = offset, | ||
78 | .aio_reserved1 = 0, | ||
79 | .aio_reserved2 = 0, | ||
80 | .aio_reserved3 = 0 }); | ||
81 | |||
82 | switch(type){ | ||
83 | case AIO_READ: | 79 | case AIO_READ: |
84 | iocb.aio_lio_opcode = IOCB_CMD_PREAD; | 80 | iocbp->aio_lio_opcode = IOCB_CMD_PREAD; |
85 | err = io_submit(ctx, 1, &iocbp); | ||
86 | break; | 81 | break; |
87 | case AIO_WRITE: | 82 | case AIO_WRITE: |
88 | iocb.aio_lio_opcode = IOCB_CMD_PWRITE; | 83 | iocbp->aio_lio_opcode = IOCB_CMD_PWRITE; |
89 | err = io_submit(ctx, 1, &iocbp); | ||
90 | break; | 84 | break; |
91 | case AIO_MMAP: | 85 | case AIO_MMAP: |
92 | iocb.aio_lio_opcode = IOCB_CMD_PREAD; | 86 | iocbp->aio_lio_opcode = IOCB_CMD_PREAD; |
93 | iocb.aio_buf = (unsigned long) &c; | 87 | iocbp->aio_buf = (unsigned long) &c; |
94 | iocb.aio_nbytes = sizeof(c); | 88 | iocbp->aio_nbytes = sizeof(c); |
95 | err = io_submit(ctx, 1, &iocbp); | ||
96 | break; | 89 | break; |
97 | default: | 90 | default: |
98 | printk("Bogus op in do_aio - %d\n", type); | 91 | printk(UM_KERN_ERR "Bogus op in do_aio - %d\n", type); |
99 | err = -EINVAL; | 92 | return -EINVAL; |
100 | break; | ||
101 | } | 93 | } |
102 | 94 | ||
103 | if(err > 0) | 95 | return (io_submit(ctx, 1, &iocbp) > 0) ? 0 : -errno; |
104 | err = 0; | ||
105 | else | ||
106 | err = -errno; | ||
107 | |||
108 | return err; | ||
109 | } | 96 | } |
110 | 97 | ||
111 | /* Initialized in an initcall and unchanged thereafter */ | 98 | /* Initialized in an initcall and unchanged thereafter */ |