Re: [PATCH v4 1/2] aio: make kiocb->private NUll in init_sync_kiocb()
From: Junxiao Bi <hidden>
Date: 2012-06-29 10:18:24
Also in:
lkml, ocfs2-devel
On 06/29/2012 05:22 PM, Joel Becker wrote:
On Thu, Jun 28, 2012 at 03:39:56PM -0700, Andrew Morton wrote:quoted
On Wed, 27 Jun 2012 17:09:54 +0800 Junxiao Bi [off-list ref] wrote:quoted
Ocfs2 uses kiocb.*private as a flag of unsigned long size. In commit a11f7e6 ocfs2: serialize unaligned aio, the unaligned io flag is involved in it to serialize the unaligned aio. As *private is not initialized in init_sync_kiocb() of do_sync_write(), this unaligned io flag may be unexpectly set in an aligned dio. And this will cause OCFS2_I(inode)->ip_unaligned_aio decreased to -1 in ocfs2_dio_end_io(), thus the following unaligned dio will hang forever at ocfs2_aiodio_wait() in ocfs2_file_aio_write(). Signed-off-by: Junxiao Bi <redacted> Cc: stable@vger.kernel.org Acked-by: Jeff Moyer <redacted> Acked-by: Joel Becker <jlbec@evilplan.org> --- include/linux/aio.h | 1 + 1 file changed, 1 insertion(+)diff --git a/include/linux/aio.h b/include/linux/aio.h index 2314ad8..b1a520e 100644 --- a/include/linux/aio.h +++ b/include/linux/aio.h@@ -140,6 +140,7 @@ struct kiocb { (x)->ki_dtor = NULL; \ (x)->ki_obj.tsk = tsk; \ (x)->ki_user_data = 0; \ + (x)->private = NULL; \ } while (0) #define AIO_RING_MAGIC 0xa10a10a1hm, that code is rather cruddy. Pointless macromania.Agreed.quoted
If we do this: static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp) { *kiocb = (struct kiocb) { .ki_users = 1, .ki_key = KIOCB_SYNC_KEY, .ki_filp = filp, .ki_obj.tsk = current, }; } then fs/read_write.o's .text is shrunk from 9857 bytes to 9714, which is rather a lot. But that's all rather irrelevant to your bugfix.I like your solution. Junxiao, if you send me that version, I'd be happy to take it.
Hi Joel, Andrew had merged this patch to his tree. Do you like the second patch " ocfs2: clear unaligned io flag when dio fails"?
Joel