[WEXT]: Clean up how wext is called.
[firefly-linux-kernel-4.4.55.git] / fs / configfs / file.c
index cf33fac68c840cccc21ac91c617064ac36f90097..d98be5e013280e7708e825d4b458acc3219c5a62 100644 (file)
@@ -134,7 +134,7 @@ configfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *pp
 
        down(&buffer->sem);
        if (buffer->needs_read_fill) {
-               if ((retval = fill_read_buffer(file->f_dentry,buffer)))
+               if ((retval = fill_read_buffer(file->f_path.dentry,buffer)))
                        goto out;
        }
        pr_debug("%s: count = %zd, ppos = %lld, buf = %s\n",
@@ -162,14 +162,17 @@ fill_write_buffer(struct configfs_buffer * buffer, const char __user * buf, size
        int error;
 
        if (!buffer->page)
-               buffer->page = (char *)get_zeroed_page(GFP_KERNEL);
+               buffer->page = (char *)__get_free_pages(GFP_KERNEL, 0);
        if (!buffer->page)
                return -ENOMEM;
 
-       if (count > PAGE_SIZE)
-               count = PAGE_SIZE;
+       if (count >= PAGE_SIZE)
+               count = PAGE_SIZE - 1;
        error = copy_from_user(buffer->page,buf,count);
        buffer->needs_read_fill = 1;
+       /* if buf is assumed to contain a string, terminate it by \0,
+        * so e.g. sscanf() can scan the string easily */
+       buffer->page[count] = 0;
        return error ? -EFAULT : count;
 }
 
@@ -222,7 +225,7 @@ configfs_write_file(struct file *file, const char __user *buf, size_t count, lof
        down(&buffer->sem);
        len = fill_write_buffer(buffer, buf, count);
        if (len > 0)
-               len = flush_write_buffer(file->f_dentry, buffer, count);
+               len = flush_write_buffer(file->f_path.dentry, buffer, count);
        if (len > 0)
                *ppos += len;
        up(&buffer->sem);
@@ -231,8 +234,8 @@ configfs_write_file(struct file *file, const char __user *buf, size_t count, lof
 
 static int check_perm(struct inode * inode, struct file * file)
 {
-       struct config_item *item = configfs_get_config_item(file->f_dentry->d_parent);
-       struct configfs_attribute * attr = to_attr(file->f_dentry);
+       struct config_item *item = configfs_get_config_item(file->f_path.dentry->d_parent);
+       struct configfs_attribute * attr = to_attr(file->f_path.dentry);
        struct configfs_buffer * buffer;
        struct configfs_item_operations * ops = NULL;
        int error = 0;
@@ -305,8 +308,8 @@ static int configfs_open_file(struct inode * inode, struct file * filp)
 
 static int configfs_release(struct inode * inode, struct file * filp)
 {
-       struct config_item * item = to_item(filp->f_dentry->d_parent);
-       struct configfs_attribute * attr = to_attr(filp->f_dentry);
+       struct config_item * item = to_item(filp->f_path.dentry->d_parent);
+       struct configfs_attribute * attr = to_attr(filp->f_path.dentry);
        struct module * owner = attr->ca_owner;
        struct configfs_buffer * buffer = filp->private_data;