diff options
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 22 |
1 files changed, 12 insertions, 10 deletions
@@ -29,6 +29,7 @@ | |||
29 | #include <linux/falloc.h> | 29 | #include <linux/falloc.h> |
30 | #include <linux/fs_struct.h> | 30 | #include <linux/fs_struct.h> |
31 | #include <linux/ima.h> | 31 | #include <linux/ima.h> |
32 | #include <linux/dnotify.h> | ||
32 | 33 | ||
33 | #include "internal.h" | 34 | #include "internal.h" |
34 | 35 | ||
@@ -110,7 +111,7 @@ static long do_sys_truncate(const char __user *pathname, loff_t length) | |||
110 | 111 | ||
111 | error = locks_verify_truncate(inode, NULL, length); | 112 | error = locks_verify_truncate(inode, NULL, length); |
112 | if (!error) | 113 | if (!error) |
113 | error = security_path_truncate(&path, length, 0); | 114 | error = security_path_truncate(&path); |
114 | if (!error) | 115 | if (!error) |
115 | error = do_truncate(path.dentry, length, 0, NULL); | 116 | error = do_truncate(path.dentry, length, 0, NULL); |
116 | 117 | ||
@@ -165,8 +166,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) | |||
165 | 166 | ||
166 | error = locks_verify_truncate(inode, file, length); | 167 | error = locks_verify_truncate(inode, file, length); |
167 | if (!error) | 168 | if (!error) |
168 | error = security_path_truncate(&file->f_path, length, | 169 | error = security_path_truncate(&file->f_path); |
169 | ATTR_MTIME|ATTR_CTIME); | ||
170 | if (!error) | 170 | if (!error) |
171 | error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file); | 171 | error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file); |
172 | out_putf: | 172 | out_putf: |
@@ -367,7 +367,7 @@ SYSCALL_DEFINE1(chdir, const char __user *, filename) | |||
367 | if (error) | 367 | if (error) |
368 | goto out; | 368 | goto out; |
369 | 369 | ||
370 | error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_ACCESS); | 370 | error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); |
371 | if (error) | 371 | if (error) |
372 | goto dput_and_out; | 372 | goto dput_and_out; |
373 | 373 | ||
@@ -396,7 +396,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) | |||
396 | if (!S_ISDIR(inode->i_mode)) | 396 | if (!S_ISDIR(inode->i_mode)) |
397 | goto out_putf; | 397 | goto out_putf; |
398 | 398 | ||
399 | error = inode_permission(inode, MAY_EXEC | MAY_ACCESS); | 399 | error = inode_permission(inode, MAY_EXEC | MAY_CHDIR); |
400 | if (!error) | 400 | if (!error) |
401 | set_fs_pwd(current->fs, &file->f_path); | 401 | set_fs_pwd(current->fs, &file->f_path); |
402 | out_putf: | 402 | out_putf: |
@@ -414,7 +414,7 @@ SYSCALL_DEFINE1(chroot, const char __user *, filename) | |||
414 | if (error) | 414 | if (error) |
415 | goto out; | 415 | goto out; |
416 | 416 | ||
417 | error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_ACCESS); | 417 | error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); |
418 | if (error) | 418 | if (error) |
419 | goto dput_and_out; | 419 | goto dput_and_out; |
420 | 420 | ||
@@ -675,7 +675,7 @@ static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt, | |||
675 | f->f_path.mnt = mnt; | 675 | f->f_path.mnt = mnt; |
676 | f->f_pos = 0; | 676 | f->f_pos = 0; |
677 | f->f_op = fops_get(inode->i_fop); | 677 | f->f_op = fops_get(inode->i_fop); |
678 | file_move(f, &inode->i_sb->s_files); | 678 | file_sb_list_add(f, inode->i_sb); |
679 | 679 | ||
680 | error = security_dentry_open(f, cred); | 680 | error = security_dentry_open(f, cred); |
681 | if (error) | 681 | if (error) |
@@ -721,7 +721,7 @@ cleanup_all: | |||
721 | mnt_drop_write(mnt); | 721 | mnt_drop_write(mnt); |
722 | } | 722 | } |
723 | } | 723 | } |
724 | file_kill(f); | 724 | file_sb_list_del(f); |
725 | f->f_path.dentry = NULL; | 725 | f->f_path.dentry = NULL; |
726 | f->f_path.mnt = NULL; | 726 | f->f_path.mnt = NULL; |
727 | cleanup_file: | 727 | cleanup_file: |
@@ -888,7 +888,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, int mode) | |||
888 | put_unused_fd(fd); | 888 | put_unused_fd(fd); |
889 | fd = PTR_ERR(f); | 889 | fd = PTR_ERR(f); |
890 | } else { | 890 | } else { |
891 | fsnotify_open(f->f_path.dentry); | 891 | fsnotify_open(f); |
892 | fd_install(fd, f); | 892 | fd_install(fd, f); |
893 | } | 893 | } |
894 | } | 894 | } |
@@ -1031,7 +1031,9 @@ EXPORT_SYMBOL(generic_file_open); | |||
1031 | 1031 | ||
1032 | /* | 1032 | /* |
1033 | * This is used by subsystems that don't want seekable | 1033 | * This is used by subsystems that don't want seekable |
1034 | * file descriptors | 1034 | * file descriptors. The function is not supposed to ever fail, the only |
1035 | * reason it returns an 'int' and not 'void' is so that it can be plugged | ||
1036 | * directly into file_operations structure. | ||
1035 | */ | 1037 | */ |
1036 | int nonseekable_open(struct inode *inode, struct file *filp) | 1038 | int nonseekable_open(struct inode *inode, struct file *filp) |
1037 | { | 1039 | { |