Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Apr 2018 18:07:08 +0000 (11:07 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 6 Apr 2018 18:07:08 +0000 (11:07 -0700)
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

22 files changed:
arch/arc/kernel/troubleshoot.c
drivers/media/i2c/saa6588.c
drivers/media/pci/bt8xx/bttv-driver.c
drivers/media/pci/saa7134/saa7134-video.c
fs/ceph/dir.c
fs/ext4/inode.c
fs/fs-writeback.c
fs/gfs2/super.c
fs/gfs2/xattr.c
fs/internal.h
fs/namei.c
fs/nfs/nfs4xdr.c
fs/ntfs/mft.c
fs/ocfs2/dlmglue.c
fs/open.c
fs/orangefs/acl.c
fs/ubifs/file.c
fs/xfs/xfs_aops.c
include/linux/fs.h
include/media/i2c/saa6588.h
kernel/exec_domain.c
security/loadpin/loadpin.c

index 6e9a0a9a6a04e1794ca0bbe6ec75dc5ab0617352..783b20354f8bf7889075ec4219310eb9b6f4fbf7 100644 (file)
@@ -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>
index c3089bd34df252daabc5ef49384f37ff1a2f2e40..33d2987f9555e578c07ac061f1b2136a9a8c88f0 100644 (file)
@@ -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;
 
index f697698fe38ded00117586ada77a8eb7c3a1b13c..707f57a9f9404295210b41e2533dac30d4ee86b4 100644 (file)
@@ -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 =
index 4f1091a11e91f754bfafbdef637e8cf37803444d..1a50ec9d084f3d6e78fb50ae818b9330071e4ba2 100644 (file)
@@ -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;
 }
 
 /* ------------------------------------------------------------------ */
index f1d9c6cc0491d7f9f33e4073db9785afac669cc8..2bdd561c4c68d38ef92b78eb4829afb88186b188 100644 (file)
@@ -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>
index 18aa2ef963ad94de80b4df92f219abc630ff4eee..129205028300d48f66793314a45070a4270bb69d 100644 (file)
@@ -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);
 
index d4d04fee568ac13329abf91bc8ab803a4808afcc..1280f915079b4724eaf8494e06d00de497a93e4e 100644 (file)
@@ -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);
 
index 620be0521866eb2f4eee21d78817b47b24e55104..cf5c7f3080d24502218a4a3dadd776c61de7d1cd 100644 (file)
@@ -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;
index 05de2095465926d5be73f58012011b608ae1690e..f2bce1e0f6fb5ee04f15a21356df99bda32c027e 100644 (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);
-       __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));
 
index 980d005b21b4111084ab7a56b17fda7e5b1320f5..e08972db030366c7616606b53f91ddeb50ef4ba1 100644 (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 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 *);
 
index a09419379f5db033d2c0315ae379180f73d6cff5..5661da1972cdadfb17c26f15703df167c0c1322e 100644 (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:
index 65c9c4175145903b3176d42fc2ed27c1ca6f779a..b993ad282de2002579255914d8bca14698f16854 100644 (file)
@@ -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"
index 2831f495a6740087c86547582e81cd40735c5e60..32c523cf5a2d99d2accd219a08907de938571d0a 100644 (file)
@@ -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 "
index 9479f99c2145c623c9c740eda6ac8c3e21b93a67..b552d1f8508c73f47d129ad943e7b4e7f34a9301 100644 (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
         * 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)
index d0e955b558ad84ce2d6f98f6ccb490185bc36cc2..c5ee7cd60424097aea1607f6f17b4f070dd58e5b 100644 (file)
--- a/fs/open.c
+++ b/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;
 }
index 480ea059a6802785c78a291c14e7ca01abdcf548..10587413b20e464299829ec32bc32ced475a37ff 100644 (file)
@@ -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)
 {
index cf348ba9923858927d6f19a92b65985184285dc3..1acb2ff505e6fc98dfce01b519dcb81a28c0fb0a 100644 (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
                 * @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);
index 19eadc807056be87ee1e57a54b8b64ff52496eef..31f1f10eecd10888924ac778f9a925785b0f82d0 100644 (file)
@@ -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.
         *
index 070807ce3e41287bb781d0a3a6866cf388b09f92..0d798052bd8571198aae7f62f6c517862d121b13 100644 (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_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[];
 };
 
index b5ec1aa60ed552337493d63dda4f3fb0382b5e78..a0825f532f712aa377f2e081f50825dd0386b38e 100644 (file)
@@ -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 */
index 0975b0268545a5e16b4aaadb58963ae651dcb519..a5697119290ee25e32ed0967b42ca7ff1d581f1e 100644 (file)
@@ -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)
index dbe6efde77a0a908d3a5d239df892874c2bfb292..5fa191252c8f9700d5d4fdd2a5d545d87e1ec805 100644 (file)
@@ -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>