|
@@ -2241,11 +2241,15 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
|
|
|
|
|
|
mutex_lock(&inode->i_mutex);
|
|
|
|
|
|
+ ocfs2_iocb_clear_sem_locked(iocb);
|
|
|
+
|
|
|
relock:
|
|
|
/* to match setattr's i_mutex -> i_alloc_sem -> rw_lock ordering */
|
|
|
if (direct_io) {
|
|
|
down_read(&inode->i_alloc_sem);
|
|
|
have_alloc_sem = 1;
|
|
|
+ /* communicate with ocfs2_dio_end_io */
|
|
|
+ ocfs2_iocb_set_sem_locked(iocb);
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -2382,8 +2386,10 @@ out:
|
|
|
ocfs2_rw_unlock(inode, rw_level);
|
|
|
|
|
|
out_sems:
|
|
|
- if (have_alloc_sem)
|
|
|
+ if (have_alloc_sem) {
|
|
|
up_read(&inode->i_alloc_sem);
|
|
|
+ ocfs2_iocb_clear_sem_locked(iocb);
|
|
|
+ }
|
|
|
|
|
|
mutex_unlock(&inode->i_mutex);
|
|
|
|
|
@@ -2527,6 +2533,8 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
|
|
|
goto bail;
|
|
|
}
|
|
|
|
|
|
+ ocfs2_iocb_clear_sem_locked(iocb);
|
|
|
+
|
|
|
/*
|
|
|
* buffered reads protect themselves in ->readpage(). O_DIRECT reads
|
|
|
* need locks to protect pending reads from racing with truncate.
|
|
@@ -2534,6 +2542,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
|
|
|
if (filp->f_flags & O_DIRECT) {
|
|
|
down_read(&inode->i_alloc_sem);
|
|
|
have_alloc_sem = 1;
|
|
|
+ ocfs2_iocb_set_sem_locked(iocb);
|
|
|
|
|
|
ret = ocfs2_rw_lock(inode, 0);
|
|
|
if (ret < 0) {
|
|
@@ -2575,8 +2584,10 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
|
|
|
}
|
|
|
|
|
|
bail:
|
|
|
- if (have_alloc_sem)
|
|
|
+ if (have_alloc_sem) {
|
|
|
up_read(&inode->i_alloc_sem);
|
|
|
+ ocfs2_iocb_clear_sem_locked(iocb);
|
|
|
+ }
|
|
|
if (rw_level != -1)
|
|
|
ocfs2_rw_unlock(inode, rw_level);
|
|
|
mlog_exit(ret);
|