From a1b3dce8a784893597faf8e1f08497e9e5a6e59d Mon Sep 17 00:00:00 2001 From: Jinshan Xiong Date: Tue, 13 May 2014 09:36:04 -0700 Subject: [PATCH] LU-2099 osd: clear iobuf up on I/O completion it was a bad idea to clear iobuf on buffer release because the same buffers can be used few times in case of transient ENOSPC. Change-Id: Ic1d2ddaa0794f2f6f7d1ba71620e06b4ea7a99d2 Signed-off-by: Alex Zhuravlev Signed-off-by: Jinshan Xiong --- lustre/osd-ldiskfs/osd_handler.c | 1 + lustre/osd-ldiskfs/osd_internal.h | 2 ++ lustre/osd-ldiskfs/osd_io.c | 12 ++++-------- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 1d859f3..1278d17 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -1080,6 +1080,7 @@ static int osd_trans_stop(const struct lu_env *env, struct thandle *th) */ wait_event(iobuf->dr_wait, cfs_atomic_read(&iobuf->dr_numreqs) == 0); + osd_fini_iobuf(oti->oti_dev, iobuf); if (!rc) rc = iobuf->dr_error; diff --git a/lustre/osd-ldiskfs/osd_internal.h b/lustre/osd-ldiskfs/osd_internal.h index 75dfa7d..9bc4a6c 100644 --- a/lustre/osd-ldiskfs/osd_internal.h +++ b/lustre/osd-ldiskfs/osd_internal.h @@ -1090,5 +1090,7 @@ static inline int fid_is_internal(const struct lu_fid *fid) void ldiskfs_inc_count(handle_t *handle, struct inode *inode); void ldiskfs_dec_count(handle_t *handle, struct inode *inode); +void osd_fini_iobuf(struct osd_device *d, struct osd_iobuf *iobuf); + #endif /* __KERNEL__ */ #endif /* _OSD_INTERNAL_H */ diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index ba17fcf..dafec76 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -379,6 +379,7 @@ static int osd_do_bio(struct osd_device *osd, struct inode *inode, if (iobuf->dr_rw == 0) { wait_event(iobuf->dr_wait, cfs_atomic_read(&iobuf->dr_numreqs) == 0); + osd_fini_iobuf(osd, iobuf); } if (rc == 0) @@ -496,15 +497,8 @@ cleanup: static int osd_bufs_put(const struct lu_env *env, struct dt_object *dt, struct niobuf_local *lnb, int npages) { - struct osd_thread_info *oti = osd_oti_get(env); - struct osd_iobuf *iobuf = &oti->oti_iobuf; - struct osd_device *d = osd_obj2dev(osd_dt_obj(dt)); int i; - /* to do IO stats, notice we do this here because - * osd_do_bio() doesn't wait for write to complete */ - osd_fini_iobuf(d, iobuf); - for (i = 0; i < npages; i++) { if (lnb[i].page == NULL) continue; @@ -808,7 +802,9 @@ static int osd_write_commit(const struct lu_env *env, struct dt_object *dt, rc = osd_do_bio(osd, inode, iobuf); /* we don't do stats here as in read path because * write is async: we'll do this in osd_put_bufs() */ - } + } else { + osd_fini_iobuf(osd, iobuf); + } if (unlikely(rc != 0)) { /* if write fails, we should drop pages from the cache */ -- 1.8.3.1