Whamcloud - gitweb
b=21551 holding ->lli_size_sem to update inode size
authorJay Xiong <Jinshan.Xiong@Sun.COM>
Thu, 4 Feb 2010 04:17:05 +0000 (12:17 +0800)
committerRobert Read <rread@sun.com>
Mon, 8 Feb 2010 22:34:30 +0000 (14:34 -0800)
- 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

lustre/lclient/lcommon_cl.c
lustre/liblustre/llite_lib.h
lustre/llite/dir.c
lustre/llite/file.c
lustre/llite/llite_internal.h
lustre/llite/rw.c
lustre/llite/vvp_io.c
lustre/llite/vvp_object.c

index 22d63e3..1bb57b3 100644 (file)
@@ -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);
                         }
                 }
         }
index b2626ca..44f1663 100644 (file)
@@ -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)
 {
index dcff870..08abc40 100644 (file)
@@ -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);
index 8c8e1fa..f452028 100644 (file)
@@ -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;
 }
index 2877858..bd2fe50 100644 (file)
@@ -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);
index af18871..e877a6b 100644 (file)
 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 */
 
 /**
index f208b0e..a601017 100644 (file)
@@ -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);
 }
 
index 21837e4..3ef1e4b 100644 (file)
@@ -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);