X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fopen.c;h=e3dfda3bf6a8c9a8b2c2e023b17a8f04e7a0caa3;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=6f9a31e6e927d613bfcf5a6f92c34b6c650a0223;hpb=9213980e6a70d8473e0ffd4b39ab5b6caaba9ff5;p=linux-2.6.git diff --git a/fs/open.c b/fs/open.c index 6f9a31e6e..e3dfda3bf 100644 --- a/fs/open.c +++ b/fs/open.c @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include #include @@ -208,10 +208,9 @@ int do_truncate(struct dentry *dentry, loff_t length) newattrs.ia_size = length; newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME; + down(&dentry->d_inode->i_sem); - down_write(&dentry->d_inode->i_alloc_sem); err = notify_change(dentry, &newattrs); - up_write(&dentry->d_inode->i_alloc_sem); up(&dentry->d_inode->i_sem); return err; } @@ -613,9 +612,6 @@ asmlinkage long sys_fchmod(unsigned int fd, mode_t mode) dentry = file->f_dentry; inode = dentry->d_inode; - err = -EPERM; - if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN)) - goto out_putf; err = -EROFS; if (IS_RDONLY(inode)) goto out_putf; @@ -648,10 +644,6 @@ asmlinkage long sys_chmod(const char __user * filename, mode_t mode) goto out; inode = nd.dentry->d_inode; - error = -EPERM; - if (IS_BARRIER(inode) && !vx_check(0, VX_ADMIN)) - goto dput_and_out; - error = -EROFS; if (IS_RDONLY(inode)) goto dput_and_out; @@ -795,7 +787,7 @@ struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags) if (!f) goto cleanup_dentry; f->f_flags = flags; - f->f_mode = (flags+1) & O_ACCMODE; + f->f_mode = ((flags+1) & O_ACCMODE) | FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE; inode = dentry->d_inode; if (f->f_mode & FMODE_WRITE) { error = get_write_access(inode); @@ -866,29 +858,21 @@ repeat: * N.B. For clone tasks sharing a files structure, this test * will limit the total number of files that can be opened. */ - if (fd >= current->rlim[RLIMIT_NOFILE].rlim_cur) + if (fd >= current->signal->rlim[RLIMIT_NOFILE].rlim_cur) goto out; - /* Do we need to expand the fdset array? */ - if (fd >= files->max_fdset) { - error = expand_fdset(files, fd); - if (!error) { - error = -EMFILE; - goto repeat; - } - goto out; - } - - /* - * Check whether we need to expand the fd array. - */ - if (fd >= files->max_fds) { - error = expand_fd_array(files, fd); - if (!error) { - error = -EMFILE; - goto repeat; - } + /* Do we need to expand the fd array or fd set? */ + error = expand_files(files, fd); + if (error < 0) goto out; + + if (error) { + /* + * If we needed to expand the fs array we + * might have blocked - try again. + */ + error = -EMFILE; + goto repeat; } FD_SET(fd, files->open_fds); @@ -1086,3 +1070,15 @@ int generic_file_open(struct inode * inode, struct file * filp) } EXPORT_SYMBOL(generic_file_open); + +/* + * This is used by subsystems that don't want seekable + * file descriptors + */ +int nonseekable_open(struct inode *inode, struct file *filp) +{ + filp->f_mode &= ~(FMODE_LSEEK | FMODE_PREAD | FMODE_PWRITE); + return 0; +} + +EXPORT_SYMBOL(nonseekable_open);