aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds2017-05-09 11:12:53 -0500
committerLinus Torvalds2017-05-09 11:12:53 -0500
commit11fbf53d66ec302fe50b06bd7cb4863dbb98775a (patch)
tree1e7f8fdb574313b9c1403d2f89386a461c9b2eaa
parent339fbf6796f8e74544091adbf511286768eaf93e (diff)
parent6b4657667ba06cd2e07206c65e630acdf248bfd1 (diff)
downloadkernel-11fbf53d66ec302fe50b06bd7cb4863dbb98775a.tar.gz
kernel-11fbf53d66ec302fe50b06bd7cb4863dbb98775a.tar.xz
kernel-11fbf53d66ec302fe50b06bd7cb4863dbb98775a.zip
Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc vfs updates from Al Viro: "Assorted bits and pieces from various people. No common topic in this pile, sorry" * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: fs/affs: add rename exchange fs/affs: add rename2 to prepare multiple methods Make stat/lstat/fstatat pass AT_NO_AUTOMOUNT to vfs_statx() fs: don't set *REFERENCED on single use objects fs: compat: Remove warning from COMPATIBLE_IOCTL remove pointless extern of atime_need_update_rcu() fs: completely ignore unknown open flags fs: add a VALID_OPEN_FLAGS fs: remove _submit_bh() fs: constify tree_descr arrays passed to simple_fill_super() fs: drop duplicate header percpu-rwsem.h fs/affs: bugfix: Write files greater than page size on OFS fs/affs: bugfix: enable writes on OFS disks fs/affs: remove node generation check fs/affs: import amigaffs.h fs/affs: bugfix: make symbolic links work again
-rw-r--r--drivers/infiniband/hw/qib/qib_fs.c2
-rw-r--r--drivers/xen/xenfs/super.c4
-rw-r--r--fs/affs/affs.h4
-rw-r--r--fs/affs/amigaffs.h (renamed from include/linux/amigaffs.h)0
-rw-r--r--fs/affs/dir.c2
-rw-r--r--fs/affs/file.c10
-rw-r--r--fs/affs/inode.c1
-rw-r--r--fs/affs/namei.c87
-rw-r--r--fs/binfmt_misc.c2
-rw-r--r--fs/buffer.c19
-rw-r--r--fs/compat_ioctl.c2
-rw-r--r--fs/dcache.c4
-rw-r--r--fs/debugfs/inode.c2
-rw-r--r--fs/fcntl.c14
-rw-r--r--fs/fuse/control.c2
-rw-r--r--fs/inode.c3
-rw-r--r--fs/internal.h2
-rw-r--r--fs/libfs.c2
-rw-r--r--fs/nfsd/nfsctl.c2
-rw-r--r--fs/open.c6
-rw-r--r--fs/tracefs/inode.c2
-rw-r--r--include/linux/buffer_head.h2
-rw-r--r--include/linux/fcntl.h6
-rw-r--r--include/linux/fs.h14
-rw-r--r--kernel/bpf/inode.c2
-rw-r--r--security/inode.c2
-rw-r--r--security/selinux/selinuxfs.c4
-rw-r--r--security/smack/smackfs.c2
28 files changed, 130 insertions, 74 deletions
diff --git a/drivers/infiniband/hw/qib/qib_fs.c b/drivers/infiniband/hw/qib/qib_fs.c
index f1e66efea98a..1d940a2885c9 100644
--- a/drivers/infiniband/hw/qib/qib_fs.c
+++ b/drivers/infiniband/hw/qib/qib_fs.c
@@ -512,7 +512,7 @@ static int qibfs_fill_super(struct super_block *sb, void *data, int silent)
512 unsigned long flags; 512 unsigned long flags;
513 int ret; 513 int ret;
514 514
515 static struct tree_descr files[] = { 515 static const struct tree_descr files[] = {
516 [2] = {"driver_stats", &driver_ops[0], S_IRUGO}, 516 [2] = {"driver_stats", &driver_ops[0], S_IRUGO},
517 [3] = {"driver_stats_names", &driver_ops[1], S_IRUGO}, 517 [3] = {"driver_stats_names", &driver_ops[1], S_IRUGO},
518 {""}, 518 {""},
diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c
index 328c3987b112..967f069385d0 100644
--- a/drivers/xen/xenfs/super.c
+++ b/drivers/xen/xenfs/super.c
@@ -44,14 +44,14 @@ static const struct file_operations capabilities_file_ops = {
44 44
45static int xenfs_fill_super(struct super_block *sb, void *data, int silent) 45static int xenfs_fill_super(struct super_block *sb, void *data, int silent)
46{ 46{
47 static struct tree_descr xenfs_files[] = { 47 static const struct tree_descr xenfs_files[] = {
48 [2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR }, 48 [2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR },
49 { "capabilities", &capabilities_file_ops, S_IRUGO }, 49 { "capabilities", &capabilities_file_ops, S_IRUGO },
50 { "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR }, 50 { "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },
51 {""}, 51 {""},
52 }; 52 };
53 53
54 static struct tree_descr xenfs_init_files[] = { 54 static const struct tree_descr xenfs_init_files[] = {
55 [2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR }, 55 [2] = { "xenbus", &xen_xenbus_fops, S_IRUSR|S_IWUSR },
56 { "capabilities", &capabilities_file_ops, S_IRUGO }, 56 { "capabilities", &capabilities_file_ops, S_IRUGO },
57 { "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR }, 57 { "privcmd", &xen_privcmd_fops, S_IRUSR|S_IWUSR },
diff --git a/fs/affs/affs.h b/fs/affs/affs.h
index 2f8bab390d13..773749be8290 100644
--- a/fs/affs/affs.h
+++ b/fs/affs/affs.h
@@ -7,7 +7,7 @@
7#include <linux/types.h> 7#include <linux/types.h>
8#include <linux/fs.h> 8#include <linux/fs.h>
9#include <linux/buffer_head.h> 9#include <linux/buffer_head.h>
10#include <linux/amigaffs.h> 10#include "amigaffs.h"
11#include <linux/mutex.h> 11#include <linux/mutex.h>
12#include <linux/workqueue.h> 12#include <linux/workqueue.h>
13 13
@@ -173,7 +173,7 @@ extern int affs_link(struct dentry *olddentry, struct inode *dir,
173 struct dentry *dentry); 173 struct dentry *dentry);
174extern int affs_symlink(struct inode *dir, struct dentry *dentry, 174extern int affs_symlink(struct inode *dir, struct dentry *dentry,
175 const char *symname); 175 const char *symname);
176extern int affs_rename(struct inode *old_dir, struct dentry *old_dentry, 176extern int affs_rename2(struct inode *old_dir, struct dentry *old_dentry,
177 struct inode *new_dir, struct dentry *new_dentry, 177 struct inode *new_dir, struct dentry *new_dentry,
178 unsigned int flags); 178 unsigned int flags);
179 179
diff --git a/include/linux/amigaffs.h b/fs/affs/amigaffs.h
index 43b41c06aa37..43b41c06aa37 100644
--- a/include/linux/amigaffs.h
+++ b/fs/affs/amigaffs.h
diff --git a/fs/affs/dir.c b/fs/affs/dir.c
index f1e7294381c5..591ecd7f3063 100644
--- a/fs/affs/dir.c
+++ b/fs/affs/dir.c
@@ -35,7 +35,7 @@ const struct inode_operations affs_dir_inode_operations = {
35 .symlink = affs_symlink, 35 .symlink = affs_symlink,
36 .mkdir = affs_mkdir, 36 .mkdir = affs_mkdir,
37 .rmdir = affs_rmdir, 37 .rmdir = affs_rmdir,
38 .rename = affs_rename, 38 .rename = affs_rename2,
39 .setattr = affs_notify_change, 39 .setattr = affs_notify_change,
40}; 40};
41 41
diff --git a/fs/affs/file.c b/fs/affs/file.c
index 0deec9cc2362..196ee7f6fdc4 100644
--- a/fs/affs/file.c
+++ b/fs/affs/file.c
@@ -499,7 +499,7 @@ affs_getemptyblk_ino(struct inode *inode, int block)
499} 499}
500 500
501static int 501static int
502affs_do_readpage_ofs(struct page *page, unsigned to) 502affs_do_readpage_ofs(struct page *page, unsigned to, int create)
503{ 503{
504 struct inode *inode = page->mapping->host; 504 struct inode *inode = page->mapping->host;
505 struct super_block *sb = inode->i_sb; 505 struct super_block *sb = inode->i_sb;
@@ -518,7 +518,7 @@ affs_do_readpage_ofs(struct page *page, unsigned to)
518 boff = tmp % bsize; 518 boff = tmp % bsize;
519 519
520 while (pos < to) { 520 while (pos < to) {
521 bh = affs_bread_ino(inode, bidx, 0); 521 bh = affs_bread_ino(inode, bidx, create);
522 if (IS_ERR(bh)) 522 if (IS_ERR(bh))
523 return PTR_ERR(bh); 523 return PTR_ERR(bh);
524 tmp = min(bsize - boff, to - pos); 524 tmp = min(bsize - boff, to - pos);
@@ -620,7 +620,7 @@ affs_readpage_ofs(struct file *file, struct page *page)
620 memset(page_address(page) + to, 0, PAGE_SIZE - to); 620 memset(page_address(page) + to, 0, PAGE_SIZE - to);
621 } 621 }
622 622
623 err = affs_do_readpage_ofs(page, to); 623 err = affs_do_readpage_ofs(page, to, 0);
624 if (!err) 624 if (!err)
625 SetPageUptodate(page); 625 SetPageUptodate(page);
626 unlock_page(page); 626 unlock_page(page);
@@ -657,7 +657,7 @@ static int affs_write_begin_ofs(struct file *file, struct address_space *mapping
657 return 0; 657 return 0;
658 658
659 /* XXX: inefficient but safe in the face of short writes */ 659 /* XXX: inefficient but safe in the face of short writes */
660 err = affs_do_readpage_ofs(page, PAGE_SIZE); 660 err = affs_do_readpage_ofs(page, PAGE_SIZE, 1);
661 if (err) { 661 if (err) {
662 unlock_page(page); 662 unlock_page(page);
663 put_page(page); 663 put_page(page);
@@ -679,7 +679,7 @@ static int affs_write_end_ofs(struct file *file, struct address_space *mapping,
679 int written; 679 int written;
680 680
681 from = pos & (PAGE_SIZE - 1); 681 from = pos & (PAGE_SIZE - 1);
682 to = pos + len; 682 to = from + len;
683 /* 683 /*
684 * XXX: not sure if this can handle short copies (len < copied), but 684 * XXX: not sure if this can handle short copies (len < copied), but
685 * we don't have to, because the page should always be uptodate here, 685 * we don't have to, because the page should always be uptodate here,
diff --git a/fs/affs/inode.c b/fs/affs/inode.c
index abcc59899229..fd4ef3c40e40 100644
--- a/fs/affs/inode.c
+++ b/fs/affs/inode.c
@@ -140,6 +140,7 @@ struct inode *affs_iget(struct super_block *sb, unsigned long ino)
140 inode->i_fop = &affs_file_operations; 140 inode->i_fop = &affs_file_operations;
141 break; 141 break;
142 case ST_SOFTLINK: 142 case ST_SOFTLINK:
143 inode->i_size = strlen((char *)AFFS_HEAD(bh)->table);
143 inode->i_mode |= S_IFLNK; 144 inode->i_mode |= S_IFLNK;
144 inode_nohighmem(inode); 145 inode_nohighmem(inode);
145 inode->i_op = &affs_symlink_inode_operations; 146 inode->i_op = &affs_symlink_inode_operations;
diff --git a/fs/affs/namei.c b/fs/affs/namei.c
index 96dd1d09a273..46d3ace6761d 100644
--- a/fs/affs/namei.c
+++ b/fs/affs/namei.c
@@ -365,6 +365,7 @@ affs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
365 symname++; 365 symname++;
366 } 366 }
367 *p = 0; 367 *p = 0;
368 inode->i_size = i + 1;
368 mark_buffer_dirty_inode(bh, inode); 369 mark_buffer_dirty_inode(bh, inode);
369 affs_brelse(bh); 370 affs_brelse(bh);
370 mark_inode_dirty(inode); 371 mark_inode_dirty(inode);
@@ -393,21 +394,14 @@ affs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
393 return affs_add_entry(dir, inode, dentry, ST_LINKFILE); 394 return affs_add_entry(dir, inode, dentry, ST_LINKFILE);
394} 395}
395 396
396int 397static int
397affs_rename(struct inode *old_dir, struct dentry *old_dentry, 398affs_rename(struct inode *old_dir, struct dentry *old_dentry,
398 struct inode *new_dir, struct dentry *new_dentry, 399 struct inode *new_dir, struct dentry *new_dentry)
399 unsigned int flags)
400{ 400{
401 struct super_block *sb = old_dir->i_sb; 401 struct super_block *sb = old_dir->i_sb;
402 struct buffer_head *bh = NULL; 402 struct buffer_head *bh = NULL;
403 int retval; 403 int retval;
404 404
405 if (flags & ~RENAME_NOREPLACE)
406 return -EINVAL;
407
408 pr_debug("%s(old=%lu,\"%pd\" to new=%lu,\"%pd\")\n", __func__,
409 old_dir->i_ino, old_dentry, new_dir->i_ino, new_dentry);
410
411 retval = affs_check_name(new_dentry->d_name.name, 405 retval = affs_check_name(new_dentry->d_name.name,
412 new_dentry->d_name.len, 406 new_dentry->d_name.len,
413 affs_nofilenametruncate(old_dentry)); 407 affs_nofilenametruncate(old_dentry));
@@ -447,6 +441,76 @@ done:
447 return retval; 441 return retval;
448} 442}
449 443
444static int
445affs_xrename(struct inode *old_dir, struct dentry *old_dentry,
446 struct inode *new_dir, struct dentry *new_dentry)
447{
448
449 struct super_block *sb = old_dir->i_sb;
450 struct buffer_head *bh_old = NULL;
451 struct buffer_head *bh_new = NULL;
452 int retval;
453
454 bh_old = affs_bread(sb, d_inode(old_dentry)->i_ino);
455 if (!bh_old)
456 return -EIO;
457
458 bh_new = affs_bread(sb, d_inode(new_dentry)->i_ino);
459 if (!bh_new)
460 return -EIO;
461
462 /* Remove old header from its parent directory. */
463 affs_lock_dir(old_dir);
464 retval = affs_remove_hash(old_dir, bh_old);
465 affs_unlock_dir(old_dir);
466 if (retval)
467 goto done;
468
469 /* Remove new header from its parent directory. */
470 affs_lock_dir(new_dir);
471 retval = affs_remove_hash(new_dir, bh_new);
472 affs_unlock_dir(new_dir);
473 if (retval)
474 goto done;
475
476 /* Insert old into the new directory with the new name. */
477 affs_copy_name(AFFS_TAIL(sb, bh_old)->name, new_dentry);
478 affs_fix_checksum(sb, bh_old);
479 affs_lock_dir(new_dir);
480 retval = affs_insert_hash(new_dir, bh_old);
481 affs_unlock_dir(new_dir);
482
483 /* Insert new into the old directory with the old name. */
484 affs_copy_name(AFFS_TAIL(sb, bh_new)->name, old_dentry);
485 affs_fix_checksum(sb, bh_new);
486 affs_lock_dir(old_dir);
487 retval = affs_insert_hash(old_dir, bh_new);
488 affs_unlock_dir(old_dir);
489done:
490 mark_buffer_dirty_inode(bh_old, new_dir);
491 mark_buffer_dirty_inode(bh_new, old_dir);
492 affs_brelse(bh_old);
493 affs_brelse(bh_new);
494 return retval;
495}
496
497int affs_rename2(struct inode *old_dir, struct dentry *old_dentry,
498 struct inode *new_dir, struct dentry *new_dentry,
499 unsigned int flags)
500{
501
502 if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE))
503 return -EINVAL;
504
505 pr_debug("%s(old=%lu,\"%pd\" to new=%lu,\"%pd\")\n", __func__,
506 old_dir->i_ino, old_dentry, new_dir->i_ino, new_dentry);
507
508 if (flags & RENAME_EXCHANGE)
509 return affs_xrename(old_dir, old_dentry, new_dir, new_dentry);
510
511 return affs_rename(old_dir, old_dentry, new_dir, new_dentry);
512}
513
450static struct dentry *affs_get_parent(struct dentry *child) 514static struct dentry *affs_get_parent(struct dentry *child)
451{ 515{
452 struct inode *parent; 516 struct inode *parent;
@@ -477,11 +541,6 @@ static struct inode *affs_nfs_get_inode(struct super_block *sb, u64 ino,
477 if (IS_ERR(inode)) 541 if (IS_ERR(inode))
478 return ERR_CAST(inode); 542 return ERR_CAST(inode);
479 543
480 if (generation && inode->i_generation != generation) {
481 iput(inode);
482 return ERR_PTR(-ESTALE);
483 }
484
485 return inode; 544 return inode;
486} 545}
487 546
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
index bee1a36bc2ec..f4718098ac31 100644
--- a/fs/binfmt_misc.c
+++ b/fs/binfmt_misc.c
@@ -818,7 +818,7 @@ static const struct super_operations s_ops = {
818static int bm_fill_super(struct super_block *sb, void *data, int silent) 818static int bm_fill_super(struct super_block *sb, void *data, int silent)
819{ 819{
820 int err; 820 int err;
821 static struct tree_descr bm_files[] = { 821 static const struct tree_descr bm_files[] = {
822 [2] = {"status", &bm_status_operations, S_IWUSR|S_IRUGO}, 822 [2] = {"status", &bm_status_operations, S_IWUSR|S_IRUGO},
823 [3] = {"register", &bm_register_operations, S_IWUSR}, 823 [3] = {"register", &bm_register_operations, S_IWUSR},
824 /* last one */ {""} 824 /* last one */ {""}
diff --git a/fs/buffer.c b/fs/buffer.c
index c3c7455efa3f..161be58c5cb0 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -49,7 +49,6 @@
49 49
50static int fsync_buffers_list(spinlock_t *lock, struct list_head *list); 50static int fsync_buffers_list(spinlock_t *lock, struct list_head *list);
51static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, 51static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
52 unsigned long bio_flags,
53 struct writeback_control *wbc); 52 struct writeback_control *wbc);
54 53
55#define BH_ENTRY(list) list_entry((list), struct buffer_head, b_assoc_buffers) 54#define BH_ENTRY(list) list_entry((list), struct buffer_head, b_assoc_buffers)
@@ -1830,7 +1829,7 @@ int __block_write_full_page(struct inode *inode, struct page *page,
1830 do { 1829 do {
1831 struct buffer_head *next = bh->b_this_page; 1830 struct buffer_head *next = bh->b_this_page;
1832 if (buffer_async_write(bh)) { 1831 if (buffer_async_write(bh)) {
1833 submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); 1832 submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, wbc);
1834 nr_underway++; 1833 nr_underway++;
1835 } 1834 }
1836 bh = next; 1835 bh = next;
@@ -1884,7 +1883,7 @@ recover:
1884 struct buffer_head *next = bh->b_this_page; 1883 struct buffer_head *next = bh->b_this_page;
1885 if (buffer_async_write(bh)) { 1884 if (buffer_async_write(bh)) {
1886 clear_buffer_dirty(bh); 1885 clear_buffer_dirty(bh);
1887 submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, 0, wbc); 1886 submit_bh_wbc(REQ_OP_WRITE, write_flags, bh, wbc);
1888 nr_underway++; 1887 nr_underway++;
1889 } 1888 }
1890 bh = next; 1889 bh = next;
@@ -3092,7 +3091,7 @@ void guard_bio_eod(int op, struct bio *bio)
3092} 3091}
3093 3092
3094static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh, 3093static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
3095 unsigned long bio_flags, struct writeback_control *wbc) 3094 struct writeback_control *wbc)
3096{ 3095{
3097 struct bio *bio; 3096 struct bio *bio;
3098 3097
@@ -3127,7 +3126,6 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
3127 3126
3128 bio->bi_end_io = end_bio_bh_io_sync; 3127 bio->bi_end_io = end_bio_bh_io_sync;
3129 bio->bi_private = bh; 3128 bio->bi_private = bh;
3130 bio->bi_flags |= bio_flags;
3131 3129
3132 /* Take care of bh's that straddle the end of the device */ 3130 /* Take care of bh's that straddle the end of the device */
3133 guard_bio_eod(op, bio); 3131 guard_bio_eod(op, bio);
@@ -3142,16 +3140,9 @@ static int submit_bh_wbc(int op, int op_flags, struct buffer_head *bh,
3142 return 0; 3140 return 0;
3143} 3141}
3144 3142
3145int _submit_bh(int op, int op_flags, struct buffer_head *bh, 3143int submit_bh(int op, int op_flags, struct buffer_head *bh)
3146 unsigned long bio_flags)
3147{ 3144{
3148 return submit_bh_wbc(op, op_flags, bh, bio_flags, NULL); 3145 return submit_bh_wbc(op, op_flags, bh, NULL);
3149}
3150EXPORT_SYMBOL_GPL(_submit_bh);
3151
3152int submit_bh(int op, int op_flags, struct buffer_head *bh)
3153{
3154 return submit_bh_wbc(op, op_flags, bh, 0, NULL);
3155} 3146}
3156EXPORT_SYMBOL(submit_bh); 3147EXPORT_SYMBOL(submit_bh);
3157 3148
diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
index 11d087b2b28e..6116d5275a3e 100644
--- a/fs/compat_ioctl.c
+++ b/fs/compat_ioctl.c
@@ -833,7 +833,7 @@ static int compat_ioctl_preallocate(struct file *file,
833 */ 833 */
834#define XFORM(i) (((i) ^ ((i) << 27) ^ ((i) << 17)) & 0xffffffff) 834#define XFORM(i) (((i) ^ ((i) << 27) ^ ((i) << 17)) & 0xffffffff)
835 835
836#define COMPATIBLE_IOCTL(cmd) XFORM(cmd), 836#define COMPATIBLE_IOCTL(cmd) XFORM((u32)cmd),
837/* ioctl should not be warned about even if it's not implemented. 837/* ioctl should not be warned about even if it's not implemented.
838 Valid reasons to use this: 838 Valid reasons to use this:
839 - It is implemented with ->compat_ioctl on some device, but programs 839 - It is implemented with ->compat_ioctl on some device, but programs
diff --git a/fs/dcache.c b/fs/dcache.c
index 95d71eda8142..cddf39777835 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -419,6 +419,8 @@ static void dentry_lru_add(struct dentry *dentry)
419{ 419{
420 if (unlikely(!(dentry->d_flags & DCACHE_LRU_LIST))) 420 if (unlikely(!(dentry->d_flags & DCACHE_LRU_LIST)))
421 d_lru_add(dentry); 421 d_lru_add(dentry);
422 else if (unlikely(!(dentry->d_flags & DCACHE_REFERENCED)))
423 dentry->d_flags |= DCACHE_REFERENCED;
422} 424}
423 425
424/** 426/**
@@ -779,8 +781,6 @@ repeat:
779 goto kill_it; 781 goto kill_it;
780 } 782 }
781 783
782 if (!(dentry->d_flags & DCACHE_REFERENCED))
783 dentry->d_flags |= DCACHE_REFERENCED;
784 dentry_lru_add(dentry); 784 dentry_lru_add(dentry);
785 785
786 dentry->d_lockref.count--; 786 dentry->d_lockref.count--;
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index 7fd4ec4bb214..e892ae7d89f8 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -199,7 +199,7 @@ static const struct dentry_operations debugfs_dops = {
199 199
200static int debug_fill_super(struct super_block *sb, void *data, int silent) 200static int debug_fill_super(struct super_block *sb, void *data, int silent)
201{ 201{
202 static struct tree_descr debug_files[] = {{""}}; 202 static const struct tree_descr debug_files[] = {{""}};
203 struct debugfs_fs_info *fsi; 203 struct debugfs_fs_info *fsi;
204 int err; 204 int err;
205 205
diff --git a/fs/fcntl.c b/fs/fcntl.c
index 8bd81c2e89b2..f4e7267d117f 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -899,16 +899,10 @@ static int __init fcntl_init(void)
899 * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY 899 * Exceptions: O_NONBLOCK is a two bit define on parisc; O_NDELAY
900 * is defined as O_NONBLOCK on some platforms and not on others. 900 * is defined as O_NONBLOCK on some platforms and not on others.
901 */ 901 */
902 BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ != HWEIGHT32( 902 BUILD_BUG_ON(21 - 1 /* for O_RDONLY being 0 */ !=
903 O_RDONLY | O_WRONLY | O_RDWR | 903 HWEIGHT32(
904 O_CREAT | O_EXCL | O_NOCTTY | 904 (VALID_OPEN_FLAGS & ~(O_NONBLOCK | O_NDELAY)) |
905 O_TRUNC | O_APPEND | /* O_NONBLOCK | */ 905 __FMODE_EXEC | __FMODE_NONOTIFY));
906 __O_SYNC | O_DSYNC | FASYNC |
907 O_DIRECT | O_LARGEFILE | O_DIRECTORY |
908 O_NOFOLLOW | O_NOATIME | O_CLOEXEC |
909 __FMODE_EXEC | O_PATH | __O_TMPFILE |
910 __FMODE_NONOTIFY
911 ));
912 906
913 fasync_cache = kmem_cache_create("fasync_cache", 907 fasync_cache = kmem_cache_create("fasync_cache",
914 sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL); 908 sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL);
diff --git a/fs/fuse/control.c b/fs/fuse/control.c
index 6e22748b0704..b9ea99c5b5b3 100644
--- a/fs/fuse/control.c
+++ b/fs/fuse/control.c
@@ -292,7 +292,7 @@ void fuse_ctl_remove_conn(struct fuse_conn *fc)
292 292
293static int fuse_ctl_fill_super(struct super_block *sb, void *data, int silent) 293static int fuse_ctl_fill_super(struct super_block *sb, void *data, int silent)
294{ 294{
295 struct tree_descr empty_descr = {""}; 295 static const struct tree_descr empty_descr = {""};
296 struct fuse_conn *fc; 296 struct fuse_conn *fc;
297 int err; 297 int err;
298 298
diff --git a/fs/inode.c b/fs/inode.c
index 6ad1edb52045..db5914783a71 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -402,6 +402,8 @@ static void inode_lru_list_add(struct inode *inode)
402{ 402{
403 if (list_lru_add(&inode->i_sb->s_inode_lru, &inode->i_lru)) 403 if (list_lru_add(&inode->i_sb->s_inode_lru, &inode->i_lru))
404 this_cpu_inc(nr_unused); 404 this_cpu_inc(nr_unused);
405 else
406 inode->i_state |= I_REFERENCED;
405} 407}
406 408
407/* 409/*
@@ -1489,7 +1491,6 @@ static void iput_final(struct inode *inode)
1489 drop = generic_drop_inode(inode); 1491 drop = generic_drop_inode(inode);
1490 1492
1491 if (!drop && (sb->s_flags & MS_ACTIVE)) { 1493 if (!drop && (sb->s_flags & MS_ACTIVE)) {
1492 inode->i_state |= I_REFERENCED;
1493 inode_add_lru(inode); 1494 inode_add_lru(inode);
1494 spin_unlock(&inode->i_lock); 1495 spin_unlock(&inode->i_lock);
1495 return; 1496 return;
diff --git a/fs/internal.h b/fs/internal.h
index 076751d90ba2..9676fe11c093 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -126,8 +126,6 @@ static inline bool atime_needs_update_rcu(const struct path *path,
126 return __atime_needs_update(path, inode, true); 126 return __atime_needs_update(path, inode, true);
127} 127}
128 128
129extern bool atime_needs_update_rcu(const struct path *, struct inode *);
130
131/* 129/*
132 * fs-writeback.c 130 * fs-writeback.c
133 */ 131 */
diff --git a/fs/libfs.c b/fs/libfs.c
index a8b62e5d43a9..a04395334bb1 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -507,7 +507,7 @@ EXPORT_SYMBOL(simple_write_end);
507 * to pass it an appropriate max_reserved value to avoid collisions. 507 * to pass it an appropriate max_reserved value to avoid collisions.
508 */ 508 */
509int simple_fill_super(struct super_block *s, unsigned long magic, 509int simple_fill_super(struct super_block *s, unsigned long magic,
510 struct tree_descr *files) 510 const struct tree_descr *files)
511{ 511{
512 struct inode *inode; 512 struct inode *inode;
513 struct dentry *root; 513 struct dentry *root;
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index 8bf8f667a8cf..6493df6b1bd5 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -1146,7 +1146,7 @@ static ssize_t write_v4_end_grace(struct file *file, char *buf, size_t size)
1146 1146
1147static int nfsd_fill_super(struct super_block * sb, void * data, int silent) 1147static int nfsd_fill_super(struct super_block * sb, void * data, int silent)
1148{ 1148{
1149 static struct tree_descr nfsd_files[] = { 1149 static const struct tree_descr nfsd_files[] = {
1150 [NFSD_List] = {"exports", &exports_nfsd_operations, S_IRUGO}, 1150 [NFSD_List] = {"exports", &exports_nfsd_operations, S_IRUGO},
1151 [NFSD_Export_features] = {"export_features", 1151 [NFSD_Export_features] = {"export_features",
1152 &export_features_operations, S_IRUGO}, 1152 &export_features_operations, S_IRUGO},
diff --git a/fs/open.c b/fs/open.c
index 4d23f729dcc6..373787afd638 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -900,6 +900,12 @@ static inline int build_open_flags(int flags, umode_t mode, struct open_flags *o
900 int lookup_flags = 0; 900 int lookup_flags = 0;
901 int acc_mode = ACC_MODE(flags); 901 int acc_mode = ACC_MODE(flags);
902 902
903 /*
904 * Clear out all open flags we don't know about so that we don't report
905 * them in fcntl(F_GETFD) or similar interfaces.
906 */
907 flags &= VALID_OPEN_FLAGS;
908
903 if (flags & (O_CREAT | __O_TMPFILE)) 909 if (flags & (O_CREAT | __O_TMPFILE))
904 op->mode = (mode & S_IALLUGO) | S_IFREG; 910 op->mode = (mode & S_IALLUGO) | S_IFREG;
905 else 911 else
diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c
index 21d36d284735..328e89c2cf83 100644
--- a/fs/tracefs/inode.c
+++ b/fs/tracefs/inode.c
@@ -266,7 +266,7 @@ static const struct super_operations tracefs_super_operations = {
266 266
267static int trace_fill_super(struct super_block *sb, void *data, int silent) 267static int trace_fill_super(struct super_block *sb, void *data, int silent)
268{ 268{
269 static struct tree_descr trace_files[] = {{""}}; 269 static const struct tree_descr trace_files[] = {{""}};
270 struct tracefs_fs_info *fsi; 270 struct tracefs_fs_info *fsi;
271 int err; 271 int err;
272 272
diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
index 79591c3660cc..bd029e52ef5e 100644
--- a/include/linux/buffer_head.h
+++ b/include/linux/buffer_head.h
@@ -196,8 +196,6 @@ void ll_rw_block(int, int, int, struct buffer_head * bh[]);
196int sync_dirty_buffer(struct buffer_head *bh); 196int sync_dirty_buffer(struct buffer_head *bh);
197int __sync_dirty_buffer(struct buffer_head *bh, int op_flags); 197int __sync_dirty_buffer(struct buffer_head *bh, int op_flags);
198void write_dirty_buffer(struct buffer_head *bh, int op_flags); 198void write_dirty_buffer(struct buffer_head *bh, int op_flags);
199int _submit_bh(int op, int op_flags, struct buffer_head *bh,
200 unsigned long bio_flags);
201int submit_bh(int, int, struct buffer_head *); 199int submit_bh(int, int, struct buffer_head *);
202void write_boundary_block(struct block_device *bdev, 200void write_boundary_block(struct block_device *bdev,
203 sector_t bblock, unsigned blocksize); 201 sector_t bblock, unsigned blocksize);
diff --git a/include/linux/fcntl.h b/include/linux/fcntl.h
index 76ce329e656d..1b48d9c9a561 100644
--- a/include/linux/fcntl.h
+++ b/include/linux/fcntl.h
@@ -3,6 +3,12 @@
3 3
4#include <uapi/linux/fcntl.h> 4#include <uapi/linux/fcntl.h>
5 5
6/* list of all valid flags for the open/openat flags argument: */
7#define VALID_OPEN_FLAGS \
8 (O_RDONLY | O_WRONLY | O_RDWR | O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC | \
9 O_APPEND | O_NDELAY | O_NONBLOCK | O_NDELAY | __O_SYNC | O_DSYNC | \
10 FASYNC | O_DIRECT | O_LARGEFILE | O_DIRECTORY | O_NOFOLLOW | \
11 O_NOATIME | O_CLOEXEC | O_PATH | __O_TMPFILE)
6 12
7#ifndef force_o_largefile 13#ifndef force_o_largefile
8#define force_o_largefile() (BITS_PER_LONG != 32) 14#define force_o_largefile() (BITS_PER_LONG != 32)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 249dad4e8d26..26488b419965 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -29,7 +29,6 @@
29#include <linux/lockdep.h> 29#include <linux/lockdep.h>
30#include <linux/percpu-rwsem.h> 30#include <linux/percpu-rwsem.h>
31#include <linux/workqueue.h> 31#include <linux/workqueue.h>
32#include <linux/percpu-rwsem.h>
33#include <linux/delayed_call.h> 32#include <linux/delayed_call.h>
34 33
35#include <asm/byteorder.h> 34#include <asm/byteorder.h>
@@ -2925,17 +2924,19 @@ extern int vfs_statx_fd(unsigned int, struct kstat *, u32, unsigned int);
2925 2924
2926static inline int vfs_stat(const char __user *filename, struct kstat *stat) 2925static inline int vfs_stat(const char __user *filename, struct kstat *stat)
2927{ 2926{
2928 return vfs_statx(AT_FDCWD, filename, 0, stat, STATX_BASIC_STATS); 2927 return vfs_statx(AT_FDCWD, filename, AT_NO_AUTOMOUNT,
2928 stat, STATX_BASIC_STATS);
2929} 2929}
2930static inline int vfs_lstat(const char __user *name, struct kstat *stat) 2930static inline int vfs_lstat(const char __user *name, struct kstat *stat)
2931{ 2931{
2932 return vfs_statx(AT_FDCWD, name, AT_SYMLINK_NOFOLLOW, 2932 return vfs_statx(AT_FDCWD, name, AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT,
2933 stat, STATX_BASIC_STATS); 2933 stat, STATX_BASIC_STATS);
2934} 2934}
2935static inline int vfs_fstatat(int dfd, const char __user *filename, 2935static inline int vfs_fstatat(int dfd, const char __user *filename,
2936 struct kstat *stat, int flags) 2936 struct kstat *stat, int flags)
2937{ 2937{
2938 return vfs_statx(dfd, filename, flags, stat, STATX_BASIC_STATS); 2938 return vfs_statx(dfd, filename, flags | AT_NO_AUTOMOUNT,
2939 stat, STATX_BASIC_STATS);
2939} 2940}
2940static inline int vfs_fstat(int fd, struct kstat *stat) 2941static inline int vfs_fstat(int fd, struct kstat *stat)
2941{ 2942{
@@ -3000,9 +3001,10 @@ extern const struct file_operations simple_dir_operations;
3000extern const struct inode_operations simple_dir_inode_operations; 3001extern const struct inode_operations simple_dir_inode_operations;
3001extern void make_empty_dir_inode(struct inode *inode); 3002extern void make_empty_dir_inode(struct inode *inode);
3002extern bool is_empty_dir_inode(struct inode *inode); 3003extern bool is_empty_dir_inode(struct inode *inode);
3003struct tree_descr { char *name; const struct file_operations *ops; int mode; }; 3004struct tree_descr { const char *name; const struct file_operations *ops; int mode; };
3004struct dentry *d_alloc_name(struct dentry *, const char *); 3005struct dentry *d_alloc_name(struct dentry *, const char *);
3005extern int simple_fill_super(struct super_block *, unsigned long, struct tree_descr *); 3006extern int simple_fill_super(struct super_block *, unsigned long,
3007 const struct tree_descr *);
3006extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count); 3008extern int simple_pin_fs(struct file_system_type *, struct vfsmount **mount, int *count);
3007extern void simple_release_fs(struct vfsmount **mount, int *count); 3009extern void simple_release_fs(struct vfsmount **mount, int *count);
3008 3010
diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c
index fddcae801724..9bbd33497d3d 100644
--- a/kernel/bpf/inode.c
+++ b/kernel/bpf/inode.c
@@ -429,7 +429,7 @@ static int bpf_parse_options(char *data, struct bpf_mount_opts *opts)
429 429
430static int bpf_fill_super(struct super_block *sb, void *data, int silent) 430static int bpf_fill_super(struct super_block *sb, void *data, int silent)
431{ 431{
432 static struct tree_descr bpf_rfiles[] = { { "" } }; 432 static const struct tree_descr bpf_rfiles[] = { { "" } };
433 struct bpf_mount_opts opts; 433 struct bpf_mount_opts opts;
434 struct inode *inode; 434 struct inode *inode;
435 int ret; 435 int ret;
diff --git a/security/inode.c b/security/inode.c
index 2cb14162ff8d..eccd58ef2ae8 100644
--- a/security/inode.c
+++ b/security/inode.c
@@ -28,7 +28,7 @@ static int mount_count;
28 28
29static int fill_super(struct super_block *sb, void *data, int silent) 29static int fill_super(struct super_block *sb, void *data, int silent)
30{ 30{
31 static struct tree_descr files[] = {{""}}; 31 static const struct tree_descr files[] = {{""}};
32 32
33 return simple_fill_super(sb, SECURITYFS_MAGIC, files); 33 return simple_fill_super(sb, SECURITYFS_MAGIC, files);
34} 34}
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
index ce7171884223..50062e70140d 100644
--- a/security/selinux/selinuxfs.c
+++ b/security/selinux/selinuxfs.c
@@ -1496,7 +1496,7 @@ static const struct file_operations sel_avc_cache_stats_ops = {
1496static int sel_make_avc_files(struct dentry *dir) 1496static int sel_make_avc_files(struct dentry *dir)
1497{ 1497{
1498 int i; 1498 int i;
1499 static struct tree_descr files[] = { 1499 static const struct tree_descr files[] = {
1500 { "cache_threshold", 1500 { "cache_threshold",
1501 &sel_avc_cache_threshold_ops, S_IRUGO|S_IWUSR }, 1501 &sel_avc_cache_threshold_ops, S_IRUGO|S_IWUSR },
1502 { "hash_stats", &sel_avc_hash_stats_ops, S_IRUGO }, 1502 { "hash_stats", &sel_avc_hash_stats_ops, S_IRUGO },
@@ -1805,7 +1805,7 @@ static int sel_fill_super(struct super_block *sb, void *data, int silent)
1805 struct inode *inode; 1805 struct inode *inode;
1806 struct inode_security_struct *isec; 1806 struct inode_security_struct *isec;
1807 1807
1808 static struct tree_descr selinux_files[] = { 1808 static const struct tree_descr selinux_files[] = {
1809 [SEL_LOAD] = {"load", &sel_load_ops, S_IRUSR|S_IWUSR}, 1809 [SEL_LOAD] = {"load", &sel_load_ops, S_IRUSR|S_IWUSR},
1810 [SEL_ENFORCE] = {"enforce", &sel_enforce_ops, S_IRUGO|S_IWUSR}, 1810 [SEL_ENFORCE] = {"enforce", &sel_enforce_ops, S_IRUGO|S_IWUSR},
1811 [SEL_CONTEXT] = {"context", &transaction_ops, S_IRUGO|S_IWUGO}, 1811 [SEL_CONTEXT] = {"context", &transaction_ops, S_IRUGO|S_IWUGO},
diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
index 366b8356f75b..f6482e53d55a 100644
--- a/security/smack/smackfs.c
+++ b/security/smack/smackfs.c
@@ -2855,7 +2855,7 @@ static int smk_fill_super(struct super_block *sb, void *data, int silent)
2855 int rc; 2855 int rc;
2856 struct inode *root_inode; 2856 struct inode *root_inode;
2857 2857
2858 static struct tree_descr smack_files[] = { 2858 static const struct tree_descr smack_files[] = {
2859 [SMK_LOAD] = { 2859 [SMK_LOAD] = {
2860 "load", &smk_load_ops, S_IRUGO|S_IWUSR}, 2860 "load", &smk_load_ops, S_IRUGO|S_IWUSR},
2861 [SMK_CIPSO] = { 2861 [SMK_CIPSO] = {