mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-01 14:44:12 +00:00
ocfs2: Remember rw lock level during direct io
Cluster locking might have been redone because a direct write won't complete, so this needs to be reflected in the iocb. Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
parent
8110b073a9
commit
7cdfc3a1c3
3 changed files with 19 additions and 7 deletions
|
@ -522,12 +522,17 @@ static void ocfs2_dio_end_io(struct kiocb *iocb,
|
||||||
void *private)
|
void *private)
|
||||||
{
|
{
|
||||||
struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
|
struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
|
||||||
|
int level;
|
||||||
|
|
||||||
/* this io's submitter should not have unlocked this before we could */
|
/* this io's submitter should not have unlocked this before we could */
|
||||||
BUG_ON(!ocfs2_iocb_is_rw_locked(iocb));
|
BUG_ON(!ocfs2_iocb_is_rw_locked(iocb));
|
||||||
|
|
||||||
ocfs2_iocb_clear_rw_locked(iocb);
|
ocfs2_iocb_clear_rw_locked(iocb);
|
||||||
up_read(&inode->i_alloc_sem);
|
|
||||||
ocfs2_rw_unlock(inode, 0);
|
level = ocfs2_iocb_rw_locked_level(iocb);
|
||||||
|
if (!level)
|
||||||
|
up_read(&inode->i_alloc_sem);
|
||||||
|
ocfs2_rw_unlock(inode, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -97,9 +97,16 @@ int ocfs2_map_and_write_splice_data(struct inode *inode,
|
||||||
/* all ocfs2_dio_end_io()'s fault */
|
/* all ocfs2_dio_end_io()'s fault */
|
||||||
#define ocfs2_iocb_is_rw_locked(iocb) \
|
#define ocfs2_iocb_is_rw_locked(iocb) \
|
||||||
test_bit(0, (unsigned long *)&iocb->private)
|
test_bit(0, (unsigned long *)&iocb->private)
|
||||||
#define ocfs2_iocb_set_rw_locked(iocb) \
|
static inline void ocfs2_iocb_set_rw_locked(struct kiocb *iocb, int level)
|
||||||
set_bit(0, (unsigned long *)&iocb->private)
|
{
|
||||||
|
set_bit(0, (unsigned long *)&iocb->private);
|
||||||
|
if (level)
|
||||||
|
set_bit(1, (unsigned long *)&iocb->private);
|
||||||
|
else
|
||||||
|
clear_bit(1, (unsigned long *)&iocb->private);
|
||||||
|
}
|
||||||
#define ocfs2_iocb_clear_rw_locked(iocb) \
|
#define ocfs2_iocb_clear_rw_locked(iocb) \
|
||||||
clear_bit(0, (unsigned long *)&iocb->private)
|
clear_bit(0, (unsigned long *)&iocb->private)
|
||||||
|
#define ocfs2_iocb_rw_locked_level(iocb) \
|
||||||
|
test_bit(1, (unsigned long *)&iocb->private)
|
||||||
#endif /* OCFS2_FILE_H */
|
#endif /* OCFS2_FILE_H */
|
||||||
|
|
|
@ -1542,7 +1542,7 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
|
||||||
pos = *ppos;
|
pos = *ppos;
|
||||||
|
|
||||||
/* communicate with ocfs2_dio_end_io */
|
/* communicate with ocfs2_dio_end_io */
|
||||||
ocfs2_iocb_set_rw_locked(iocb);
|
ocfs2_iocb_set_rw_locked(iocb, rw_level);
|
||||||
|
|
||||||
if (direct_io) {
|
if (direct_io) {
|
||||||
written = generic_file_direct_write(iocb, iov, &nr_segs, *ppos,
|
written = generic_file_direct_write(iocb, iov, &nr_segs, *ppos,
|
||||||
|
@ -1788,7 +1788,7 @@ static ssize_t ocfs2_file_aio_read(struct kiocb *iocb,
|
||||||
}
|
}
|
||||||
rw_level = 0;
|
rw_level = 0;
|
||||||
/* communicate with ocfs2_dio_end_io */
|
/* communicate with ocfs2_dio_end_io */
|
||||||
ocfs2_iocb_set_rw_locked(iocb);
|
ocfs2_iocb_set_rw_locked(iocb, rw_level);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue