]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Merge branches 'work.iov_iter', 'work.copy_file_range', 'work.xattr' and 'work.symlin...
authorAl Viro <viro@zeniv.linux.org.uk>
Sat, 9 Jan 2016 08:33:17 +0000 (03:33 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 9 Jan 2016 08:33:17 +0000 (03:33 -0500)
Conflicts:
drivers/staging/lustre/lustre/llite/symlink.c

25 files changed:
1  2  3  4  5 
drivers/staging/lustre/lustre/llite/symlink.c
fs/9p/vfs_inode.c
fs/btrfs/file.c
fs/btrfs/inode.c
fs/cifs/cifsfs.c
fs/cifs/cifsfs.h
fs/compat_ioctl.c
fs/dcache.c
fs/ecryptfs/inode.c
fs/exofs/inode.c
fs/ext2/xattr.c
fs/ext4/symlink.c
fs/ext4/xattr.c
fs/ioctl.c
fs/logfs/logfs.h
fs/namei.c
fs/nfs/inode.c
fs/nfsd/nfs4xdr.c
fs/nfsd/vfs.c
fs/ocfs2/namei.c
fs/proc/base.c
fs/read_write.c
fs/xattr.c
include/linux/fs.h
mm/shmem.c

index 32c4cf48b318398cbd58fa32c48e309877a8661f,69b203651905e93f77149754a5b9d6a021b6bf32,69b203651905e93f77149754a5b9d6a021b6bf32,69b203651905e93f77149754a5b9d6a021b6bf32,e489a3271f0697fe8a9f35708434412072a3f2a1..2610348f6c7268eb3cc7195137c57a82206f65ee
@@@@@@ -141,16 -141,16 -141,16 -141,16 -149,10 +149,10 @@@@@@ static const char *ll_get_link(struct d
        return symname;
     }
     
---- static void ll_put_link(struct inode *unused, void *cookie)
---- {
----    ptlrpc_req_finished(cookie);
---- }
---- 
 ----struct inode_operations ll_fast_symlink_inode_operations = {
 ++++const struct inode_operations ll_fast_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .setattr        = ll_setattr,
----    .follow_link    = ll_follow_link,
----    .put_link       = ll_put_link,
++++    .get_link       = ll_get_link,
        .getattr        = ll_getattr,
        .permission     = ll_inode_permission,
        .setxattr       = ll_setxattr,
Simple merge
diff --cc fs/btrfs/file.c
Simple merge
Simple merge
Simple merge
Simple merge
index c9fca9c33ff112c89110e758c5a7aba1cf408698,dcf26537c935f25ed10a534a13e31492802c5369,eab31e74b9cc5e54e84db3f72aa4f384e024dd74,dcf26537c935f25ed10a534a13e31492802c5369,dcf26537c935f25ed10a534a13e31492802c5369..a5b8eb69a8f42526d4fb4d46d1cc26d33e78e6b2
     #include <asm/fbio.h>
     #endif
     
 ----static int w_long(unsigned int fd, unsigned int cmd,
 ----           compat_ulong_t __user *argp)
 ++++#define convert_in_user(srcptr, dstptr)                    \
 ++++({                                                 \
 ++++   typeof(*srcptr) val;                            \
 ++++                                                   \
 ++++   get_user(val, srcptr) || put_user(val, dstptr); \
 ++++})
 ++++
 ++++static int do_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
  +  {
 - --   mm_segment_t old_fs = get_fs();
  +     int err;
 - --   unsigned long val;
  +  
 - --   set_fs (KERNEL_DS);
 - --   err = sys_ioctl(fd, cmd, (unsigned long)&val);
 - --   set_fs (old_fs);
 - --   if (!err && put_user(val, argp))
 ++++   err = security_file_ioctl(file, cmd, arg);
 ++++   if (err)
 ++++           return err;
 ++++
 ++++   return vfs_ioctl(file, cmd, arg);
 ++++}
 ++++
 ++++static int w_long(struct file *file,
 ++++           unsigned int cmd, compat_ulong_t __user *argp)
 + ++{
  -     mm_segment_t old_fs = get_fs();
 + ++   int err;
  -     unsigned long val;
 ++++   unsigned long __user *valp = compat_alloc_user_space(sizeof(*valp));
 + ++
  -     set_fs (KERNEL_DS);
  -     err = sys_ioctl(fd, cmd, (unsigned long)&val);
  -     set_fs (old_fs);
  -     if (!err && put_user(val, argp))
 ++++   if (valp == NULL)
                return -EFAULT;
 ----   return err;
 ++++   err = do_ioctl(file, cmd, (unsigned long)valp);
 ++++   if (err)
 ++++           return err;
 ++++   if (convert_in_user(valp, argp))
 ++++           return -EFAULT;
 ++++   return 0;
     }
     
     struct compat_video_event {
@@@@@@ -634,36 -610,37 -610,37 -610,37 -610,37 +634,36 @@@@@@ static int serial_struct_ioctl(struct f
     {
             typedef struct serial_struct32 SS32;
             int err;
 ----        struct serial_struct ss;
 ----        mm_segment_t oldseg = get_fs();
 ++++   struct serial_struct __user *ss = compat_alloc_user_space(sizeof(*ss));
             __u32 udata;
        unsigned int base;
 ++++   unsigned char *iomem_base;
     
 ++++   if (ss == NULL)
 ++++           return -EFAULT;
             if (cmd == TIOCSSERIAL) {
 ----                if (!access_ok(VERIFY_READ, ss32, sizeof(SS32)))
 ----                        return -EFAULT;
 ----                if (__copy_from_user(&ss, ss32, offsetof(SS32, iomem_base)))
 - --                   return -EFAULT;
 - --                if (__get_user(udata, &ss32->iomem_base))
 ++++           if (copy_in_user(ss, ss32, offsetof(SS32, iomem_base)) ||
 ++++               get_user(udata, &ss32->iomem_base))
                        return -EFAULT;
 - --                ss.iomem_base = compat_ptr(udata);
 - --                if (__get_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift) ||
 - --               __get_user(ss.port_high, &ss32->port_high))
  -                  if (__get_user(udata, &ss32->iomem_base))
 ++++           iomem_base = compat_ptr(udata);
 ++++           if (put_user(iomem_base, &ss->iomem_base) ||
 ++++               convert_in_user(&ss32->iomem_reg_shift,
 ++++                 &ss->iomem_reg_shift) ||
 ++++               convert_in_user(&ss32->port_high, &ss->port_high) ||
 ++++               put_user(0UL, &ss->iomap_base))
                        return -EFAULT;
  -                  ss.iomem_base = compat_ptr(udata);
  -                  if (__get_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift) ||
  -                 __get_user(ss.port_high, &ss32->port_high))
  -                     return -EFAULT;
 ----                ss.iomap_base = 0UL;
             }
 ----        set_fs(KERNEL_DS);
 ----                err = sys_ioctl(fd,cmd,(unsigned long)(&ss));
 ----        set_fs(oldseg);
 ++++   err = do_ioctl(file, cmd, (unsigned long)ss);
             if (cmd == TIOCGSERIAL && err >= 0) {
 ----                if (!access_ok(VERIFY_WRITE, ss32, sizeof(SS32)))
 ----                        return -EFAULT;
 ----                if (__copy_to_user(ss32,&ss,offsetof(SS32,iomem_base)))
 ++++           if (copy_in_user(ss32, ss, offsetof(SS32, iomem_base)) ||
 ++++               get_user(iomem_base, &ss->iomem_base))
                        return -EFAULT;
 ----           base = (unsigned long)ss.iomem_base  >> 32 ?
 ----                   0xffffffff : (unsigned)(unsigned long)ss.iomem_base;
 ----           if (__put_user(base, &ss32->iomem_base) ||
 ----               __put_user(ss.iomem_reg_shift, &ss32->iomem_reg_shift) ||
 ----               __put_user(ss.port_high, &ss32->port_high))
 ++++           base = (unsigned long)iomem_base  >> 32 ?
 ++++                   0xffffffff : (unsigned)(unsigned long)iomem_base;
 ++++           if (put_user(base, &ss32->iomem_base) ||
 ++++               convert_in_user(&ss->iomem_reg_shift,
 ++++                 &ss32->iomem_reg_shift) ||
 ++++               convert_in_user(&ss->port_high, &ss32->port_high))
                        return -EFAULT;
             }
             return err;
diff --cc fs/dcache.c
Simple merge
Simple merge
Simple merge
diff --cc fs/ext2/xattr.c
Simple merge
Simple merge
diff --cc fs/ext4/xattr.c
Simple merge
diff --cc fs/ioctl.c
Simple merge
Simple merge
diff --cc fs/namei.c
index 1067f7a0287ab105a30fbbcb353af74b4d8f9eb2,0c3974cd3ecd55670ccab51c596b0b141cbdd721,d84d7c7515fc44415f11488f192e52ef3c9c9990,0c3974cd3ecd55670ccab51c596b0b141cbdd721,3c909aebef70f8a8a091960bd3ba434a15e2f829..bceefd5588a2bf908626a0a6282a5f810ecfc5c1
@@@@@@ -839,28 -841,8 -841,8 -841,8 -838,8 +836,28 @@@@@@ static inline void path_to_nameidata(co
        nd->path.dentry = path->dentry;
     }
     
 ++++static int nd_jump_root(struct nameidata *nd)
 ++++{
 ++++   if (nd->flags & LOOKUP_RCU) {
 ++++           struct dentry *d;
 ++++           nd->path = nd->root;
 ++++           d = nd->path.dentry;
 ++++           nd->inode = d->d_inode;
 ++++           nd->seq = nd->root_seq;
 ++++           if (unlikely(read_seqcount_retry(&d->d_seq, nd->seq)))
 ++++                   return -ECHILD;
 ++++   } else {
 ++++           path_put(&nd->path);
 ++++           nd->path = nd->root;
 ++++           path_get(&nd->path);
 ++++           nd->inode = nd->path.dentry->d_inode;
 ++++   }
 ++++   nd->flags |= LOOKUP_JUMPED;
 ++++   return 0;
 ++++}
 ++++
     /*
----  * Helper to directly jump to a known parsed path from ->follow_link,
++++  * Helper to directly jump to a known parsed path from ->get_link,
      * caller must have taken a reference to path beforehand.
      */
     void nd_jump_link(struct path *path)
@@@@@@ -1022,21 -1004,36 -1004,36 -1004,36 -999,42 +1017,27 @@@@@@ const char *get_link(struct nameidata *
        nd->last_type = LAST_BIND;
        res = inode->i_link;
        if (!res) {
++++            const char * (*get)(struct dentry *, struct inode *,
++++                            struct delayed_call *);
++++            get = inode->i_op->get_link;
                if (nd->flags & LOOKUP_RCU) {
----                    if (unlikely(unlazy_walk(nd, NULL, 0)))
----                            return ERR_PTR(-ECHILD);
++++                    res = get(NULL, inode, &last->done);
++++                    if (res == ERR_PTR(-ECHILD)) {
++++                            if (unlikely(unlazy_walk(nd, NULL, 0)))
++++                                    return ERR_PTR(-ECHILD);
++++                            res = get(dentry, inode, &last->done);
++++                    }
++++            } else {
++++                    res = get(dentry, inode, &last->done);
                }
----            res = inode->i_op->follow_link(dentry, &last->cookie);
----            if (IS_ERR_OR_NULL(res)) {
----                    last->cookie = NULL;
++++            if (IS_ERR_OR_NULL(res))
                        return res;
----            }
        }
        if (*res == '/') {
 ----           if (nd->flags & LOOKUP_RCU) {
 ----                   struct dentry *d;
 ----                   if (!nd->root.mnt)
 ----                           set_root_rcu(nd);
 ----                   nd->path = nd->root;
 ----                   d = nd->path.dentry;
 ----                   nd->inode = d->d_inode;
 ----                   nd->seq = nd->root_seq;
 ----                   if (unlikely(read_seqcount_retry(&d->d_seq, nd->seq)))
 ----                           return ERR_PTR(-ECHILD);
 ----           } else {
 ----                   if (!nd->root.mnt)
 ----                           set_root(nd);
 ----                   path_put(&nd->path);
 ----                   nd->path = nd->root;
 ----                   path_get(&nd->root);
 ----                   nd->inode = nd->path.dentry->d_inode;
 ----           }
 ----           nd->flags |= LOOKUP_JUMPED;
 ++++           if (!nd->root.mnt)
 ++++                   set_root(nd);
 ++++           if (unlikely(nd_jump_root(nd)))
 ++++                   return ERR_PTR(-ECHILD);
                while (unlikely(*++res == '/'))
                        ;
        }
diff --cc fs/nfs/inode.c
Simple merge
Simple merge
diff --cc fs/nfsd/vfs.c
Simple merge
Simple merge
diff --cc fs/proc/base.c
Simple merge
diff --cc fs/read_write.c
Simple merge
diff --cc fs/xattr.c
Simple merge
Simple merge
diff --cc mm/shmem.c
index 2afcdbbdb68506096d5c6fad584a8425709d10aa,9187eee4128b45769583dae2a73720e3545ee933,9187eee4128b45769583dae2a73720e3545ee933,297390f4e50ffee8068a3adc585925ea4ef08d63,bab9041b19673389b1c0d21346434f24a349a735..5813b7fa85b64667c7ea7f9c73da84e073b6d325
@@@@@@ -2653,24 -2659,24 -2659,24 -2612,24 -2668,23 +2615,23 @@@@@@ static ssize_t shmem_listxattr(struct d
     
     static const struct inode_operations shmem_short_symlink_operations = {
        .readlink       = generic_readlink,
----    .follow_link    = simple_follow_link,
++++    .get_link       = simple_get_link,
     #ifdef CONFIG_TMPFS_XATTR
--- -   .setxattr       = shmem_setxattr,
--- -   .getxattr       = shmem_getxattr,
+++ +   .setxattr       = generic_setxattr,
+++ +   .getxattr       = generic_getxattr,
        .listxattr      = shmem_listxattr,
--- -   .removexattr    = shmem_removexattr,
+++ +   .removexattr    = generic_removexattr,
     #endif
     };
     
     static const struct inode_operations shmem_symlink_inode_operations = {
        .readlink       = generic_readlink,
----    .follow_link    = shmem_follow_link,
----    .put_link       = shmem_put_link,
++++    .get_link       = shmem_get_link,
     #ifdef CONFIG_TMPFS_XATTR
--- -   .setxattr       = shmem_setxattr,
--- -   .getxattr       = shmem_getxattr,
+++ +   .setxattr       = generic_setxattr,
+++ +   .getxattr       = generic_getxattr,
        .listxattr      = shmem_listxattr,
--- -   .removexattr    = shmem_removexattr,
+++ +   .removexattr    = generic_removexattr,
     #endif
     };