mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-06 09:56:25 -04:00
staging: lustre: llite: handle concurrent use of cob_transient_pages
With the lockless __generic_file_aio_write introduced in LU-1669, ll_direct_IO_26 is no longer protected by the inode i_isem. This renders obsoltete checks that all transient pages have been handled before and after entry, and requires atomic access to their counter. Signed-off-by: Stephen Champion <schamp@sgi.com> Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-5700 Reviewed-on: http://review.whamcloud.com/12179 Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com> Reviewed-by: Bobi Jam <bobijam@gmail.com> Reviewed-by: Oleg Drokin <oleg.drokin@intel.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
4660dd9bbf
commit
b2e7bbb37a
@@ -345,7 +345,6 @@ static ssize_t ll_direct_IO_26(struct kiocb *iocb, struct iov_iter *iter)
|
||||
struct cl_io *io;
|
||||
struct file *file = iocb->ki_filp;
|
||||
struct inode *inode = file->f_mapping->host;
|
||||
struct vvp_object *obj = cl_inode2vvp(inode);
|
||||
loff_t file_offset = iocb->ki_pos;
|
||||
ssize_t count = iov_iter_count(iter);
|
||||
ssize_t tot_bytes = 0, result = 0;
|
||||
@@ -374,7 +373,6 @@ static ssize_t ll_direct_IO_26(struct kiocb *iocb, struct iov_iter *iter)
|
||||
io = vvp_env_io(env)->vui_cl.cis_io;
|
||||
LASSERT(io);
|
||||
|
||||
LASSERT(obj->vob_transient_pages == 0);
|
||||
while (iov_iter_count(iter)) {
|
||||
struct page **pages;
|
||||
size_t offs;
|
||||
@@ -422,8 +420,6 @@ static ssize_t ll_direct_IO_26(struct kiocb *iocb, struct iov_iter *iter)
|
||||
file_offset += result;
|
||||
}
|
||||
out:
|
||||
LASSERT(obj->vob_transient_pages == 0);
|
||||
|
||||
if (tot_bytes > 0) {
|
||||
struct vvp_io *vio = vvp_env_io(env);
|
||||
|
||||
|
||||
@@ -217,11 +217,12 @@ struct vvp_object {
|
||||
struct list_head vob_pending_list;
|
||||
|
||||
/**
|
||||
* Access this counter is protected by inode->i_sem. Now that
|
||||
* the lifetime of transient pages must be covered by inode sem,
|
||||
* we don't need to hold any lock..
|
||||
* Number of transient pages. This is no longer protected by i_sem,
|
||||
* and needs to be atomic. This is not actually used for anything,
|
||||
* and can probably be removed.
|
||||
*/
|
||||
int vob_transient_pages;
|
||||
atomic_t vob_transient_pages;
|
||||
|
||||
/**
|
||||
* Number of outstanding mmaps on this file.
|
||||
*
|
||||
|
||||
@@ -67,8 +67,8 @@ static int vvp_object_print(const struct lu_env *env, void *cookie,
|
||||
|
||||
(*p)(env, cookie, "(%s %d %d) inode: %p ",
|
||||
list_empty(&obj->vob_pending_list) ? "-" : "+",
|
||||
obj->vob_transient_pages, atomic_read(&obj->vob_mmap_cnt),
|
||||
inode);
|
||||
atomic_read(&obj->vob_transient_pages),
|
||||
atomic_read(&obj->vob_mmap_cnt), inode);
|
||||
if (inode) {
|
||||
lli = ll_i2info(inode);
|
||||
(*p)(env, cookie, "%lu/%u %o %u %d %p "DFID,
|
||||
@@ -220,7 +220,7 @@ static int vvp_object_init0(const struct lu_env *env,
|
||||
const struct cl_object_conf *conf)
|
||||
{
|
||||
vob->vob_inode = conf->coc_inode;
|
||||
vob->vob_transient_pages = 0;
|
||||
atomic_set(&vob->vob_transient_pages, 0);
|
||||
cl_object_page_init(&vob->vob_cl, sizeof(struct vvp_page));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -506,7 +506,7 @@ static void vvp_transient_page_fini(const struct lu_env *env,
|
||||
struct vvp_object *clobj = cl2vvp(clp->cp_obj);
|
||||
|
||||
vvp_page_fini_common(vpg);
|
||||
clobj->vob_transient_pages--;
|
||||
atomic_dec(&clobj->vob_transient_pages);
|
||||
}
|
||||
|
||||
static const struct cl_page_operations vvp_transient_page_ops = {
|
||||
@@ -555,7 +555,7 @@ int vvp_page_init(const struct lu_env *env, struct cl_object *obj,
|
||||
|
||||
cl_page_slice_add(page, &vpg->vpg_cl, obj, index,
|
||||
&vvp_transient_page_ops);
|
||||
clobj->vob_transient_pages++;
|
||||
atomic_inc(&clobj->vob_transient_pages);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user