changeset 13999:5a664454d461

ds_mds_sync: Use pnfs_metadata_size_update to update metadata-file size
author Vitaliy Gusev <gusev.vitaliy@nexenta.com>
date Thu, 22 Aug 2013 00:08:39 +0400
parents b93becc5aab9
children 53f7563a5360
files usr/src/uts/common/fs/nfs/nfs41_srv.c usr/src/uts/common/fs/nfs/nfs_nnode_proxy.c usr/src/uts/common/nfs/nfs.h
diffstat 3 files changed, 29 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/fs/nfs/nfs41_srv.c	Thu Aug 22 00:08:30 2013 +0400
+++ b/usr/src/uts/common/fs/nfs/nfs41_srv.c	Thu Aug 22 00:08:39 2013 +0400
@@ -8743,6 +8743,7 @@
 	}
 }
 
+
 /*ARGSUSED*/
 static void
 mds_op_layout_commit(nfs_argop4 *argop, nfs_resop4 *resop,
@@ -8820,18 +8821,8 @@
 			goto final;
 		}
 
-		/*
-		 * write a null byte at newsize-1 so that the size
-		 * is correct.  VOP_SETATTR may fail if the mode of
-		 * the file denies the implementation.
-		 */
 		if (newsize > va.va_size) {
-			vattr_t vattr;
-
-			vattr.va_size = newsize;
-			vattr.va_mask = AT_SIZE;
-			error = nfs_vop_setattr(vp, &vattr, 0, cr, &ct,
-			    cs->exi);
+			error = pnfs_metadata_size_update(vp, newsize, cr, &ct);
 
 			if (error != 0) {
 				*cs->statusp = resp->locr_status = \
@@ -9418,3 +9409,25 @@
 {
 	return (size + PNFS_LAYOUT_SZ);
 }
+
+/*
+ * newsize are the real size of a file (no shadowed)
+ */
+int pnfs_metadata_size_update(vnode_t *vp, off64_t newsize,
+    cred_t *cr, caller_context_t *ct)
+{
+	vattr_t vattr;
+	int err;
+
+	/*
+	 * TODO:
+	 * write a null byte at newsize-1 so that the size
+	 * is correct.  VOP_SETATTR may fail if the mode of
+	 * the file denies the implementation.
+	 */
+
+	vattr.va_size = pnfs_shadow_size(newsize);
+	vattr.va_mask = AT_SIZE;
+	err = VOP_SETATTR(vp, &vattr, 0, cr, ct);
+	return (err);
+}
--- a/usr/src/uts/common/fs/nfs/nfs_nnode_proxy.c	Thu Aug 22 00:08:30 2013 +0400
+++ b/usr/src/uts/common/fs/nfs/nfs_nnode_proxy.c	Thu Aug 22 00:08:39 2013 +0400
@@ -679,15 +679,12 @@
 	nnode_proxy_data_t *mnd = vdata;
 	vnode_t *vp = mnd->mnd_vp;
 	vattr_t *vap = &mnd->mnd_vattr;
-	vattr_t vattr;
 	int err;
 
-	if (off <= vap->va_size)
+	if (off < vap->va_size)
 		return (0);
 
-	vattr.va_size = pnfs_shadow_size(off);
-	vattr.va_mask = AT_SIZE;
-	err = VOP_SETATTR(vp, &vattr, 0, cr, ct);
+	err = pnfs_metadata_size_update(vp, off, cr, ct);
 	return (err);
 }
 
--- a/usr/src/uts/common/nfs/nfs.h	Thu Aug 22 00:08:30 2013 +0400
+++ b/usr/src/uts/common/nfs/nfs.h	Thu Aug 22 00:08:39 2013 +0400
@@ -2406,6 +2406,9 @@
 extern uint64_t pnfs_real_size(uint64_t);
 extern uint64_t pnfs_shadow_size(uint64_t);
 
+extern int pnfs_metadata_size_update(vnode_t *, off64_t, cred_t *,
+    caller_context_t *);
+
 extern int nfs_vop_getattr(vnode_t *, vattr_t *, int, cred_t *,
     caller_context_t *, struct exportinfo *exi);