Merge branches 'misc.misc' and 'work.iov_iter' into for-linus
authorAl Viro <viro@zeniv.linux.org.uk>
Fri, 4 Jan 2019 19:02:59 +0000 (14:02 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 4 Jan 2019 19:02:59 +0000 (14:02 -0500)
fs/aio.c
fs/exportfs/expfs.c
fs/sysv/inode.c
lib/iov_iter.c
scripts/selinux/genheaders/genheaders.c

index 301e6314183b66756077fed9e37630cc5436ff40..97f9835929256bfd6027d6958e14fb3ec64d34da 100644 (file)
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1436,6 +1436,7 @@ static int aio_prep_rw(struct kiocb *req, struct iocb *iocb)
                ret = ioprio_check_cap(iocb->aio_reqprio);
                if (ret) {
                        pr_debug("aio ioprio check cap error: %d\n", ret);
+                       fput(req->ki_filp);
                        return ret;
                }
 
index 645158dc33f1fc86bfcca570361002c540068584..c69927bed4effd6002f2021ca66c1b641acebc85 100644 (file)
@@ -77,7 +77,7 @@ static bool dentry_connected(struct dentry *dentry)
                struct dentry *parent = dget_parent(dentry);
 
                dput(dentry);
-               if (IS_ROOT(dentry)) {
+               if (dentry == parent) {
                        dput(parent);
                        return false;
                }
@@ -147,6 +147,7 @@ static struct dentry *reconnect_one(struct vfsmount *mnt,
        tmp = lookup_one_len_unlocked(nbuf, parent, strlen(nbuf));
        if (IS_ERR(tmp)) {
                dprintk("%s: lookup failed: %d\n", __func__, PTR_ERR(tmp));
+               err = PTR_ERR(tmp);
                goto out_err;
        }
        if (tmp != dentry) {
index 499a20a5a0107f3ca8942485a7a5b3bc58737793..273736f41be386c9f466c5512bd395732fade3aa 100644 (file)
@@ -275,7 +275,7 @@ static int __sysv_write_inode(struct inode *inode, int wait)
                 }
         }
        brelse(bh);
-       return 0;
+       return err;
 }
 
 int sysv_write_inode(struct inode *inode, struct writeback_control *wbc)
index 7ebccb5c16377eb77176d0df689e1cfb7af7b36d..621984743268db52dd6b8a8e1401d00ebc942588 100644 (file)
@@ -560,6 +560,44 @@ static size_t copy_pipe_to_iter(const void *addr, size_t bytes,
        return bytes;
 }
 
+static __wsum csum_and_memcpy(void *to, const void *from, size_t len,
+                             __wsum sum, size_t off)
+{
+       __wsum next = csum_partial_copy_nocheck(from, to, len, 0);
+       return csum_block_add(sum, next, off);
+}
+
+static size_t csum_and_copy_to_pipe_iter(const void *addr, size_t bytes,
+                               __wsum *csum, struct iov_iter *i)
+{
+       struct pipe_inode_info *pipe = i->pipe;
+       size_t n, r;
+       size_t off = 0;
+       __wsum sum = *csum;
+       int idx;
+
+       if (!sanity(i))
+               return 0;
+
+       bytes = n = push_pipe(i, bytes, &idx, &r);
+       if (unlikely(!n))
+               return 0;
+       for ( ; n; idx = next_idx(idx, pipe), r = 0) {
+               size_t chunk = min_t(size_t, n, PAGE_SIZE - r);
+               char *p = kmap_atomic(pipe->bufs[idx].page);
+               sum = csum_and_memcpy(p + r, addr, chunk, sum, off);
+               kunmap_atomic(p);
+               i->idx = idx;
+               i->iov_offset = r + chunk;
+               n -= chunk;
+               off += chunk;
+               addr += chunk;
+       }
+       i->count -= bytes;
+       *csum = sum;
+       return bytes;
+}
+
 size_t _copy_to_iter(const void *addr, size_t bytes, struct iov_iter *i)
 {
        const char *from = addr;
@@ -1368,17 +1406,15 @@ size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum,
                err ? v.iov_len : 0;
        }), ({
                char *p = kmap_atomic(v.bv_page);
-               next = csum_partial_copy_nocheck(p + v.bv_offset,
-                                                (to += v.bv_len) - v.bv_len,
-                                                v.bv_len, 0);
+               sum = csum_and_memcpy((to += v.bv_len) - v.bv_len,
+                                     p + v.bv_offset, v.bv_len,
+                                     sum, off);
                kunmap_atomic(p);
-               sum = csum_block_add(sum, next, off);
                off += v.bv_len;
        }),({
-               next = csum_partial_copy_nocheck(v.iov_base,
-                                                (to += v.iov_len) - v.iov_len,
-                                                v.iov_len, 0);
-               sum = csum_block_add(sum, next, off);
+               sum = csum_and_memcpy((to += v.iov_len) - v.iov_len,
+                                     v.iov_base, v.iov_len,
+                                     sum, off);
                off += v.iov_len;
        })
        )
@@ -1412,17 +1448,15 @@ bool csum_and_copy_from_iter_full(void *addr, size_t bytes, __wsum *csum,
                0;
        }), ({
                char *p = kmap_atomic(v.bv_page);
-               next = csum_partial_copy_nocheck(p + v.bv_offset,
-                                                (to += v.bv_len) - v.bv_len,
-                                                v.bv_len, 0);
+               sum = csum_and_memcpy((to += v.bv_len) - v.bv_len,
+                                     p + v.bv_offset, v.bv_len,
+                                     sum, off);
                kunmap_atomic(p);
-               sum = csum_block_add(sum, next, off);
                off += v.bv_len;
        }),({
-               next = csum_partial_copy_nocheck(v.iov_base,
-                                                (to += v.iov_len) - v.iov_len,
-                                                v.iov_len, 0);
-               sum = csum_block_add(sum, next, off);
+               sum = csum_and_memcpy((to += v.iov_len) - v.iov_len,
+                                     v.iov_base, v.iov_len,
+                                     sum, off);
                off += v.iov_len;
        })
        )
@@ -1438,8 +1472,12 @@ size_t csum_and_copy_to_iter(const void *addr, size_t bytes, __wsum *csum,
        const char *from = addr;
        __wsum sum, next;
        size_t off = 0;
+
+       if (unlikely(iov_iter_is_pipe(i)))
+               return csum_and_copy_to_pipe_iter(addr, bytes, csum, i);
+
        sum = *csum;
-       if (unlikely(iov_iter_is_pipe(i) || iov_iter_is_discard(i))) {
+       if (unlikely(iov_iter_is_discard(i))) {
                WARN_ON(1);     /* for now */
                return 0;
        }
@@ -1455,17 +1493,15 @@ size_t csum_and_copy_to_iter(const void *addr, size_t bytes, __wsum *csum,
                err ? v.iov_len : 0;
        }), ({
                char *p = kmap_atomic(v.bv_page);
-               next = csum_partial_copy_nocheck((from += v.bv_len) - v.bv_len,
-                                                p + v.bv_offset,
-                                                v.bv_len, 0);
+               sum = csum_and_memcpy(p + v.bv_offset,
+                                     (from += v.bv_len) - v.bv_len,
+                                     v.bv_len, sum, off);
                kunmap_atomic(p);
-               sum = csum_block_add(sum, next, off);
                off += v.bv_len;
        }),({
-               next = csum_partial_copy_nocheck((from += v.iov_len) - v.iov_len,
-                                                v.iov_base,
-                                                v.iov_len, 0);
-               sum = csum_block_add(sum, next, off);
+               sum = csum_and_memcpy(v.iov_base,
+                                    (from += v.iov_len) - v.iov_len,
+                                    v.iov_len, sum, off);
                off += v.iov_len;
        })
        )
index fa48fabcb33047b380b1a8a601917ffdde623766..1ceedea847ddfec8ff856fb3a8a2110cd00343c3 100644 (file)
@@ -19,8 +19,6 @@ struct security_class_mapping {
 #include "classmap.h"
 #include "initial_sid_to_string.h"
 
-#define max(x, y) (((int)(x) > (int)(y)) ? x : y)
-
 const char *progname;
 
 static void usage(void)
@@ -46,11 +44,9 @@ static char *stoupperx(const char *s)
 
 int main(int argc, char *argv[])
 {
-       int i, j, k;
+       int i, j;
        int isids_len;
        FILE *fout;
-       const char *needle = "SOCKET";
-       char *substr;
 
        progname = argv[0];
 
@@ -80,20 +76,14 @@ int main(int argc, char *argv[])
 
        for (i = 0; secclass_map[i].name; i++) {
                struct security_class_mapping *map = &secclass_map[i];
-               fprintf(fout, "#define SECCLASS_%s", map->name);
-               for (j = 0; j < max(1, 40 - strlen(map->name)); j++)
-                       fprintf(fout, " ");
-               fprintf(fout, "%2d\n", i+1);
+               fprintf(fout, "#define SECCLASS_%-39s %2d\n", map->name, i+1);
        }
 
        fprintf(fout, "\n");
 
        for (i = 1; i < isids_len; i++) {
                const char *s = initial_sid_to_string[i];
-               fprintf(fout, "#define SECINITSID_%s", s);
-               for (j = 0; j < max(1, 40 - strlen(s)); j++)
-                       fprintf(fout, " ");
-               fprintf(fout, "%2d\n", i);
+               fprintf(fout, "#define SECINITSID_%-39s %2d\n", s, i);
        }
        fprintf(fout, "\n#define SECINITSID_NUM %d\n", i-1);
        fprintf(fout, "\nstatic inline bool security_is_socket_class(u16 kern_tclass)\n");
@@ -101,9 +91,10 @@ int main(int argc, char *argv[])
        fprintf(fout, "\tbool sock = false;\n\n");
        fprintf(fout, "\tswitch (kern_tclass) {\n");
        for (i = 0; secclass_map[i].name; i++) {
+               static char s[] = "SOCKET";
                struct security_class_mapping *map = &secclass_map[i];
-               substr = strstr(map->name, needle);
-               if (substr && strcmp(substr, needle) == 0)
+               int len = strlen(map->name), l = sizeof(s) - 1;
+               if (len >= l && memcmp(map->name + len - l, s, l) == 0)
                        fprintf(fout, "\tcase SECCLASS_%s:\n", map->name);
        }
        fprintf(fout, "\t\tsock = true;\n");
@@ -129,17 +120,15 @@ int main(int argc, char *argv[])
 
        for (i = 0; secclass_map[i].name; i++) {
                struct security_class_mapping *map = &secclass_map[i];
+               int len = strlen(map->name);
                for (j = 0; map->perms[j]; j++) {
                        if (j >= 32) {
                                fprintf(stderr, "Too many permissions to fit into an access vector at (%s, %s).\n",
                                        map->name, map->perms[j]);
                                exit(5);
                        }
-                       fprintf(fout, "#define %s__%s", map->name,
-                               map->perms[j]);
-                       for (k = 0; k < max(1, 40 - strlen(map->name) - strlen(map->perms[j])); k++)
-                               fprintf(fout, " ");
-                       fprintf(fout, "0x%08xU\n", (1<<j));
+                       fprintf(fout, "#define %s__%-*s 0x%08xU\n", map->name,
+                               39-len, map->perms[j], 1U<<j);
                }
        }