diff --git a/fs/sysfs/group.c b/fs/sysfs/group.c
index 442f34f..841baed 100644
--- a/fs/sysfs/group.c
+++ b/fs/sysfs/group.c
@@ -27,7 +27,7 @@ static void remove_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 }
 
 static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
-			const struct attribute_group *grp, int update)
+			const struct attribute_group *grp, int update, int type)
 {
 	struct attribute *const* attr;
 	int error = 0, i;
@@ -45,7 +45,7 @@ static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 			if (!mode)
 				continue;
 		}
-		error = sysfs_add_file_mode(dir_sd, *attr, SYSFS_KOBJ_ATTR,
+		error = sysfs_add_file_mode(dir_sd, *attr, type,
 					    (*attr)->mode | mode);
 		if (unlikely(error))
 			break;
@@ -57,7 +57,7 @@ static int create_files(struct sysfs_dirent *dir_sd, struct kobject *kobj,
 
 
 static int internal_create_group(struct kobject *kobj, int update,
-				 const struct attribute_group *grp)
+				 const struct attribute_group *grp, int type)
 {
 	struct sysfs_dirent *sd;
 	int error;
@@ -75,7 +75,7 @@ static int internal_create_group(struct kobject *kobj, int update,
 	} else
 		sd = kobj->sd;
 	sysfs_get(sd);
-	error = create_files(sd, kobj, grp, update);
+	error = create_files(sd, kobj, grp, update, type);
 	if (error) {
 		if (grp->name)
 			sysfs_remove_subdir(sd);
@@ -97,9 +97,16 @@ static int internal_create_group(struct kobject *kobj, int update,
 int sysfs_create_group(struct kobject *kobj,
 		       const struct attribute_group *grp)
 {
-	return internal_create_group(kobj, 0, grp);
+	return internal_create_group(kobj, 0, grp, SYSFS_KOBJ_ATTR);
 }
 
+int sysfs_create_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp)
+{
+	return internal_create_group(kobj, 0, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_create_bin_group);
+
 /**
  * sysfs_update_group - given a directory kobject, create an attribute group
  * @kobj:	The kobject to create the group on
@@ -120,10 +127,15 @@ int sysfs_create_group(struct kobject *kobj,
 int sysfs_update_group(struct kobject *kobj,
 		       const struct attribute_group *grp)
 {
-	return internal_create_group(kobj, 1, grp);
+	return internal_create_group(kobj, 1, grp, SYSFS_KOBJ_ATTR);
 }
 
-
+int sysfs_update_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp)
+{
+	return internal_create_group(kobj, 1, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_update_bin_group);
 
 void sysfs_remove_group(struct kobject * kobj, 
 			const struct attribute_group * grp)
@@ -148,17 +160,15 @@ void sysfs_remove_group(struct kobject * kobj,
 	sysfs_put(sd);
 }
 
-/**
- * sysfs_merge_group - merge files into a pre-existing attribute group.
- * @kobj:	The kobject containing the group.
- * @grp:	The files to create and the attribute group they belong to.
- *
- * This function returns an error if the group doesn't exist or any of the
- * files already exist in that group, in which case none of the new files
- * are created.
- */
-int sysfs_merge_group(struct kobject *kobj,
-		       const struct attribute_group *grp)
+void sysfs_remove_bin_group(struct kobject * kobj,
+			    const struct attribute_group * grp)
+{
+	sysfs_remove_group(kobj, grp);
+}
+EXPORT_SYMBOL_GPL(sysfs_remove_bin_group);
+
+int internal_merge_group(struct kobject *kobj,
+		       const struct attribute_group *grp, int type)
 {
 	struct sysfs_dirent *dir_sd;
 	int error = 0;
@@ -173,7 +183,7 @@ int sysfs_merge_group(struct kobject *kobj,
 		return -ENOENT;
 
 	for ((i = 0, attr = grp->attrs); *attr && !error; (++i, ++attr))
-		error = sysfs_add_file(dir_sd, *attr, SYSFS_KOBJ_ATTR);
+		error = sysfs_add_file(dir_sd, *attr, type);
 	if (error) {
 		while (--i >= 0)
 			sysfs_hash_and_remove(dir_sd, NULL, (*--attr)->name);
@@ -182,8 +192,30 @@ int sysfs_merge_group(struct kobject *kobj,
 
 	return error;
 }
+
+/**
+ * sysfs_merge_group - merge files into a pre-existing attribute group.
+ * @kobj:	The kobject containing the group.
+ * @grp:	The files to create and the attribute group they belong to.
+ *
+ * This function returns an error if the group doesn't exist or any of the
+ * files already exist in that group, in which case none of the new files
+ * are created.
+ */
+int sysfs_merge_group(struct kobject *kobj,
+		       const struct attribute_group *grp)
+{
+	return internal_merge_group(kobj, grp, SYSFS_KOBJ_ATTR);
+}
 EXPORT_SYMBOL_GPL(sysfs_merge_group);
 
+int sysfs_merge_bin_group(struct kobject *kobj,
+			  const struct attribute_group *grp)
+{
+	return internal_merge_group(kobj, grp, SYSFS_KOBJ_BIN_ATTR);
+}
+EXPORT_SYMBOL_GPL(sysfs_merge_bin_group);
+
 /**
  * sysfs_unmerge_group - remove files from a pre-existing attribute group.
  * @kobj:	The kobject containing the group.
@@ -207,6 +239,12 @@ void sysfs_unmerge_group(struct kobject *kobj,
 }
 EXPORT_SYMBOL_GPL(sysfs_unmerge_group);
 
+void sysfs_unmerge_bin_group(struct kobject *kobj,
+			     const struct attribute_group *grp)
+{
+	sysfs_unmerge_group(kobj, grp);
+}
+EXPORT_SYMBOL_GPL(sysfs_unmerge_bin_group);
 
 EXPORT_SYMBOL_GPL(sysfs_create_group);
 EXPORT_SYMBOL_GPL(sysfs_update_group);
diff --git a/include/linux/sysfs.h b/include/linux/sysfs.h
index 30b8815..653b0b0 100644
--- a/include/linux/sysfs.h
+++ b/include/linux/sysfs.h
@@ -169,6 +169,17 @@ int sysfs_merge_group(struct kobject *kobj,
 void sysfs_unmerge_group(struct kobject *kobj,
 		       const struct attribute_group *grp);
 
+int sysfs_create_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp);
+int sysfs_update_bin_group(struct kobject *kobj,
+			   const struct attribute_group *grp);
+void sysfs_remove_bin_group(struct kobject * kobj,
+			const struct attribute_group * grp);
+int sysfs_merge_bin_group(struct kobject *kobj,
+		       const struct attribute_group *grp);
+void sysfs_unmerge_bin_group(struct kobject *kobj,
+		       const struct attribute_group *grp);
+
 void sysfs_notify(struct kobject *kobj, const char *dir, const char *attr);
 void sysfs_notify_dirent(struct sysfs_dirent *sd);
 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
