diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 00012e3..7ce3779 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -240,6 +240,48 @@ sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t
 	return len;
 }
 
+static ssize_t
+sysfs_writev_file(struct kiocb *iocb, const struct iovec *iv,
+		  unsigned long count, loff_t pos)
+{
+	struct sysfs_buffer *buffer = iocb->ki_filp->private_data;
+	int i;
+	char *buf;
+	ssize_t len;
+
+	mutex_lock(&buffer->mutex);
+	if (!buffer->page)
+		buffer->page = (char *)get_zeroed_page(GFP_KERNEL);
+	if (!buffer->page) {
+		len = -ENOMEM;
+		goto out;
+	}
+
+	len = iov_length(iv, count);
+	if (len >= PAGE_SIZE) {
+		len = -EINVAL;
+		goto out;
+	}
+
+	buf = buffer->page;
+	for (i = 0; i < count; i++) {
+		if (copy_from_user(buf, iv[i].iov_base, iv[i].iov_len)) {
+			len = -EFAULT;
+			goto out;
+		}
+		buf += iv[i].iov_len;
+	}
+
+	buffer->needs_read_fill = 1;
+	if (len > 0)
+		len = flush_write_buffer(iocb->ki_filp->f_path.dentry, buffer, len);
+	if (len > 0)
+		iocb->ki_pos = pos + len;
+out:
+	mutex_unlock(&buffer->mutex);
+	return len;
+}
+
 /**
  *	sysfs_get_open_dirent - get or create sysfs_open_dirent
  *	@sd: target sysfs_dirent
@@ -479,6 +521,7 @@ EXPORT_SYMBOL_GPL(sysfs_notify);
 const struct file_operations sysfs_file_operations = {
 	.read		= sysfs_read_file,
 	.write		= sysfs_write_file,
+	.aio_write	= sysfs_writev_file,
 	.llseek		= generic_file_llseek,
 	.open		= sysfs_open_file,
 	.release	= sysfs_release,
