aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-07-05 08:24:34 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-07-05 08:24:34 -0400
commitfaac9bd0e3ce7cb0572ec66e0a426cacf6afa970 (patch)
tree0300e043a01d1fd48e9157749da3bd10422c0e53
parentb0dd9308b703310e9a988df70f6ed3e87cb55655 (diff)
[GFS2] Fix locking for Direct I/O reads
We need to hold i_mutex when doing direct i/o reads. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/ops_address.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
index 26db3335d4b3..27ce30148e69 100644
--- a/fs/gfs2/ops_address.c
+++ b/fs/gfs2/ops_address.c
@@ -642,6 +642,7 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
642 struct inode *inode = file->f_mapping->host; 642 struct inode *inode = file->f_mapping->host;
643 struct gfs2_inode *ip = GFS2_I(inode); 643 struct gfs2_inode *ip = GFS2_I(inode);
644 struct gfs2_sbd *sdp = GFS2_SB(inode); 644 struct gfs2_sbd *sdp = GFS2_SB(inode);
645 int ret;
645 646
646 if (rw == WRITE) 647 if (rw == WRITE)
647 return gfs2_direct_IO_write(iocb, iov, offset, nr_segs); 648 return gfs2_direct_IO_write(iocb, iov, offset, nr_segs);
@@ -650,9 +651,12 @@ static ssize_t gfs2_direct_IO(int rw, struct kiocb *iocb,
650 gfs2_assert_warn(sdp, !gfs2_is_stuffed(ip))) 651 gfs2_assert_warn(sdp, !gfs2_is_stuffed(ip)))
651 return -EINVAL; 652 return -EINVAL;
652 653
653 return __blockdev_direct_IO(READ, iocb, inode, inode->i_sb->s_bdev, iov, 654 mutex_lock(&inode->i_mutex);
654 offset, nr_segs, gfs2_get_block, NULL, 655 ret = __blockdev_direct_IO(READ, iocb, inode, inode->i_sb->s_bdev, iov,
655 DIO_OWN_LOCKING); 656 offset, nr_segs, gfs2_get_block, NULL,
657 DIO_OWN_LOCKING);
658 mutex_unlock(&inode->i_mutex);
659 return ret;
656} 660}
657 661
658const struct address_space_operations gfs2_file_aops = { 662const struct address_space_operations gfs2_file_aops = {