Whamcloud - gitweb
LU-2850 kernel: 3.8 upstream removes vmtruncate()
authorPeng Tao <tao.peng@emc.com>
Fri, 17 May 2013 15:05:46 +0000 (11:05 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 13 Jun 2013 23:29:16 +0000 (19:29 -0400)
vmtruncate() is removed since upstream commit b9f61c3.
Also truncate_setsize is not always available. So we
just open code it and use truncate_pagecache instead.

Signed-off-by: Peng Tao <tao.peng@emc.com>
Signed-off-by: James Simmons <uja.ornl@gmail.com>
Change-Id: I9d4f43a5c181f16482b4caa021ba7a09ee52b600
Reviewed-on: http://review.whamcloud.com/5613
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Yang Sheng <yang.sheng@intel.com>
Reviewed-by: Keith Mannthey <keith.mannthey@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/llite/vvp_io.c
lustre/osd-ldiskfs/osd_io.c

index 562c875..7aded2e 100644 (file)
@@ -358,13 +358,22 @@ static int vvp_io_setattr_lock(const struct lu_env *env,
 static int vvp_do_vmtruncate(struct inode *inode, size_t size)
 {
        int     result;
 static int vvp_do_vmtruncate(struct inode *inode, size_t size)
 {
        int     result;
+       loff_t oldsize;
+
        /*
         * Only ll_inode_size_lock is taken at this level.
         */
        ll_inode_size_lock(inode);
        /*
         * Only ll_inode_size_lock is taken at this level.
         */
        ll_inode_size_lock(inode);
-       result = vmtruncate(inode, size);
-       ll_inode_size_unlock(inode);
+       result = inode_newsize_ok(inode, size);
+       if (result < 0) {
+               ll_inode_size_unlock(inode);
+               return result;
+       }
+       oldsize = inode->i_size;
+       i_size_write(inode, size);
 
 
+       truncate_pagecache(inode, oldsize, size);
+       ll_inode_size_unlock(inode);
        return result;
 }
 
        return result;
 }
 
index 79c4675..c9eb4eb 100644 (file)
@@ -1240,7 +1240,8 @@ static int osd_punch(const struct lu_env *env, struct dt_object *dt,
         struct inode       *inode = obj->oo_inode;
         handle_t           *h;
         tid_t               tid;
         struct inode       *inode = obj->oo_inode;
         handle_t           *h;
         tid_t               tid;
-        int                 rc, rc2 = 0;
+       loff_t             oldsize;
+       int                rc = 0, rc2 = 0;
         ENTRY;
 
         LASSERT(end == OBD_OBJECT_EOF);
         ENTRY;
 
         LASSERT(end == OBD_OBJECT_EOF);
@@ -1257,13 +1258,17 @@ static int osd_punch(const struct lu_env *env, struct dt_object *dt,
 
         tid = oh->ot_handle->h_transaction->t_tid;
 
 
         tid = oh->ot_handle->h_transaction->t_tid;
 
-        rc = vmtruncate(inode, start);
+       oldsize=inode->i_size;
+       i_size_write(inode, start);
+       truncate_pagecache(inode, oldsize, start);
+       if (inode->i_op->truncate)
+               inode->i_op->truncate(inode);
 
         /*
          * For a partial-page truncate, flush the page to disk immediately to
          * avoid data corruption during direct disk write.  b=17397
          */
 
         /*
          * For a partial-page truncate, flush the page to disk immediately to
          * avoid data corruption during direct disk write.  b=17397
          */
-        if (rc == 0 && (start & ~CFS_PAGE_MASK) != 0)
+       if ((start & ~CFS_PAGE_MASK) != 0)
                 rc = filemap_fdatawrite_range(inode->i_mapping, start, start+1);
 
         h = journal_current_handle();
                 rc = filemap_fdatawrite_range(inode->i_mapping, start, start+1);
 
         h = journal_current_handle();