Junxiao Bi
2012-May-31 04:12 UTC
[Ocfs2-devel] [PATCH 1/2] aio: make kiocb->private NUll in init_sync_kiocb()
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_write_iter(). We can't initialized this flag in ocfs2_file_write_iter() since it may be invoked several times by do_sync_write(). So we initialize it in init_sync_kiocb(), it's also useful for other similiar use of it in the future. Signed-off-by: Junxiao Bi <junxiao.bi at oracle.com> --- 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 0xa10a10a1 -- 1.7.9.5
Junxiao Bi
2012-May-31 04:12 UTC
[Ocfs2-devel] [PATCH 2/2] ocfs2: clear unaligned io flag when dio fails
The unaligned io flag is set in the kiocb when an unaligned dio is issued, it should be cleared even when the dio fails, or it may affect the following io which are using the same kiocb. Signed-off-by: Junxiao Bi <junxiao.bi at oracle.com> --- fs/ocfs2/file.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c index 061591a..98513c8 100644 --- a/fs/ocfs2/file.c +++ b/fs/ocfs2/file.c @@ -2422,8 +2422,10 @@ out_dio: unaligned_dio = 0; } - if (unaligned_dio) + if (unaligned_dio) { + ocfs2_iocb_clear_unaligned_aio(iocb); atomic_dec(&OCFS2_I(inode)->ip_unaligned_aio); + } out: if (rw_level != -1) -- 1.7.9.5
Jeff Moyer
2012-May-31 14:08 UTC
[Ocfs2-devel] [PATCH 1/2] aio: make kiocb->private NUll in init_sync_kiocb()
Junxiao Bi <junxiao.bi at oracle.com> writes:> 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_write_iter().> We can't initialized this flag in ocfs2_file_write_iter() since > it may be invoked several times by do_sync_write(). So we initialize > it in init_sync_kiocb(), it's also useful for other similiar use of > it in the future.I don't see any ocfs2_file_write_iter in the upstream kernel. ocfs2_file_aio_write most certainly could set ->private to 0, it will only be called once for a given kiocb. That point aside, I have no issues with setting private to NULL in init_sync_kiocb. If you fix up the comment to reflect reality w.r.t. the upstream kernel source, I'll ack the patch. Cheers, Jeff