From b172cd5bc80d2560056794cd640a95303ad42405 Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Wed, 24 Aug 2016 09:33:07 -0600 Subject: [PATCH] LU-8284 osd-ldisksf: need lock around i_size update In OSD layer i_size_write() needs protection. Signed-off-by: Bobi Jam Change-Id: Ia893679129cb1335cdf612ec7f38492435d19db4 Reviewed-on: http://review.whamcloud.com/22103 Tested-by: Jenkins Reviewed-by: Fan Yong Tested-by: Maloo Reviewed-by: Jinshan Xiong Reviewed-by: Oleg Drokin --- lustre/osd-ldiskfs/osd_handler.c | 2 ++ lustre/osd-ldiskfs/osd_io.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 4af9a09..3079a02 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -2505,8 +2505,10 @@ static int osd_inode_setattr(const struct lu_env *env, if (bits & LA_MTIME) inode->i_mtime = *osd_inode_time(env, inode, attr->la_mtime); if (bits & LA_SIZE) { + spin_lock(&inode->i_lock); LDISKFS_I(inode)->i_disksize = attr->la_size; i_size_write(inode, attr->la_size); + spin_unlock(&inode->i_lock); } /* OSD should not change "i_blocks" which is used by quota. diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 8cdd545..734e048 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -1631,12 +1631,14 @@ static int osd_ldiskfs_writelink(struct inode *inode, char *buffer, int buflen) /* LU-2634: clear the extent format for fast symlink */ ldiskfs_clear_inode_flag(inode, LDISKFS_INODE_EXTENTS); - memcpy((char *)&LDISKFS_I(inode)->i_data, (char *)buffer, buflen); - LDISKFS_I(inode)->i_disksize = buflen; - i_size_write(inode, buflen); + memcpy((char *)&LDISKFS_I(inode)->i_data, (char *)buffer, buflen); + spin_lock(&inode->i_lock); + LDISKFS_I(inode)->i_disksize = buflen; + i_size_write(inode, buflen); + spin_unlock(&inode->i_lock); ll_dirty_inode(inode, I_DIRTY_DATASYNC); - return 0; + return 0; } int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, @@ -1707,8 +1709,8 @@ int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, if (write_NUL) --new_size; - /* correct in-core and on-disk sizes */ - if (new_size > i_size_read(inode)) { + /* correct in-core and on-disk sizes */ + if (new_size > i_size_read(inode)) { spin_lock(&inode->i_lock); if (new_size > i_size_read(inode)) i_size_write(inode, new_size); @@ -1823,7 +1825,9 @@ static int osd_punch(const struct lu_env *env, struct dt_object *dt, tid = oh->ot_handle->h_transaction->t_tid; + spin_lock(&inode->i_lock); i_size_write(inode, start); + spin_unlock(&inode->i_lock); ll_truncate_pagecache(inode, start); #ifdef HAVE_INODEOPS_TRUNCATE if (inode->i_op->truncate) { -- 1.8.3.1