From: Jay Xiong Date: Thu, 4 Feb 2010 04:17:05 +0000 (+0800) Subject: b=21551 holding ->lli_size_sem to update inode size X-Git-Tag: 1.10.0.37~29 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=86a153fc4d659dc2662ab5201fac86eb06a31a96;p=fs%2Flustre-release.git b=21551 holding ->lli_size_sem to update inode size - Fixed i_size_write in vvp_io_commit_write, it has to be called under ->lli_size_sem - clenaup the code. i=wangdi i=green --- diff --git a/lustre/lclient/lcommon_cl.c b/lustre/lclient/lcommon_cl.c index 22d63e3..1bb57b3 100644 --- a/lustre/lclient/lcommon_cl.c +++ b/lustre/lclient/lcommon_cl.c @@ -682,7 +682,7 @@ void ccc_lock_state(const struct lu_env *env, if (rc == 0) { if (lock->cll_descr.cld_start == 0 && lock->cll_descr.cld_end == CL_PAGE_EOF) { - cl_isize_write(inode, attr->cat_kms); + cl_isize_write_nolock(inode, attr->cat_kms); CDEBUG(D_INODE, DFID" updating i_size %llu\n", PFID(lu_object_fid(&obj->co_lu)), (__u64)cl_isize_read(inode)); @@ -932,9 +932,9 @@ int ccc_prep_size(const struct lu_env *env, struct cl_object *obj, */ if (cl_isize_read(inode) < kms) { if (vfslock) - cl_isize_write(inode, kms); - else cl_isize_write_nolock(inode, kms); + else + cl_isize_write(inode, kms); } } } diff --git a/lustre/liblustre/llite_lib.h b/lustre/liblustre/llite_lib.h index b2626ca..44f1663 100644 --- a/lustre/liblustre/llite_lib.h +++ b/lustre/liblustre/llite_lib.h @@ -383,9 +383,9 @@ static inline struct slp_io *slp_env_io(const struct lu_env *env) #define cl_i2info(info) llu_i2info(info) #define cl_inode_mode(inode) (llu_i2stat(inode)->st_mode) #define cl_i2sbi llu_i2sbi -#define cl_isize_read(inode) (llu_i2stat(inode)->st_size) -#define cl_isize_write(inode,kms) do{llu_i2stat(inode)->st_size = kms;}while(0) -#define cl_isize_write_nolock(inode,kms) do{llu_i2stat(inode)->st_size = kms;}while(0) +#define cl_isize_read(inode) (llu_i2stat(inode)->st_size) +#define cl_isize_write(inode,kms) do{llu_i2stat(inode)->st_size = kms;}while(0) +#define cl_isize_write_nolock(inode,kms) cl_isize_write(inode,kms) static inline void cl_isize_lock(struct inode *inode, int lsmlock) { diff --git a/lustre/llite/dir.c b/lustre/llite/dir.c index dcff870..08abc40 100644 --- a/lustre/llite/dir.c +++ b/lustre/llite/dir.c @@ -168,11 +168,8 @@ static int ll_dir_readpage(struct file *file, struct page *page) /* Checked by mdc_readpage() */ LASSERT(body != NULL); - if (body->valid & OBD_MD_FLSIZE) { - ll_inode_size_lock(inode, 0); - i_size_write(inode, body->size); - ll_inode_size_unlock(inode, 0); - } + if (body->valid & OBD_MD_FLSIZE) + cl_isize_write(inode, body->size); SetPageUptodate(page); } ptlrpc_req_finished(request); diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 8c8e1fa..f452028 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -770,7 +770,7 @@ int ll_merge_lvb(struct inode *inode) ll_inode_size_lock(inode, 1); inode_init_lvb(inode, &lvb); rc = obd_merge_lvb(sbi->ll_dt_exp, lli->lli_smd, &lvb, 0); - i_size_write(inode, lvb.lvb_size); + cl_isize_write_nolock(inode, lvb.lvb_size); inode->i_blocks = lvb.lvb_blocks; LTIME_S(inode->i_mtime) = lvb.lvb_mtime; @@ -1804,9 +1804,7 @@ loff_t ll_file_seek(struct file *file, loff_t offset, int origin) if (rc != 0) RETURN(rc); - ll_inode_size_lock(inode, 0); offset += i_size_read(inode); - ll_inode_size_unlock(inode, 0); } else if (origin == 1) { /* SEEK_CUR */ offset += file->f_pos; } @@ -2205,10 +2203,8 @@ int ll_getattr_it(struct vfsmount *mnt, struct dentry *de, stat->blksize = 1 << inode->i_blkbits; #endif - ll_inode_size_lock(inode, 0); stat->size = i_size_read(inode); stat->blocks = inode->i_blocks; - ll_inode_size_unlock(inode, 0); return 0; } diff --git a/lustre/llite/llite_internal.h b/lustre/llite/llite_internal.h index 2877858..bd2fe50 100644 --- a/lustre/llite/llite_internal.h +++ b/lustre/llite/llite_internal.h @@ -1258,9 +1258,6 @@ void ll_iocontrol_unregister(void *magic); #define cl_i2info(info) ll_i2info(info) #define cl_inode_mode(inode) ((inode)->i_mode) #define cl_i2sbi ll_i2sbi -#define cl_isize_read(inode) i_size_read(inode) -#define cl_isize_write(inode,kms) i_size_write(inode, kms) -#define cl_isize_write_nolock(inode,kms) do {(inode)->i_size=(kms);}while(0) static inline void cl_isize_lock(struct inode *inode, int lsmlock) { @@ -1272,6 +1269,21 @@ static inline void cl_isize_unlock(struct inode *inode, int lsmlock) ll_inode_size_unlock(inode, lsmlock); } +static inline void cl_isize_write_nolock(struct inode *inode, loff_t kms) +{ + LASSERT_SEM_LOCKED(&ll_i2info(inode)->lli_size_sem); + i_size_write(inode, kms); +} + +static inline void cl_isize_write(struct inode *inode, loff_t kms) +{ + ll_inode_size_lock(inode, 0); + i_size_write(inode, kms); + ll_inode_size_unlock(inode, 0); +} + +#define cl_isize_read(inode) i_size_read(inode) + static inline int cl_merge_lvb(struct inode *inode) { return ll_merge_lvb(inode); diff --git a/lustre/llite/rw.c b/lustre/llite/rw.c index af18871..e877a6b 100644 --- a/lustre/llite/rw.c +++ b/lustre/llite/rw.c @@ -76,57 +76,19 @@ void ll_truncate(struct inode *inode) { struct ll_inode_info *lli = ll_i2info(inode); - loff_t new_size; ENTRY; - CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p) to %Lu=%#Lx\n",inode->i_ino, - inode->i_generation, inode, i_size_read(inode), - i_size_read(inode)); - ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_TRUNC, 1); - if (lli->lli_size_sem_owner != cfs_current()) { - EXIT; - return; - } + CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p) to %Lu\n",inode->i_ino, + inode->i_generation, inode, i_size_read(inode)); - if (!lli->lli_smd) { - CDEBUG(D_INODE, "truncate on inode %lu with no objects\n", - inode->i_ino); - GOTO(out_unlock, 0); - } - LASSERT_SEM_LOCKED(&lli->lli_size_sem); - - if (unlikely((ll_i2sbi(inode)->ll_flags & LL_SBI_CHECKSUM) && - (i_size_read(inode) & ~CFS_PAGE_MASK))) { - /* If the truncate leaves a partial page, update its checksum */ - struct page *page = find_get_page(inode->i_mapping, - i_size_read(inode) >> - CFS_PAGE_SHIFT); - if (page != NULL) { -#if 0 /* XXX */ - struct ll_async_page *llap = llap_cast_private(page); - if (llap != NULL) { - char *kaddr = kmap_atomic(page, KM_USER0); - llap->llap_checksum = - init_checksum(OSC_DEFAULT_CKSUM); - llap->llap_checksum = - compute_checksum(llap->llap_checksum, - kaddr, CFS_PAGE_SIZE, - OSC_DEFAULT_CKSUM); - kunmap_atomic(kaddr, KM_USER0); - } - page_cache_release(page); -#endif - } + ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_TRUNC, 1); + if (lli->lli_size_sem_owner == cfs_current()) { + LASSERT_SEM_LOCKED(&lli->lli_size_sem); + ll_inode_size_unlock(inode, 0); } - new_size = i_size_read(inode); - ll_inode_size_unlock(inode, 0); - EXIT; return; - - out_unlock: - ll_inode_size_unlock(inode, 0); } /* ll_truncate */ /** diff --git a/lustre/llite/vvp_io.c b/lustre/llite/vvp_io.c index f208b0e..a601017 100644 --- a/lustre/llite/vvp_io.c +++ b/lustre/llite/vvp_io.c @@ -932,12 +932,17 @@ static int vvp_io_commit_write(const struct lu_env *env, size = cl_offset(obj, pg->cp_index) + to; + ll_inode_size_lock(inode, 0); if (result == 0) { if (size > i_size_read(inode)) - i_size_write(inode, size); + cl_isize_write_nolock(inode, size); cl_page_export(env, pg, 1); - } else if (size > i_size_read(inode)) - cl_page_discard(env, io, pg); + } else { + if (size > i_size_read(inode)) + cl_page_discard(env, io, pg); + } + ll_inode_size_unlock(inode, 0); + RETURN(result); } diff --git a/lustre/llite/vvp_object.c b/lustre/llite/vvp_object.c index 21837e4..3ef1e4b 100644 --- a/lustre/llite/vvp_object.c +++ b/lustre/llite/vvp_object.c @@ -110,7 +110,7 @@ static int vvp_attr_set(const struct lu_env *env, struct cl_object *obj, if (valid & CAT_GID) inode->i_gid = attr->cat_gid; if (0 && valid & CAT_SIZE) - i_size_write(inode, attr->cat_size); + cl_isize_write_nolock(inode, attr->cat_size); /* not currently necessary */ if (0 && valid & (CAT_UID|CAT_GID|CAT_SIZE)) mark_inode_dirty(inode);