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:
Linus Torvalds 2018-04-06 11:07:08 -07:00
commit 9022ca6b11
22 changed files with 46 additions and 65 deletions

View File

@ -10,7 +10,6 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/kdev_t.h> #include <linux/kdev_t.h>
#include <linux/fs_struct.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/file.h> #include <linux/file.h>
#include <linux/sched/mm.h> #include <linux/sched/mm.h>

View File

@ -411,9 +411,9 @@ static long saa6588_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
break; break;
/* --- poll() for /dev/radio --- */ /* --- poll() for /dev/radio --- */
case SAA6588_CMD_POLL: case SAA6588_CMD_POLL:
a->result = 0; a->poll_mask = 0;
if (s->data_available_for_read) 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); poll_wait(a->instance, &s->read_queue, a->event_list);
break; break;

View File

@ -3344,10 +3344,10 @@ static __poll_t radio_poll(struct file *file, poll_table *wait)
radio_enable(btv); radio_enable(btv);
cmd.instance = file; cmd.instance = file;
cmd.event_list = wait; cmd.event_list = wait;
cmd.result = res; cmd.poll_mask = res;
bttv_call_all(btv, core, ioctl, SAA6588_CMD_POLL, &cmd); 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 = static const struct v4l2_file_operations radio_fops =

View File

@ -1235,12 +1235,12 @@ static __poll_t radio_poll(struct file *file, poll_table *wait)
cmd.instance = file; cmd.instance = file;
cmd.event_list = wait; cmd.event_list = wait;
cmd.result = 0; cmd.poll_mask = 0;
mutex_lock(&dev->lock); mutex_lock(&dev->lock);
saa_call_all(dev, core, ioctl, SAA6588_CMD_POLL, &cmd); saa_call_all(dev, core, ioctl, SAA6588_CMD_POLL, &cmd);
mutex_unlock(&dev->lock); mutex_unlock(&dev->lock);
return rc | cmd.result; return rc | cmd.poll_mask;
} }
/* ------------------------------------------------------------------ */ /* ------------------------------------------------------------------ */

View File

@ -2,7 +2,6 @@
#include <linux/ceph/ceph_debug.h> #include <linux/ceph/ceph_debug.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/fs_struct.h>
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sched.h> #include <linux/sched.h>

View File

@ -5024,12 +5024,12 @@ static int other_inode_match(struct inode * inode, unsigned long ino,
if ((inode->i_ino != ino) || if ((inode->i_ino != ino) ||
(inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | (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)) ((inode->i_state & I_DIRTY_TIME) == 0))
return 0; return 0;
spin_lock(&inode->i_lock); spin_lock(&inode->i_lock);
if (((inode->i_state & (I_FREEING | I_WILL_FREE | I_NEW | 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)) { (inode->i_state & I_DIRTY_TIME)) {
struct ext4_inode_info *ei = EXT4_I(inode); struct ext4_inode_info *ei = EXT4_I(inode);

View File

@ -1343,7 +1343,7 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
dirty = inode->i_state & I_DIRTY; dirty = inode->i_state & I_DIRTY;
if (inode->i_state & I_DIRTY_TIME) { 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 || wbc->sync_mode == WB_SYNC_ALL ||
unlikely(inode->i_state & I_DIRTY_TIME_EXPIRED) || unlikely(inode->i_state & I_DIRTY_TIME_EXPIRED) ||
unlikely(time_after(jiffies, 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) 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; struct super_block *sb = inode->i_sb;
int dirtytime; 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 * Don't do this for I_DIRTY_PAGES - that doesn't actually
* dirty the inode itself * 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); trace_writeback_dirty_inode_start(inode, flags);
if (sb->s_op->dirty_inode) if (sb->s_op->dirty_inode)
@ -2197,7 +2196,7 @@ void __mark_inode_dirty(struct inode *inode, int flags)
if (dirtytime) if (dirtytime)
inode->dirtied_time_when = jiffies; 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; dirty_list = &wb->b_dirty;
else else
dirty_list = &wb->b_dirty_time; dirty_list = &wb->b_dirty_time;
@ -2221,8 +2220,6 @@ void __mark_inode_dirty(struct inode *inode, int flags)
} }
out_unlock_inode: out_unlock_inode:
spin_unlock(&inode->i_lock); spin_unlock(&inode->i_lock);
#undef I_DIRTY_INODE
} }
EXPORT_SYMBOL(__mark_inode_dirty); EXPORT_SYMBOL(__mark_inode_dirty);

View File

@ -800,7 +800,7 @@ static void gfs2_dirty_inode(struct inode *inode, int flags)
int need_endtrans = 0; int need_endtrans = 0;
int ret; int ret;
if (!(flags & (I_DIRTY_DATASYNC|I_DIRTY_SYNC))) if (!(flags & I_DIRTY_INODE))
return; return;
if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags)))
return; return;

View File

@ -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); 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); 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; goto out_end_trans;
ip->i_inode.i_ctime = current_time(&ip->i_inode); 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: out_end_trans:
gfs2_trans_end(GFS2_SB(&ip->i_inode)); 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); ea_set_remove_stuffed(ip, es->es_el);
ip->i_inode.i_ctime = current_time(&ip->i_inode); 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)); gfs2_trans_end(GFS2_SB(&ip->i_inode));
return error; 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); 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)); gfs2_trans_end(GFS2_SB(&ip->i_inode));

View File

@ -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 do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
int flag); int flag);
extern int open_check_o_direct(struct file *f);
extern int vfs_open(const struct path *, struct file *, const struct cred *); extern int vfs_open(const struct path *, struct file *, const struct cred *);
extern struct file *filp_clone_open(struct file *); extern struct file *filp_clone_open(struct file *);

View File

@ -39,6 +39,7 @@
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/init_task.h> #include <linux/init_task.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/build_bug.h>
#include "internal.h" #include "internal.h"
#include "mount.h" #include "mount.h"
@ -130,6 +131,7 @@ getname_flags(const char __user *filename, int flags, int *empty)
struct filename *result; struct filename *result;
char *kname; char *kname;
int len; int len;
BUILD_BUG_ON(offsetof(struct filename, iname) % sizeof(long) != 0);
result = audit_reusename(filename); result = audit_reusename(filename);
if (result) if (result)
@ -3374,9 +3376,7 @@ static int do_last(struct nameidata *nd,
goto out; goto out;
*opened |= FILE_OPENED; *opened |= FILE_OPENED;
opened: opened:
error = open_check_o_direct(file); error = ima_file_check(file, op->acc_mode, *opened);
if (!error)
error = ima_file_check(file, op->acc_mode, *opened);
if (!error && will_truncate) if (!error && will_truncate)
error = handle_truncate(file); error = handle_truncate(file);
out: out:
@ -3456,9 +3456,6 @@ static int do_tmpfile(struct nameidata *nd, unsigned flags,
error = finish_open(file, child, NULL, opened); error = finish_open(file, child, NULL, opened);
if (error) if (error)
goto out2; goto out2;
error = open_check_o_direct(file);
if (error)
fput(file);
out2: out2:
mnt_drop_write(path.mnt); mnt_drop_write(path.mnt);
out: out:

View File

@ -52,7 +52,6 @@
#include <linux/nfs.h> #include <linux/nfs.h>
#include <linux/nfs4.h> #include <linux/nfs4.h>
#include <linux/nfs_fs.h> #include <linux/nfs_fs.h>
#include <linux/fs_struct.h>
#include "nfs4_fs.h" #include "nfs4_fs.h"
#include "internal.h" #include "internal.h"

View File

@ -381,7 +381,7 @@ MFT_RECORD *map_extent_mft_record(ntfs_inode *base_ni, MFT_REF mref,
* vfs inode dirty. This ensures that any changes to the mft record are * vfs inode dirty. This ensures that any changes to the mft record are
* written out to disk. * 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, * 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 * 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 * 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 else
base_ni = ni->ext.base_ntfs_ino; base_ni = ni->ext.base_ntfs_ino;
mutex_unlock(&ni->extent_lock); 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 " static const char *ntfs_please_email = "Please email "

View File

@ -3537,7 +3537,7 @@ static int ocfs2_downconvert_lock(struct ocfs2_super *osb,
* On DLM_LKF_VALBLK, fsdlm behaves differently with o2cb. It always * On DLM_LKF_VALBLK, fsdlm behaves differently with o2cb. It always
* expects DLM_LKF_VALBLK being set if the LKB has LVB, so that * expects DLM_LKF_VALBLK being set if the LKB has LVB, so that
* we can recover correctly from node failure. Otherwise, we may get * 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() && if (!ocfs2_is_o2cb_active() &&
lockres->l_ops->flags & LOCK_TYPE_USES_LVB) lockres->l_ops->flags & LOCK_TYPE_USES_LVB)

View File

@ -724,16 +724,6 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
return ksys_fchown(fd, user, 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, static int do_dentry_open(struct file *f,
struct inode *inode, struct inode *inode,
int (*open)(struct inode *, struct file *), 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)) { if (unlikely(f->f_flags & O_PATH)) {
f->f_mode = FMODE_PATH; f->f_mode = FMODE_PATH;
f->f_op = &empty_fops; f->f_op = &empty_fops;
return 0; goto done;
} }
if (f->f_mode & FMODE_WRITE && !special_file(inode->i_mode)) { 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); f->f_flags &= ~(O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC);
file_ra_state_init(&f->f_ra, f->f_mapping->host->i_mapping); 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; return 0;
cleanup_all: cleanup_all:
@ -823,6 +818,9 @@ static int do_dentry_open(struct file *f,
f->f_path.dentry = NULL; f->f_path.dentry = NULL;
f->f_inode = NULL; f->f_inode = NULL;
return error; 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); BUG_ON(!path->mnt);
f = get_empty_filp(); f = get_empty_filp();
if (!IS_ERR(f)) { if (IS_ERR(f))
f->f_flags = flags; return f;
error = vfs_open(path, f, cred);
if (!error) { f->f_flags = flags;
/* from now on we need fput() to dispose of f */ error = vfs_open(path, f, cred);
error = open_check_o_direct(f); if (error) {
if (error) { put_filp(f);
fput(f); return ERR_PTR(error);
f = ERR_PTR(error);
}
} else {
put_filp(f);
f = ERR_PTR(error);
}
} }
return f; return f;
} }

View File

@ -9,7 +9,6 @@
#include "orangefs-kernel.h" #include "orangefs-kernel.h"
#include "orangefs-bufmap.h" #include "orangefs-bufmap.h"
#include <linux/posix_acl_xattr.h> #include <linux/posix_acl_xattr.h>
#include <linux/fs_struct.h>
struct posix_acl *orangefs_get_acl(struct inode *inode, int type) struct posix_acl *orangefs_get_acl(struct inode *inode, int type)
{ {

View File

@ -1256,7 +1256,7 @@ static int do_setattr(struct ubifs_info *c, struct inode *inode,
* Inode length changed, so we have to make sure * Inode length changed, so we have to make sure
* @I_DIRTY_DATASYNC is set. * @I_DIRTY_DATASYNC is set.
*/ */
__mark_inode_dirty(inode, I_DIRTY_SYNC | I_DIRTY_DATASYNC); __mark_inode_dirty(inode, I_DIRTY_DATASYNC);
else else
mark_inode_dirty_sync(inode); mark_inode_dirty_sync(inode);
mutex_unlock(&ui->ui_mutex); mutex_unlock(&ui->ui_mutex);

View File

@ -1390,7 +1390,7 @@ xfs_vm_bmap(
/* /*
* The swap code (ab-)uses ->bmap to get a block mapping and then * 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, * that on reflinks inodes, so we have to skip out here. And yes,
* 0 is the magic code for a bmap error. * 0 is the magic code for a bmap error.
* *

View File

@ -2015,7 +2015,8 @@ static inline void init_sync_kiocb(struct kiocb *kiocb, struct file *filp)
#define I_WB_SWITCH (1 << 13) #define I_WB_SWITCH (1 << 13)
#define I_OVL_INUSE (1 << 14) #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) #define I_DIRTY_ALL (I_DIRTY | I_DIRTY_TIME)
extern void __mark_inode_dirty(struct inode *, int); extern void __mark_inode_dirty(struct inode *, int);
@ -2381,8 +2382,8 @@ struct audit_names;
struct filename { struct filename {
const char *name; /* pointer to actual string */ const char *name; /* pointer to actual string */
const __user char *uptr; /* original userland pointer */ const __user char *uptr; /* original userland pointer */
struct audit_names *aname;
int refcnt; int refcnt;
struct audit_names *aname;
const char iname[]; const char iname[];
}; };

View File

@ -32,6 +32,7 @@ struct saa6588_command {
unsigned char __user *buffer; unsigned char __user *buffer;
struct file *instance; struct file *instance;
poll_table *event_list; poll_table *event_list;
__poll_t poll_mask;
}; };
/* These ioctls are internal to the kernel */ /* These ioctls are internal to the kernel */

View File

@ -19,7 +19,6 @@
#include <linux/syscalls.h> #include <linux/syscalls.h>
#include <linux/sysctl.h> #include <linux/sysctl.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/fs_struct.h>
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
static int execdomains_proc_show(struct seq_file *m, void *v) static int execdomains_proc_show(struct seq_file *m, void *v)

View File

@ -19,7 +19,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/fs_struct.h>
#include <linux/lsm_hooks.h> #include <linux/lsm_hooks.h>
#include <linux/mount.h> #include <linux/mount.h>
#include <linux/path.h> #include <linux/path.h>