Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "Assorted misc bits and pieces. There are several single-topic branches left after this (rename2 series from Miklos, current_time series from Deepa Dinamani, xattr series from Andreas, uaccess stuff from from me) and I'd prefer to send those separately" * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (39 commits) proc: switch auxv to use of __mem_open() hpfs: support FIEMAP cifs: get rid of unused arguments of CIFSSMBWrite() posix_acl: uapi header split posix_acl: xattr representation cleanups fs/aio.c: eliminate redundant loads in put_aio_ring_file fs/internal.h: add const to ns_dentry_operations declaration compat: remove compat_printk() fs/buffer.c: make __getblk_slow() static proc: unsigned file descriptors fs/file: more unsigned file descriptors fs: compat: remove redundant check of nr_segs cachefiles: Fix attempt to read i_blocks after deleting file [ver #2] cifs: don't use memcpy() to copy struct iov_iter get rid of separate multipage fault-in primitives fs: Avoid premature clearing of capabilities fs: Give dentry to inode_change_ok() instead of inode fuse: Propagate dentry down to inode_change_ok() ceph: Propagate dentry down to inode_change_ok() xfs: Propagate dentry down to inode_change_ok() ...
This commit is contained in:
+27
-20
@@ -400,23 +400,6 @@ static const struct file_operations proc_pid_cmdline_ops = {
|
||||
.llseek = generic_file_llseek,
|
||||
};
|
||||
|
||||
static int proc_pid_auxv(struct seq_file *m, struct pid_namespace *ns,
|
||||
struct pid *pid, struct task_struct *task)
|
||||
{
|
||||
struct mm_struct *mm = mm_access(task, PTRACE_MODE_READ_FSCREDS);
|
||||
if (mm && !IS_ERR(mm)) {
|
||||
unsigned int nwords = 0;
|
||||
do {
|
||||
nwords += 2;
|
||||
} while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */
|
||||
seq_write(m, mm->saved_auxv, nwords * sizeof(mm->saved_auxv[0]));
|
||||
mmput(mm);
|
||||
return 0;
|
||||
} else
|
||||
return PTR_ERR(mm);
|
||||
}
|
||||
|
||||
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
/*
|
||||
* Provides a wchan file via kallsyms in a proper one-value-per-file format.
|
||||
@@ -709,7 +692,7 @@ int proc_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
if (attr->ia_valid & ATTR_MODE)
|
||||
return -EPERM;
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
error = setattr_prepare(dentry, attr);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -1014,6 +997,30 @@ static const struct file_operations proc_environ_operations = {
|
||||
.release = mem_release,
|
||||
};
|
||||
|
||||
static int auxv_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return __mem_open(inode, file, PTRACE_MODE_READ_FSCREDS);
|
||||
}
|
||||
|
||||
static ssize_t auxv_read(struct file *file, char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct mm_struct *mm = file->private_data;
|
||||
unsigned int nwords = 0;
|
||||
do {
|
||||
nwords += 2;
|
||||
} while (mm->saved_auxv[nwords - 2] != 0); /* AT_NULL */
|
||||
return simple_read_from_buffer(buf, count, ppos, mm->saved_auxv,
|
||||
nwords * sizeof(mm->saved_auxv[0]));
|
||||
}
|
||||
|
||||
static const struct file_operations proc_auxv_operations = {
|
||||
.open = auxv_open,
|
||||
.read = auxv_read,
|
||||
.llseek = generic_file_llseek,
|
||||
.release = mem_release,
|
||||
};
|
||||
|
||||
static ssize_t oom_adj_read(struct file *file, char __user *buf, size_t count,
|
||||
loff_t *ppos)
|
||||
{
|
||||
@@ -2842,7 +2849,7 @@ static const struct pid_entry tgid_base_stuff[] = {
|
||||
DIR("net", S_IRUGO|S_IXUGO, proc_net_inode_operations, proc_net_operations),
|
||||
#endif
|
||||
REG("environ", S_IRUSR, proc_environ_operations),
|
||||
ONE("auxv", S_IRUSR, proc_pid_auxv),
|
||||
REG("auxv", S_IRUSR, proc_auxv_operations),
|
||||
ONE("status", S_IRUGO, proc_pid_status),
|
||||
ONE("personality", S_IRUSR, proc_pid_personality),
|
||||
ONE("limits", S_IRUGO, proc_pid_limits),
|
||||
@@ -3230,7 +3237,7 @@ static const struct pid_entry tid_base_stuff[] = {
|
||||
DIR("net", S_IRUGO|S_IXUGO, proc_net_inode_operations, proc_net_operations),
|
||||
#endif
|
||||
REG("environ", S_IRUSR, proc_environ_operations),
|
||||
ONE("auxv", S_IRUSR, proc_pid_auxv),
|
||||
REG("auxv", S_IRUSR, proc_auxv_operations),
|
||||
ONE("status", S_IRUGO, proc_pid_status),
|
||||
ONE("personality", S_IRUSR, proc_pid_personality),
|
||||
ONE("limits", S_IRUGO, proc_pid_limits),
|
||||
|
||||
+4
-4
@@ -31,7 +31,7 @@ static int seq_show(struct seq_file *m, void *v)
|
||||
put_task_struct(task);
|
||||
|
||||
if (files) {
|
||||
int fd = proc_fd(m->private);
|
||||
unsigned int fd = proc_fd(m->private);
|
||||
|
||||
spin_lock(&files->file_lock);
|
||||
file = fcheck_files(files, fd);
|
||||
@@ -86,7 +86,7 @@ static int tid_fd_revalidate(struct dentry *dentry, unsigned int flags)
|
||||
struct task_struct *task;
|
||||
const struct cred *cred;
|
||||
struct inode *inode;
|
||||
int fd;
|
||||
unsigned int fd;
|
||||
|
||||
if (flags & LOOKUP_RCU)
|
||||
return -ECHILD;
|
||||
@@ -158,7 +158,7 @@ static int proc_fd_link(struct dentry *dentry, struct path *path)
|
||||
}
|
||||
|
||||
if (files) {
|
||||
int fd = proc_fd(d_inode(dentry));
|
||||
unsigned int fd = proc_fd(d_inode(dentry));
|
||||
struct file *fd_file;
|
||||
|
||||
spin_lock(&files->file_lock);
|
||||
@@ -253,7 +253,7 @@ static int proc_readfd_common(struct file *file, struct dir_context *ctx,
|
||||
continue;
|
||||
rcu_read_unlock();
|
||||
|
||||
len = snprintf(name, sizeof(name), "%d", fd);
|
||||
len = snprintf(name, sizeof(name), "%u", fd);
|
||||
if (!proc_fill_cache(file, ctx,
|
||||
name, len, instantiate, p,
|
||||
(void *)(unsigned long)fd))
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ extern const struct inode_operations proc_fdinfo_inode_operations;
|
||||
|
||||
extern int proc_fd_permission(struct inode *inode, int mask);
|
||||
|
||||
static inline int proc_fd(struct inode *inode)
|
||||
static inline unsigned int proc_fd(struct inode *inode)
|
||||
{
|
||||
return PROC_I(inode)->fd;
|
||||
}
|
||||
|
||||
+1
-1
@@ -105,7 +105,7 @@ static int proc_notify_change(struct dentry *dentry, struct iattr *iattr)
|
||||
struct proc_dir_entry *de = PDE(inode);
|
||||
int error;
|
||||
|
||||
error = inode_change_ok(inode, iattr);
|
||||
error = setattr_prepare(dentry, iattr);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
||||
+1
-1
@@ -60,7 +60,7 @@ union proc_op {
|
||||
|
||||
struct proc_inode {
|
||||
struct pid *pid;
|
||||
int fd;
|
||||
unsigned int fd;
|
||||
union proc_op op;
|
||||
struct proc_dir_entry *pde;
|
||||
struct ctl_table_header *sysctl;
|
||||
|
||||
@@ -759,7 +759,7 @@ static int proc_sys_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
if (attr->ia_valid & (ATTR_MODE | ATTR_UID | ATTR_GID))
|
||||
return -EPERM;
|
||||
|
||||
error = inode_change_ok(inode, attr);
|
||||
error = setattr_prepare(dentry, attr);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user