diff options
author | Joel Becker <joel.becker@oracle.com> | 2006-01-25 16:31:07 -0500 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2006-02-03 17:01:05 -0500 |
commit | 3d0f89bb169482d26d5aa4e82e763077e7e9bc4d (patch) | |
tree | 2d2317ce1417202322e3f715534fab80394bd5d2 /fs/configfs/file.c | |
parent | 62ca3d2603571dc2b1b4c1368e19d44b599062e2 (diff) |
configfs: Add permission and ownership to configfs objects.
configfs always made item and attribute ownership root.root and
permissions based on a umask of 022. Add ->setattr() to allow
chown(2)/chmod(2), and persist the changes for the lifetime of the
items and attributes.
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/configfs/file.c')
-rw-r--r-- | fs/configfs/file.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/fs/configfs/file.c b/fs/configfs/file.c index c26cd61f13af..3921920d8716 100644 --- a/fs/configfs/file.c +++ b/fs/configfs/file.c | |||
@@ -26,7 +26,6 @@ | |||
26 | 26 | ||
27 | #include <linux/fs.h> | 27 | #include <linux/fs.h> |
28 | #include <linux/module.h> | 28 | #include <linux/module.h> |
29 | #include <linux/dnotify.h> | ||
30 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
31 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
32 | #include <asm/semaphore.h> | 31 | #include <asm/semaphore.h> |
@@ -150,7 +149,7 @@ out: | |||
150 | /** | 149 | /** |
151 | * fill_write_buffer - copy buffer from userspace. | 150 | * fill_write_buffer - copy buffer from userspace. |
152 | * @buffer: data buffer for file. | 151 | * @buffer: data buffer for file. |
153 | * @userbuf: data from user. | 152 | * @buf: data from user. |
154 | * @count: number of bytes in @userbuf. | 153 | * @count: number of bytes in @userbuf. |
155 | * | 154 | * |
156 | * Allocate @buffer->page if it hasn't been already, then | 155 | * Allocate @buffer->page if it hasn't been already, then |
@@ -177,8 +176,9 @@ fill_write_buffer(struct configfs_buffer * buffer, const char __user * buf, size | |||
177 | 176 | ||
178 | /** | 177 | /** |
179 | * flush_write_buffer - push buffer to config_item. | 178 | * flush_write_buffer - push buffer to config_item. |
180 | * @file: file pointer. | 179 | * @dentry: dentry to the attribute |
181 | * @buffer: data buffer for file. | 180 | * @buffer: data buffer for file. |
181 | * @count: number of bytes | ||
182 | * | 182 | * |
183 | * Get the correct pointers for the config_item and the attribute we're | 183 | * Get the correct pointers for the config_item and the attribute we're |
184 | * dealing with, then call the store() method for the attribute, | 184 | * dealing with, then call the store() method for the attribute, |
@@ -217,15 +217,16 @@ static ssize_t | |||
217 | configfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t *ppos) | 217 | configfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t *ppos) |
218 | { | 218 | { |
219 | struct configfs_buffer * buffer = file->private_data; | 219 | struct configfs_buffer * buffer = file->private_data; |
220 | ssize_t len; | ||
220 | 221 | ||
221 | down(&buffer->sem); | 222 | down(&buffer->sem); |
222 | count = fill_write_buffer(buffer,buf,count); | 223 | len = fill_write_buffer(buffer, buf, count); |
223 | if (count > 0) | 224 | if (len > 0) |
224 | count = flush_write_buffer(file->f_dentry,buffer,count); | 225 | len = flush_write_buffer(file->f_dentry, buffer, count); |
225 | if (count > 0) | 226 | if (len > 0) |
226 | *ppos += count; | 227 | *ppos += len; |
227 | up(&buffer->sem); | 228 | up(&buffer->sem); |
228 | return count; | 229 | return len; |
229 | } | 230 | } |
230 | 231 | ||
231 | static int check_perm(struct inode * inode, struct file * file) | 232 | static int check_perm(struct inode * inode, struct file * file) |