mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 17:24:17 +08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: jfs: Fix 32bit build warning Remove obsolete comment in fs.h Sanitize f_flags helpers Fix f_flags/f_mode in case of lookup_instantiate_filp() from open(pathname, 3) anonfd: Allow making anon files read-only fs/compat_ioctl.c: fix build error when !BLOCK pohmelfs needs I_LOCK alloc_file(): simplify handling of mnt_clone_write() errors
This commit is contained in:
commit
fe35d4a028
@ -722,8 +722,6 @@ static int pohmelfs_remove_entry(struct inode *dir, struct dentry *dentry)
|
||||
if (inode->i_nlink)
|
||||
inode_dec_link_count(inode);
|
||||
}
|
||||
dprintk("%s: inode: %p, lock: %ld, unhashed: %d.\n",
|
||||
__func__, pi, inode->i_state & I_LOCK, hlist_unhashed(&inode->i_hash));
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -121,13 +121,13 @@ struct file *anon_inode_getfile(const char *name,
|
||||
d_instantiate(path.dentry, anon_inode_inode);
|
||||
|
||||
error = -ENFILE;
|
||||
file = alloc_file(&path, FMODE_READ | FMODE_WRITE, fops);
|
||||
file = alloc_file(&path, OPEN_FMODE(flags), fops);
|
||||
if (!file)
|
||||
goto err_dput;
|
||||
file->f_mapping = anon_inode_inode->i_mapping;
|
||||
|
||||
file->f_pos = 0;
|
||||
file->f_flags = O_RDWR | (flags & O_NONBLOCK);
|
||||
file->f_flags = flags & (O_ACCMODE | O_NONBLOCK);
|
||||
file->f_version = 0;
|
||||
file->private_data = priv;
|
||||
|
||||
|
@ -1600,8 +1600,6 @@ static long do_ioctl_trans(int fd, unsigned int cmd,
|
||||
case KDSKBMETA:
|
||||
case KDSKBLED:
|
||||
case KDSETLED:
|
||||
/* SG stuff */
|
||||
case SG_SET_TRANSFORM:
|
||||
/* AUTOFS */
|
||||
case AUTOFS_IOC_READY:
|
||||
case AUTOFS_IOC_FAIL:
|
||||
|
@ -339,7 +339,7 @@ struct file *eventfd_file_create(unsigned int count, int flags)
|
||||
ctx->flags = flags;
|
||||
|
||||
file = anon_inode_getfile("[eventfd]", &eventfd_fops, ctx,
|
||||
flags & EFD_SHARED_FCNTL_FLAGS);
|
||||
O_RDWR | (flags & EFD_SHARED_FCNTL_FLAGS));
|
||||
if (IS_ERR(file))
|
||||
eventfd_free_ctx(ctx);
|
||||
|
||||
|
@ -1206,7 +1206,7 @@ SYSCALL_DEFINE1(epoll_create1, int, flags)
|
||||
* a file structure and a free file descriptor.
|
||||
*/
|
||||
error = anon_inode_getfd("[eventpoll]", &eventpoll_fops, ep,
|
||||
flags & O_CLOEXEC);
|
||||
O_RDWR | (flags & O_CLOEXEC));
|
||||
if (error < 0)
|
||||
ep_free(ep);
|
||||
|
||||
|
@ -186,10 +186,8 @@ struct file *alloc_file(struct path *path, fmode_t mode,
|
||||
* that we can do debugging checks at __fput()
|
||||
*/
|
||||
if ((mode & FMODE_WRITE) && !special_file(path->dentry->d_inode->i_mode)) {
|
||||
int error = 0;
|
||||
file_take_write(file);
|
||||
error = mnt_clone_write(path->mnt);
|
||||
WARN_ON(error);
|
||||
WARN_ON(mnt_clone_write(path->mnt));
|
||||
}
|
||||
ima_counts_get(file);
|
||||
return file;
|
||||
|
@ -85,3 +85,10 @@ extern struct file *get_empty_filp(void);
|
||||
* super.c
|
||||
*/
|
||||
extern int do_remount_sb(struct super_block *, int, void *, int);
|
||||
|
||||
/*
|
||||
* open.c
|
||||
*/
|
||||
struct nameidata;
|
||||
extern struct file *nameidata_to_filp(struct nameidata *);
|
||||
extern void release_open_intent(struct nameidata *);
|
||||
|
@ -524,7 +524,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent)
|
||||
* Page cache is indexed by long.
|
||||
* I would use MAX_LFS_FILESIZE, but it's only half as big
|
||||
*/
|
||||
sb->s_maxbytes = min(((u64) PAGE_CACHE_SIZE << 32) - 1, sb->s_maxbytes);
|
||||
sb->s_maxbytes = min(((u64) PAGE_CACHE_SIZE << 32) - 1, (u64)sb->s_maxbytes);
|
||||
#endif
|
||||
sb->s_time_gran = 1;
|
||||
return 0;
|
||||
|
@ -37,8 +37,6 @@
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
#define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE])
|
||||
|
||||
/* [Feb-1997 T. Schoebel-Theuer]
|
||||
* Fundamental changes in the pathname lookup mechanisms (namei)
|
||||
* were necessary because of omirr. The reason is that omirr needs
|
||||
@ -1640,6 +1638,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
|
||||
if (filp == NULL)
|
||||
return ERR_PTR(-ENFILE);
|
||||
nd.intent.open.file = filp;
|
||||
filp->f_flags = open_flag;
|
||||
nd.intent.open.flags = flag;
|
||||
nd.intent.open.create_mode = 0;
|
||||
error = do_path_lookup(dfd, pathname,
|
||||
@ -1685,6 +1684,7 @@ struct file *do_filp_open(int dfd, const char *pathname,
|
||||
if (filp == NULL)
|
||||
goto exit_parent;
|
||||
nd.intent.open.file = filp;
|
||||
filp->f_flags = open_flag;
|
||||
nd.intent.open.flags = flag;
|
||||
nd.intent.open.create_mode = mode;
|
||||
dir = nd.path.dentry;
|
||||
@ -1725,7 +1725,7 @@ do_last:
|
||||
mnt_drop_write(nd.path.mnt);
|
||||
goto exit;
|
||||
}
|
||||
filp = nameidata_to_filp(&nd, open_flag);
|
||||
filp = nameidata_to_filp(&nd);
|
||||
mnt_drop_write(nd.path.mnt);
|
||||
if (nd.root.mnt)
|
||||
path_put(&nd.root);
|
||||
@ -1789,7 +1789,7 @@ ok:
|
||||
mnt_drop_write(nd.path.mnt);
|
||||
goto exit;
|
||||
}
|
||||
filp = nameidata_to_filp(&nd, open_flag);
|
||||
filp = nameidata_to_filp(&nd);
|
||||
if (!IS_ERR(filp)) {
|
||||
error = ima_path_check(&filp->f_path, filp->f_mode &
|
||||
(MAY_READ | MAY_WRITE | MAY_EXEC));
|
||||
|
13
fs/open.c
13
fs/open.c
@ -821,15 +821,14 @@ static inline int __get_file_write_access(struct inode *inode,
|
||||
}
|
||||
|
||||
static struct file *__dentry_open(struct dentry *dentry, struct vfsmount *mnt,
|
||||
int flags, struct file *f,
|
||||
struct file *f,
|
||||
int (*open)(struct inode *, struct file *),
|
||||
const struct cred *cred)
|
||||
{
|
||||
struct inode *inode;
|
||||
int error;
|
||||
|
||||
f->f_flags = flags;
|
||||
f->f_mode = (__force fmode_t)((flags+1) & O_ACCMODE) | FMODE_LSEEK |
|
||||
f->f_mode = OPEN_FMODE(f->f_flags) | FMODE_LSEEK |
|
||||
FMODE_PREAD | FMODE_PWRITE;
|
||||
inode = dentry->d_inode;
|
||||
if (f->f_mode & FMODE_WRITE) {
|
||||
@ -930,7 +929,6 @@ struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry
|
||||
if (IS_ERR(dentry))
|
||||
goto out_err;
|
||||
nd->intent.open.file = __dentry_open(dget(dentry), mntget(nd->path.mnt),
|
||||
nd->intent.open.flags - 1,
|
||||
nd->intent.open.file,
|
||||
open, cred);
|
||||
out:
|
||||
@ -949,7 +947,7 @@ EXPORT_SYMBOL_GPL(lookup_instantiate_filp);
|
||||
*
|
||||
* Note that this function destroys the original nameidata
|
||||
*/
|
||||
struct file *nameidata_to_filp(struct nameidata *nd, int flags)
|
||||
struct file *nameidata_to_filp(struct nameidata *nd)
|
||||
{
|
||||
const struct cred *cred = current_cred();
|
||||
struct file *filp;
|
||||
@ -958,7 +956,7 @@ struct file *nameidata_to_filp(struct nameidata *nd, int flags)
|
||||
filp = nd->intent.open.file;
|
||||
/* Has the filesystem initialised the file for us? */
|
||||
if (filp->f_path.dentry == NULL)
|
||||
filp = __dentry_open(nd->path.dentry, nd->path.mnt, flags, filp,
|
||||
filp = __dentry_open(nd->path.dentry, nd->path.mnt, filp,
|
||||
NULL, cred);
|
||||
else
|
||||
path_put(&nd->path);
|
||||
@ -997,7 +995,8 @@ struct file *dentry_open(struct dentry *dentry, struct vfsmount *mnt, int flags,
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
|
||||
return __dentry_open(dentry, mnt, flags, f, NULL, cred);
|
||||
f->f_flags = flags;
|
||||
return __dentry_open(dentry, mnt, f, NULL, cred);
|
||||
}
|
||||
EXPORT_SYMBOL(dentry_open);
|
||||
|
||||
|
@ -236,7 +236,7 @@ SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask,
|
||||
* anon_inode_getfd() will install the fd.
|
||||
*/
|
||||
ufd = anon_inode_getfd("[signalfd]", &signalfd_fops, ctx,
|
||||
flags & (O_CLOEXEC | O_NONBLOCK));
|
||||
O_RDWR | (flags & (O_CLOEXEC | O_NONBLOCK)));
|
||||
if (ufd < 0)
|
||||
kfree(ctx);
|
||||
} else {
|
||||
|
@ -200,7 +200,7 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
|
||||
hrtimer_init(&ctx->tmr, clockid, HRTIMER_MODE_ABS);
|
||||
|
||||
ufd = anon_inode_getfd("[timerfd]", &timerfd_fops, ctx,
|
||||
flags & TFD_SHARED_FCNTL_FLAGS);
|
||||
O_RDWR | (flags & TFD_SHARED_FCNTL_FLAGS));
|
||||
if (ufd < 0)
|
||||
kfree(ctx);
|
||||
|
||||
|
@ -1624,8 +1624,6 @@ struct super_operations {
|
||||
* on the bit address once it is done.
|
||||
*
|
||||
* Q: What is the difference between I_WILL_FREE and I_FREEING?
|
||||
* Q: igrab() only checks on (I_FREEING|I_WILL_FREE). Should it also check on
|
||||
* I_CLEAR? If not, why?
|
||||
*/
|
||||
#define I_DIRTY_SYNC 1
|
||||
#define I_DIRTY_DATASYNC 2
|
||||
@ -2464,5 +2462,8 @@ int proc_nr_files(struct ctl_table *table, int write,
|
||||
|
||||
int __init get_filesystem_list(char *buf);
|
||||
|
||||
#define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE])
|
||||
#define OPEN_FMODE(flag) ((__force fmode_t)((flag + 1) & O_ACCMODE))
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _LINUX_FS_H */
|
||||
|
@ -72,8 +72,6 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
|
||||
|
||||
extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
|
||||
int (*open)(struct inode *, struct file *));
|
||||
extern struct file *nameidata_to_filp(struct nameidata *nd, int flags);
|
||||
extern void release_open_intent(struct nameidata *);
|
||||
|
||||
extern struct dentry *lookup_one_len(const char *, struct dentry *, int);
|
||||
|
||||
|
@ -250,7 +250,6 @@ struct audit_context {
|
||||
#endif
|
||||
};
|
||||
|
||||
#define ACC_MODE(x) ("\004\002\006\006"[(x)&O_ACCMODE])
|
||||
static inline int open_arg(int flags, int mask)
|
||||
{
|
||||
int n = ACC_MODE(flags);
|
||||
|
@ -4724,7 +4724,7 @@ SYSCALL_DEFINE5(perf_event_open,
|
||||
if (IS_ERR(event))
|
||||
goto err_put_context;
|
||||
|
||||
err = anon_inode_getfd("[perf_event]", &perf_fops, event, 0);
|
||||
err = anon_inode_getfd("[perf_event]", &perf_fops, event, O_RDWR);
|
||||
if (err < 0)
|
||||
goto err_free_put_context;
|
||||
|
||||
|
@ -12,7 +12,6 @@
|
||||
#include "common.h"
|
||||
#include "tomoyo.h"
|
||||
#include "realpath.h"
|
||||
#define ACC_MODE(x) ("\000\004\002\006"[(x)&O_ACCMODE])
|
||||
|
||||
/*
|
||||
* tomoyo_globally_readable_file_entry is a structure which is used for holding
|
||||
|
@ -1177,7 +1177,7 @@ static struct file_operations kvm_vcpu_fops = {
|
||||
*/
|
||||
static int create_vcpu_fd(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return anon_inode_getfd("kvm-vcpu", &kvm_vcpu_fops, vcpu, 0);
|
||||
return anon_inode_getfd("kvm-vcpu", &kvm_vcpu_fops, vcpu, O_RDWR);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1638,7 +1638,7 @@ static int kvm_dev_ioctl_create_vm(void)
|
||||
kvm = kvm_create_vm();
|
||||
if (IS_ERR(kvm))
|
||||
return PTR_ERR(kvm);
|
||||
fd = anon_inode_getfd("kvm-vm", &kvm_vm_fops, kvm, 0);
|
||||
fd = anon_inode_getfd("kvm-vm", &kvm_vm_fops, kvm, O_RDWR);
|
||||
if (fd < 0)
|
||||
kvm_put_kvm(kvm);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user