diff usr/src/uts/common/fs/zfs/dsl_dataset.c @ 4569:e80d40447f27

6355623 zfs rename to a valid dataset name, but its snapshot name becomes too long, panics the system
author mmusante
date Fri, 29 Jun 2007 11:14:08 -0700
parents 12bb2876a62e
children ed36b0e652bc
line wrap: on
line diff
--- a/usr/src/uts/common/fs/zfs/dsl_dataset.c	Fri Jun 29 11:12:38 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/dsl_dataset.c	Fri Jun 29 11:14:08 2007 -0700
@@ -1715,6 +1715,17 @@
 	return (err);
 }
 
+static int
+dsl_valid_rename(char *oldname, void *arg)
+{
+	int delta = *(int *)arg;
+
+	if (strlen(oldname) + delta >= MAXNAMELEN)
+		return (ENAMETOOLONG);
+
+	return (0);
+}
+
 #pragma weak dmu_objset_rename = dsl_dataset_rename
 int
 dsl_dataset_rename(char *oldname, const char *newname,
@@ -1729,7 +1740,15 @@
 	if (err)
 		return (err);
 	if (tail == NULL) {
-		err = dsl_dir_rename(dd, newname);
+		int delta = strlen(newname) - strlen(oldname);
+
+		/* if we're growing, validate child size lengths */
+		if (delta > 0)
+			err = dmu_objset_find(oldname, dsl_valid_rename,
+			    &delta, DS_FIND_CHILDREN | DS_FIND_SNAPSHOTS);
+
+		if (!err)
+			err = dsl_dir_rename(dd, newname);
 		dsl_dir_close(dd, FTAG);
 		return (err);
 	}