diff options
Diffstat (limited to 'fs/open.c')
-rw-r--r-- | fs/open.c | 15 |
1 files changed, 9 insertions, 6 deletions
@@ -164,11 +164,13 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) | |||
164 | if (IS_APPEND(inode)) | 164 | if (IS_APPEND(inode)) |
165 | goto out_putf; | 165 | goto out_putf; |
166 | 166 | ||
167 | sb_start_write(inode->i_sb); | ||
167 | error = locks_verify_truncate(inode, file, length); | 168 | error = locks_verify_truncate(inode, file, length); |
168 | if (!error) | 169 | if (!error) |
169 | error = security_path_truncate(&file->f_path); | 170 | error = security_path_truncate(&file->f_path); |
170 | if (!error) | 171 | if (!error) |
171 | error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file); | 172 | error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file); |
173 | sb_end_write(inode->i_sb); | ||
172 | out_putf: | 174 | out_putf: |
173 | fput(file); | 175 | fput(file); |
174 | out: | 176 | out: |
@@ -266,7 +268,10 @@ int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len) | |||
266 | if (!file->f_op->fallocate) | 268 | if (!file->f_op->fallocate) |
267 | return -EOPNOTSUPP; | 269 | return -EOPNOTSUPP; |
268 | 270 | ||
269 | return file->f_op->fallocate(file, mode, offset, len); | 271 | sb_start_write(inode->i_sb); |
272 | ret = file->f_op->fallocate(file, mode, offset, len); | ||
273 | sb_end_write(inode->i_sb); | ||
274 | return ret; | ||
270 | } | 275 | } |
271 | 276 | ||
272 | SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len) | 277 | SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len) |
@@ -620,7 +625,7 @@ static inline int __get_file_write_access(struct inode *inode, | |||
620 | /* | 625 | /* |
621 | * Balanced in __fput() | 626 | * Balanced in __fput() |
622 | */ | 627 | */ |
623 | error = mnt_want_write(mnt); | 628 | error = __mnt_want_write(mnt); |
624 | if (error) | 629 | if (error) |
625 | put_write_access(inode); | 630 | put_write_access(inode); |
626 | } | 631 | } |
@@ -654,6 +659,7 @@ static int do_dentry_open(struct file *f, | |||
654 | if (unlikely(f->f_flags & O_PATH)) | 659 | if (unlikely(f->f_flags & O_PATH)) |
655 | f->f_mode = FMODE_PATH; | 660 | f->f_mode = FMODE_PATH; |
656 | 661 | ||
662 | path_get(&f->f_path); | ||
657 | inode = f->f_path.dentry->d_inode; | 663 | inode = f->f_path.dentry->d_inode; |
658 | if (f->f_mode & FMODE_WRITE) { | 664 | if (f->f_mode & FMODE_WRITE) { |
659 | error = __get_file_write_access(inode, f->f_path.mnt); | 665 | error = __get_file_write_access(inode, f->f_path.mnt); |
@@ -739,9 +745,7 @@ int finish_open(struct file *file, struct dentry *dentry, | |||
739 | int error; | 745 | int error; |
740 | BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */ | 746 | BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */ |
741 | 747 | ||
742 | mntget(file->f_path.mnt); | 748 | file->f_path.dentry = dentry; |
743 | file->f_path.dentry = dget(dentry); | ||
744 | |||
745 | error = do_dentry_open(file, open, current_cred()); | 749 | error = do_dentry_open(file, open, current_cred()); |
746 | if (!error) | 750 | if (!error) |
747 | *opened |= FILE_OPENED; | 751 | *opened |= FILE_OPENED; |
@@ -784,7 +788,6 @@ struct file *dentry_open(const struct path *path, int flags, | |||
784 | 788 | ||
785 | f->f_flags = flags; | 789 | f->f_flags = flags; |
786 | f->f_path = *path; | 790 | f->f_path = *path; |
787 | path_get(&f->f_path); | ||
788 | error = do_dentry_open(f, NULL, cred); | 791 | error = do_dentry_open(f, NULL, cred); |
789 | if (!error) { | 792 | if (!error) { |
790 | error = open_check_o_direct(f); | 793 | error = open_check_o_direct(f); |