Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[cascardo/linux.git] / mm / shmem.c
index e7e8f8c..ad7813d 100644 (file)
@@ -960,7 +960,7 @@ static int shmem_setattr(struct dentry *dentry, struct iattr *attr)
        struct shmem_sb_info *sbinfo = SHMEM_SB(inode->i_sb);
        int error;
 
-       error = inode_change_ok(inode, attr);
+       error = setattr_prepare(dentry, attr);
        if (error)
                return error;
 
@@ -2311,119 +2311,6 @@ static ssize_t shmem_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
        return retval ? retval : error;
 }
 
-static ssize_t shmem_file_splice_read(struct file *in, loff_t *ppos,
-                               struct pipe_inode_info *pipe, size_t len,
-                               unsigned int flags)
-{
-       struct address_space *mapping = in->f_mapping;
-       struct inode *inode = mapping->host;
-       unsigned int loff, nr_pages, req_pages;
-       struct page *pages[PIPE_DEF_BUFFERS];
-       struct partial_page partial[PIPE_DEF_BUFFERS];
-       struct page *page;
-       pgoff_t index, end_index;
-       loff_t isize, left;
-       int error, page_nr;
-       struct splice_pipe_desc spd = {
-               .pages = pages,
-               .partial = partial,
-               .nr_pages_max = PIPE_DEF_BUFFERS,
-               .flags = flags,
-               .ops = &page_cache_pipe_buf_ops,
-               .spd_release = spd_release_page,
-       };
-
-       isize = i_size_read(inode);
-       if (unlikely(*ppos >= isize))
-               return 0;
-
-       left = isize - *ppos;
-       if (unlikely(left < len))
-               len = left;
-
-       if (splice_grow_spd(pipe, &spd))
-               return -ENOMEM;
-
-       index = *ppos >> PAGE_SHIFT;
-       loff = *ppos & ~PAGE_MASK;
-       req_pages = (len + loff + PAGE_SIZE - 1) >> PAGE_SHIFT;
-       nr_pages = min(req_pages, spd.nr_pages_max);
-
-       spd.nr_pages = find_get_pages_contig(mapping, index,
-                                               nr_pages, spd.pages);
-       index += spd.nr_pages;
-       error = 0;
-
-       while (spd.nr_pages < nr_pages) {
-               error = shmem_getpage(inode, index, &page, SGP_CACHE);
-               if (error)
-                       break;
-               unlock_page(page);
-               spd.pages[spd.nr_pages++] = page;
-               index++;
-       }
-
-       index = *ppos >> PAGE_SHIFT;
-       nr_pages = spd.nr_pages;
-       spd.nr_pages = 0;
-
-       for (page_nr = 0; page_nr < nr_pages; page_nr++) {
-               unsigned int this_len;
-
-               if (!len)
-                       break;
-
-               this_len = min_t(unsigned long, len, PAGE_SIZE - loff);
-               page = spd.pages[page_nr];
-
-               if (!PageUptodate(page) || page->mapping != mapping) {
-                       error = shmem_getpage(inode, index, &page, SGP_CACHE);
-                       if (error)
-                               break;
-                       unlock_page(page);
-                       put_page(spd.pages[page_nr]);
-                       spd.pages[page_nr] = page;
-               }
-
-               isize = i_size_read(inode);
-               end_index = (isize - 1) >> PAGE_SHIFT;
-               if (unlikely(!isize || index > end_index))
-                       break;
-
-               if (end_index == index) {
-                       unsigned int plen;
-
-                       plen = ((isize - 1) & ~PAGE_MASK) + 1;
-                       if (plen <= loff)
-                               break;
-
-                       this_len = min(this_len, plen - loff);
-                       len = this_len;
-               }
-
-               spd.partial[page_nr].offset = loff;
-               spd.partial[page_nr].len = this_len;
-               len -= this_len;
-               loff = 0;
-               spd.nr_pages++;
-               index++;
-       }
-
-       while (page_nr < nr_pages)
-               put_page(spd.pages[page_nr++]);
-
-       if (spd.nr_pages)
-               error = splice_to_pipe(pipe, &spd);
-
-       splice_shrink_spd(&spd);
-
-       if (error > 0) {
-               *ppos += error;
-               file_accessed(in);
-       }
-       return error;
-}
-
 /*
  * llseek SEEK_DATA or SEEK_HOLE through the radix_tree.
  */
@@ -3288,10 +3175,7 @@ static const struct inode_operations shmem_short_symlink_operations = {
        .readlink       = generic_readlink,
        .get_link       = simple_get_link,
 #ifdef CONFIG_TMPFS_XATTR
-       .setxattr       = generic_setxattr,
-       .getxattr       = generic_getxattr,
        .listxattr      = shmem_listxattr,
-       .removexattr    = generic_removexattr,
 #endif
 };
 
@@ -3299,10 +3183,7 @@ static const struct inode_operations shmem_symlink_inode_operations = {
        .readlink       = generic_readlink,
        .get_link       = shmem_get_link,
 #ifdef CONFIG_TMPFS_XATTR
-       .setxattr       = generic_setxattr,
-       .getxattr       = generic_getxattr,
        .listxattr      = shmem_listxattr,
-       .removexattr    = generic_removexattr,
 #endif
 };
 
@@ -3786,7 +3667,7 @@ static const struct file_operations shmem_file_operations = {
        .read_iter      = shmem_file_read_iter,
        .write_iter     = generic_file_write_iter,
        .fsync          = noop_fsync,
-       .splice_read    = shmem_file_splice_read,
+       .splice_read    = generic_file_splice_read,
        .splice_write   = iter_file_splice_write,
        .fallocate      = shmem_fallocate,
 #endif
@@ -3796,10 +3677,7 @@ static const struct inode_operations shmem_inode_operations = {
        .getattr        = shmem_getattr,
        .setattr        = shmem_setattr,
 #ifdef CONFIG_TMPFS_XATTR
-       .setxattr       = generic_setxattr,
-       .getxattr       = generic_getxattr,
        .listxattr      = shmem_listxattr,
-       .removexattr    = generic_removexattr,
        .set_acl        = simple_set_acl,
 #endif
 };
@@ -3818,10 +3696,7 @@ static const struct inode_operations shmem_dir_inode_operations = {
        .tmpfile        = shmem_tmpfile,
 #endif
 #ifdef CONFIG_TMPFS_XATTR
-       .setxattr       = generic_setxattr,
-       .getxattr       = generic_getxattr,
        .listxattr      = shmem_listxattr,
-       .removexattr    = generic_removexattr,
 #endif
 #ifdef CONFIG_TMPFS_POSIX_ACL
        .setattr        = shmem_setattr,
@@ -3831,10 +3706,7 @@ static const struct inode_operations shmem_dir_inode_operations = {
 
 static const struct inode_operations shmem_special_inode_operations = {
 #ifdef CONFIG_TMPFS_XATTR
-       .setxattr       = generic_setxattr,
-       .getxattr       = generic_getxattr,
        .listxattr      = shmem_listxattr,
-       .removexattr    = generic_removexattr,
 #endif
 #ifdef CONFIG_TMPFS_POSIX_ACL
        .setattr        = shmem_setattr,
@@ -4078,7 +3950,7 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range);
 
 /* common code */
 
-static struct dentry_operations anon_ops = {
+static const struct dentry_operations anon_ops = {
        .d_dname = simple_dname
 };