- 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
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));
*/
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);
}
}
}
#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)
{
/* 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);
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;
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;
}
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;
}
#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)
{
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);
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 */
/**
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);
}
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);