Whamcloud - gitweb
LU-8284 osd-ldisksf: need lock around i_size update 03/22103/3
authorBobi Jam <bobijam.xu@intel.com>
Wed, 24 Aug 2016 15:33:07 +0000 (09:33 -0600)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 13 Sep 2016 20:02:36 +0000 (20:02 +0000)
In OSD layer i_size_write() needs protection.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: Ia893679129cb1335cdf612ec7f38492435d19db4
Reviewed-on: http://review.whamcloud.com/22103
Tested-by: Jenkins
Reviewed-by: Fan Yong <fan.yong@intel.com>
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/osd-ldiskfs/osd_handler.c
lustre/osd-ldiskfs/osd_io.c

index 4af9a09..3079a02 100644 (file)
@@ -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.
index 8cdd545..734e048 100644 (file)
@@ -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) {