forked from Minki/linux
Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "Assorted stuff, including Christoph's I_DIRTY patches" * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: fs: move I_DIRTY_INODE to fs.h ubifs: fix bogus __mark_inode_dirty(I_DIRTY_SYNC | I_DIRTY_DATASYNC) call ntfs: fix bogus __mark_inode_dirty(I_DIRTY_SYNC | I_DIRTY_DATASYNC) call gfs2: fix bogus __mark_inode_dirty(I_DIRTY_SYNC | I_DIRTY_DATASYNC) calls fs: fold open_check_o_direct into do_dentry_open vfs: Replace stray non-ASCII homoglyph characters with their ASCII equivalents vfs: make sure struct filename->iname is word-aligned get rid of pointless includes of fs_struct.h [poll] annotate SAA6588_CMD_POLL users
This commit is contained in:
commit
9022ca6b11
@ -10,7 +10,6 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/kdev_t.h>
|
||||
#include <linux/fs_struct.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/file.h>
|
||||
#include <linux/sched/mm.h>
|
||||
|
@ -411,9 +411,9 @@ static long saa6588_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
|
||||
break;
|
||||
/* --- poll() for /dev/radio --- */
|
||||
case SAA6588_CMD_POLL:
|
||||
a->result = 0;
|
||||
a->poll_mask = 0;
|
||||
if (s->data_available_for_read)
|
||||
a->result |= EPOLLIN | EPOLLRDNORM;
|
||||
a->poll_mask |= EPOLLIN | EPOLLRDNORM;
|
||||
poll_wait(a->instance, &s->read_queue, a->event_list);
|
||||
break;
|
||||
|
||||
|
@ -3344,10 +3344,10 @@ static __poll_t radio_poll(struct file *file, poll_table *wait)
|
||||
radio_enable(btv);
|
||||
cmd.instance = file;
|
||||
cmd.event_list = wait;
|
||||
cmd.result = res;
|
||||
cmd.poll_mask = res;
|
||||
bttv_call_all(btv, core, ioctl, SAA6588_CMD_POLL, &cmd);
|
||||
|
||||
return cmd.result;
|
||||
return cmd.poll_mask;
|
||||
}
|
||||
|
||||
static const struct v4l2_file_operations radio_fops =
|
||||
|
@ -1235,12 +1235,12 @@ static __poll_t radio_poll(struct file *file, poll_table *wait)
|
||||
|
||||
cmd.instance = file;
|
||||
cmd.event_list = wait;
|
||||
cmd.result = 0;
|
||||
cmd.poll_mask = 0;
|
||||
mutex_lock(&dev->lock);
|
||||
saa_call_all(dev, core, ioctl, SAA6588_CMD_POLL, &cmd);
|
||||
mutex_unlock(&dev->lock);
|
||||
|
||||
return rc | cmd.result;
|
||||
return rc | cmd.poll_mask;
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------ */
|
||||
|
@ -2,7 +2,6 @@
|
||||
#include <linux/ceph/ceph_debug.h>
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/fs_struct.h>
|
||||
#include <linux/namei.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sched.h>
|
||||
|
@ -5024,12 +5024,12 @@ static int other_inode_match(struct inode * inode, unsigned long ino,
|
||||
|
||||
if ((inode->i_ino != ino) ||
|
||||
(inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW |
|
||||
I_DIRTY_SYNC | I_DIRTY_DATASYNC)) ||
|
||||
I_DIRTY_INODE)) ||
|
||||
((inode->i_state & I_DIRTY_TIME) == 0))
|
||||
return 0;
|
||||
spin_lock(&inode->i_lock);
|
||||
if (((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW |
|
||||
I_DIRTY_SYNC | I_DIRTY_DATASYNC)) == 0) &&
|
||||
I_DIRTY_INODE)) == 0) &&
|
||||
(inode->i_state & I_DIRTY_TIME)) {
|
||||
struct ext4_inode_info *ei = EXT4_I(inode);
|
||||
|
||||
|
@ -1343,7 +1343,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
|
||||
|
||||
dirty = inode->i_state & I_DIRTY;
|
||||
if (inode->i_state & I_DIRTY_TIME) {
|
||||
if ((dirty & (I_DIRTY_SYNC | I_DIRTY_DATASYNC)) ||
|
||||
if ((dirty & I_DIRTY_INODE) ||
|
||||
wbc->sync_mode == WB_SYNC_ALL ||
|
||||
unlikely(inode->i_state & I_DIRTY_TIME_EXPIRED) ||
|
||||
unlikely(time_after(jiffies,
|
||||
@ -2112,7 +2112,6 @@ static noinline void block_dump___mark_inode_dirty(struct inode *inode)
|
||||
*/
|
||||
void __mark_inode_dirty(struct inode *inode, int flags)
|
||||
{
|
||||
#define I_DIRTY_INODE (I_DIRTY_SYNC | I_DIRTY_DATASYNC)
|
||||
struct super_block *sb = inode->i_sb;
|
||||
int dirtytime;
|
||||
|
||||
@ -2122,7 +2121,7 @@ void __mark_inode_dirty(struct inode *inode, int flags)
|
||||
* Don't do this for I_DIRTY_PAGES - that doesn't actually
|
||||
* dirty the inode itself
|
||||
*/
|
||||
if (flags & (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_TIME)) {
|
||||
if (flags & (I_DIRTY_INODE | I_DIRTY_TIME)) {
|
||||
trace_writeback_dirty_inode_start(inode, flags);
|
||||
|
||||
if (sb->s_op->dirty_inode)
|
||||
@ -2197,7 +2196,7 @@ void __mark_inode_dirty(struct inode *inode, int flags)
|
||||
if (dirtytime)
|
||||
inode->dirtied_time_when = jiffies;
|
||||
|
||||
if (inode->i_state & (I_DIRTY_INODE | I_DIRTY_PAGES))
|
||||
if (inode->i_state & I_DIRTY)
|
||||
dirty_list = &wb->b_dirty;
|
||||
else
|
||||
dirty_list = &wb->b_dirty_time;
|
||||
@ -2221,8 +2220,6 @@ void __mark_inode_dirty(struct inode *inode, int flags)
|
||||
}
|
||||
out_unlock_inode:
|
||||
spin_unlock(&inode->i_lock);
|
||||
|
||||
#undef I_DIRTY_INODE
|
||||
}
|
||||
EXPORT_SYMBOL(__mark_inode_dirty);
|
||||
|
||||
|
@ -800,7 +800,7 @@ static void gfs2_dirty_inode(struct inode *inode, int flags)
|
||||
int need_endtrans = 0;
|
||||
int ret;
|
||||
|
||||
if (!(flags & (I_DIRTY_DATASYNC|I_DIRTY_SYNC)))
|
||||
if (!(flags & I_DIRTY_INODE))
|
||||
return;
|
||||
if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags)))
|
||||
return;
|
||||
|
@ -308,7 +308,7 @@ static int ea_dealloc_unstuffed(struct gfs2_inode *ip, struct buffer_head *bh,
|
||||
}
|
||||
|
||||
ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
__mark_inode_dirty(&ip->i_inode, I_DIRTY_SYNC | I_DIRTY_DATASYNC);
|
||||
__mark_inode_dirty(&ip->i_inode, I_DIRTY_DATASYNC);
|
||||
|
||||
gfs2_trans_end(sdp);
|
||||
|
||||
@ -768,7 +768,7 @@ static int ea_alloc_skeleton(struct gfs2_inode *ip, struct gfs2_ea_request *er,
|
||||
goto out_end_trans;
|
||||
|
||||
ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
__mark_inode_dirty(&ip->i_inode, I_DIRTY_SYNC | I_DIRTY_DATASYNC);
|
||||
__mark_inode_dirty(&ip->i_inode, I_DIRTY_DATASYNC);
|
||||
|
||||
out_end_trans:
|
||||
gfs2_trans_end(GFS2_SB(&ip->i_inode));
|
||||
@ -896,7 +896,7 @@ static int ea_set_simple_noalloc(struct gfs2_inode *ip, struct buffer_head *bh,
|
||||
ea_set_remove_stuffed(ip, es->es_el);
|
||||
|
||||
ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
__mark_inode_dirty(&ip->i_inode, I_DIRTY_SYNC | I_DIRTY_DATASYNC);
|
||||
__mark_inode_dirty(&ip->i_inode, I_DIRTY_DATASYNC);
|
||||
|
||||
gfs2_trans_end(GFS2_SB(&ip->i_inode));
|
||||
return error;
|
||||
@ -1114,7 +1114,7 @@ static int ea_remove_stuffed(struct gfs2_inode *ip, struct gfs2_ea_location *el)
|
||||
}
|
||||
|
||||
ip->i_inode.i_ctime = current_time(&ip->i_inode);
|
||||
__mark_inode_dirty(&ip->i_inode, I_DIRTY_SYNC | I_DIRTY_DATASYNC);
|
||||
__mark_inode_dirty(&ip->i_inode, I_DIRTY_DATASYNC);
|
||||
|
||||
gfs2_trans_end(GFS2_SB(&ip->i_inode));
|
||||
|
||||
|
@ -125,7 +125,6 @@ int do_fchmodat(int dfd, const char __user *filename, umode_t mode);
|
||||
int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
|
||||
int flag);
|
||||
|
||||
extern int open_check_o_direct(struct file *f);
|
||||
extern int vfs_open(const struct path *, struct file *, const struct cred *);
|
||||
extern struct file *filp_clone_open(struct file *);
|
||||
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/init_task.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/build_bug.h>
|
||||
|
||||
#include "internal.h"
|
||||
#include "mount.h"
|
||||
@ -130,6 +131,7 @@ getname_flags(const char __user *filename, int flags, int *empty)
|
||||
struct filename *result;
|
||||
char *kname;
|
||||
int len;
|
||||
BUILD_BUG_ON(offsetof(struct filename, iname) % sizeof(long) != 0);
|
||||
|
||||
result = audit_reusename(filename);
|
||||
if (result)
|
||||
@ -3374,9 +3376,7 @@ finish_open_created:
|
||||
goto out;
|
||||
*opened |= FILE_OPENED;
|
||||
opened:
|
||||
error = open_check_o_direct(file);
|
||||
if (!error)
|
||||
error = ima_file_check(file, op->acc_mode, *opened);
|
||||
error = ima_file_check(file, op->acc_mode, *opened);
|
||||
if (!error && will_truncate)
|
||||
error = handle_truncate(file);
|
||||
out:
|
||||
@ -3456,9 +3456,6 @@ static int do_tmpfile(struct nameidata *nd, unsigned flags,
|
||||
error = finish_open(file, child, NULL, opened);
|
||||
if (error)
|
||||
goto out2;
|
||||
error = open_check_o_direct(file);
|
||||
if (error)
|
||||
fput(file);
|
||||
out2:
|
||||
mnt_drop_write(path.mnt);
|
||||
out:
|
||||
|
@ -52,7 +52,6 @@
|
||||
#include <linux/nfs.h>
|
||||
#include <linux/nfs4.h>
|
||||
#include <linux/nfs_fs.h>
|
||||
#include <linux/fs_struct.h>
|
||||
|
||||
#include "nfs4_fs.h"
|
||||
#include "internal.h"
|
||||
|
@ -381,7 +381,7 @@ unm_err_out:
|
||||
* vfs inode dirty. This ensures that any changes to the mft record are
|
||||
* written out to disk.
|
||||
*
|
||||
* NOTE: We only set I_DIRTY_SYNC and I_DIRTY_DATASYNC (and not I_DIRTY_PAGES)
|
||||
* NOTE: We only set I_DIRTY_DATASYNC (and not I_DIRTY_PAGES)
|
||||
* on the base vfs inode, because even though file data may have been modified,
|
||||
* it is dirty in the inode meta data rather than the data page cache of the
|
||||
* inode, and thus there are no data pages that need writing out. Therefore, a
|
||||
@ -407,7 +407,7 @@ void __mark_mft_record_dirty(ntfs_inode *ni)
|
||||
else
|
||||
base_ni = ni->ext.base_ntfs_ino;
|
||||
mutex_unlock(&ni->extent_lock);
|
||||
__mark_inode_dirty(VFS_I(base_ni), I_DIRTY_SYNC | I_DIRTY_DATASYNC);
|
||||
__mark_inode_dirty(VFS_I(base_ni), I_DIRTY_DATASYNC);
|
||||
}
|
||||
|
||||
static const char *ntfs_please_email = "Please email "
|
||||
|
@ -3537,7 +3537,7 @@ static int ocfs2_downconvert_lock(struct ocfs2_super *osb,
|
||||
* On DLM_LKF_VALBLK, fsdlm behaves differently with o2cb. It always
|
||||
* expects DLM_LKF_VALBLK being set if the LKB has LVB, so that
|
||||
* we can recover correctly from node failure. Otherwise, we may get
|
||||
* invalid LVB in LKB, but without DLM_SBF_VALNOTVALID being set.
|
||||
* invalid LVB in LKB, but without DLM_SBF_VALNOTVALID being set.
|
||||
*/
|
||||
if (!ocfs2_is_o2cb_active() &&
|
||||
lockres->l_ops->flags & LOCK_TYPE_USES_LVB)
|
||||
|
44
fs/open.c
44
fs/open.c
@ -724,16 +724,6 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
|
||||
return ksys_fchown(fd, user, group);
|
||||
}
|
||||
|
||||
int open_check_o_direct(struct file *f)
|
||||
{
|
||||
/* NB: we're sure to have correct a_ops only after f_op->open */
|
||||
if (f->f_flags & O_DIRECT) {
|
||||
if (!f->f_mapping->a_ops || !f->f_mapping->a_ops->direct_IO)
|
||||
return -EINVAL;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int do_dentry_open(struct file *f,
|
||||
struct inode *inode,
|
||||
int (*open)(struct inode *, struct file *),
|
||||
@ -755,7 +745,7 @@ static int do_dentry_open(struct file *f,
|
||||
if (unlikely(f->f_flags & O_PATH)) {
|
||||
f->f_mode = FMODE_PATH;
|
||||
f->f_op = &empty_fops;
|
||||
return 0;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (f->f_mode & FMODE_WRITE && !special_file(inode->i_mode)) {
|
||||
@ -808,7 +798,12 @@ static int do_dentry_open(struct file *f,
|
||||
f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
|
||||
|
||||
file_ra_state_init(&f->f_ra, f->f_mapping->host->i_mapping);
|
||||
|
||||
done:
|
||||
/* NB: we're sure to have correct a_ops only after f_op->open */
|
||||
error = -EINVAL;
|
||||
if ((f->f_flags & O_DIRECT) &&
|
||||
(!f->f_mapping->a_ops || !f->f_mapping->a_ops->direct_IO))
|
||||
goto out_fput;
|
||||
return 0;
|
||||
|
||||
cleanup_all:
|
||||
@ -823,6 +818,9 @@ cleanup_file:
|
||||
f->f_path.dentry = NULL;
|
||||
f->f_inode = NULL;
|
||||
return error;
|
||||
out_fput:
|
||||
fput(f);
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -920,20 +918,14 @@ struct file *dentry_open(const struct path *path, int flags,
|
||||
BUG_ON(!path->mnt);
|
||||
|
||||
f = get_empty_filp();
|
||||
if (!IS_ERR(f)) {
|
||||
f->f_flags = flags;
|
||||
error = vfs_open(path, f, cred);
|
||||
if (!error) {
|
||||
/* from now on we need fput() to dispose of f */
|
||||
error = open_check_o_direct(f);
|
||||
if (error) {
|
||||
fput(f);
|
||||
f = ERR_PTR(error);
|
||||
}
|
||||
} else {
|
||||
put_filp(f);
|
||||
f = ERR_PTR(error);
|
||||
}
|
||||
if (IS_ERR(f))
|
||||
return f;
|
||||
|
||||
f->f_flags = flags;
|
||||
error = vfs_open(path, f, cred);
|
||||
if (error) {
|
||||
put_filp(f);
|
||||
return ERR_PTR(error);
|
||||
}
|
||||
return f;
|
||||
}
|
||||
|
@ -9,7 +9,6 @@
|
||||
#include "orangefs-kernel.h"
|
||||
#include "orangefs-bufmap.h"
|
||||
#include <linux/posix_acl_xattr.h>
|
||||
#include <linux/fs_struct.h>
|
||||
|
||||
struct posix_acl *orangefs_get_acl(struct inode *inode, int type)
|
||||
{
|
||||
|
@ -1256,7 +1256,7 @@ static int do_setattr(struct ubifs_info *c, struct inode *inode,
|
||||
* Inode length changed, so we have to make sure
|
||||
* @I_DIRTY_DATASYNC is set.
|
||||
*/
|
||||
__mark_inode_dirty(inode, I_DIRTY_SYNC | I_DIRTY_DATASYNC);
|
||||
__mark_inode_dirty(inode, I_DIRTY_DATASYNC);
|
||||
else
|
||||
mark_inode_dirty_sync(inode);
|
||||
mutex_unlock(&ui->ui_mutex);
|
||||
|
@ -1390,7 +1390,7 @@ xfs_vm_bmap(
|
||||
|
||||
/*
|
||||
* The swap code (ab-)uses ->bmap to get a block mapping and then
|
||||
* bypasseѕ the file system for actual I/O. We really can't allow
|
||||
* bypasses the file system for actual I/O. We really can't allow
|
||||
* that on reflinks inodes, so we have to skip out here. And yes,
|
||||
* 0 is the magic code for a bmap error.
|
||||
*
|
||||
|
@ -2015,7 +2015,8 @@ static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp)
|
||||
#define I_WB_SWITCH (1 << 13)
|
||||
#define I_OVL_INUSE (1 << 14)
|
||||
|
||||
#define I_DIRTY (I_DIRTY_SYNC | I_DIRTY_DATASYNC | I_DIRTY_PAGES)
|
||||
#define I_DIRTY_INODE (I_DIRTY_SYNC | I_DIRTY_DATASYNC)
|
||||
#define I_DIRTY (I_DIRTY_INODE | I_DIRTY_PAGES)
|
||||
#define I_DIRTY_ALL (I_DIRTY | I_DIRTY_TIME)
|
||||
|
||||
extern void __mark_inode_dirty(struct inode *, int);
|
||||
@ -2381,8 +2382,8 @@ struct audit_names;
|
||||
struct filename {
|
||||
const char *name; /* pointer to actual string */
|
||||
const __user char *uptr; /* original userland pointer */
|
||||
struct audit_names *aname;
|
||||
int refcnt;
|
||||
struct audit_names *aname;
|
||||
const char iname[];
|
||||
};
|
||||
|
||||
|
@ -32,6 +32,7 @@ struct saa6588_command {
|
||||
unsigned char __user *buffer;
|
||||
struct file *instance;
|
||||
poll_table *event_list;
|
||||
__poll_t poll_mask;
|
||||
};
|
||||
|
||||
/* These ioctls are internal to the kernel */
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/fs_struct.h>
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
static int execdomains_proc_show(struct seq_file *m, void *v)
|
||||
|
@ -19,7 +19,6 @@
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/fs_struct.h>
|
||||
#include <linux/lsm_hooks.h>
|
||||
#include <linux/mount.h>
|
||||
#include <linux/path.h>
|
||||
|
Loading…
Reference in New Issue
Block a user