diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-07-04 22:36:06 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-07-04 22:36:06 -0400 |
| commit | 1dc51b8288007753ad7cd7d08bb8fa930fc8bb10 (patch) | |
| tree | 0616c0ff7d877e64d9c248a6cdff074eae258840 /include/linux | |
| parent | 9b284cbdb5de3b8871014f8290d1b540e5181c21 (diff) | |
| parent | 0f1db7dee200127da4c07928189748918c312031 (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull more vfs updates from Al Viro:
"Assorted VFS fixes and related cleanups (IMO the most interesting in
that part are f_path-related things and Eric's descriptor-related
stuff). UFS regression fixes (it got broken last cycle). 9P fixes.
fs-cache series, DAX patches, Jan's file_remove_suid() work"
[ I'd say this is much more than "fixes and related cleanups". The
file_table locking rule change by Eric Dumazet is a rather big and
fundamental update even if the patch isn't huge. - Linus ]
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (49 commits)
9p: cope with bogus responses from server in p9_client_{read,write}
p9_client_write(): avoid double p9_free_req()
9p: forgetting to cancel request on interrupted zero-copy RPC
dax: bdev_direct_access() may sleep
block: Add support for DAX reads/writes to block devices
dax: Use copy_from_iter_nocache
dax: Add block size note to documentation
fs/file.c: __fget() and dup2() atomicity rules
fs/file.c: don't acquire files->file_lock in fd_install()
fs:super:get_anon_bdev: fix race condition could cause dev exceed its upper limitation
vfs: avoid creation of inode number 0 in get_next_ino
namei: make set_root_rcu() return void
make simple_positive() public
ufs: use dir_pages instead of ufs_dir_pages()
pagemap.h: move dir_pages() over there
remove the pointless include of lglock.h
fs: cleanup slight list_entry abuse
xfs: Correctly lock inode when removing suid and file capabilities
fs: Call security_ops->inode_killpriv on truncate
fs: Provide function telling whether file_remove_privs() will do anything
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/dcache.h | 7 | ||||
| -rw-r--r-- | include/linux/fdtable.h | 3 | ||||
| -rw-r--r-- | include/linux/fs.h | 11 | ||||
| -rw-r--r-- | include/linux/fscache-cache.h | 55 | ||||
| -rw-r--r-- | include/linux/pagemap.h | 6 | ||||
| -rw-r--r-- | include/linux/seq_file.h | 1 |
6 files changed, 52 insertions, 31 deletions
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index df334cbacc6d..d2d50249b7b2 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
| @@ -160,6 +160,7 @@ struct dentry_operations { | |||
| 160 | char *(*d_dname)(struct dentry *, char *, int); | 160 | char *(*d_dname)(struct dentry *, char *, int); |
| 161 | struct vfsmount *(*d_automount)(struct path *); | 161 | struct vfsmount *(*d_automount)(struct path *); |
| 162 | int (*d_manage)(struct dentry *, bool); | 162 | int (*d_manage)(struct dentry *, bool); |
| 163 | struct inode *(*d_select_inode)(struct dentry *, unsigned); | ||
| 163 | } ____cacheline_aligned; | 164 | } ____cacheline_aligned; |
| 164 | 165 | ||
| 165 | /* | 166 | /* |
| @@ -225,6 +226,7 @@ struct dentry_operations { | |||
| 225 | 226 | ||
| 226 | #define DCACHE_MAY_FREE 0x00800000 | 227 | #define DCACHE_MAY_FREE 0x00800000 |
| 227 | #define DCACHE_FALLTHRU 0x01000000 /* Fall through to lower layer */ | 228 | #define DCACHE_FALLTHRU 0x01000000 /* Fall through to lower layer */ |
| 229 | #define DCACHE_OP_SELECT_INODE 0x02000000 /* Unioned entry: dcache op selects inode */ | ||
| 228 | 230 | ||
| 229 | extern seqlock_t rename_lock; | 231 | extern seqlock_t rename_lock; |
| 230 | 232 | ||
| @@ -505,6 +507,11 @@ static inline bool d_really_is_positive(const struct dentry *dentry) | |||
| 505 | return dentry->d_inode != NULL; | 507 | return dentry->d_inode != NULL; |
| 506 | } | 508 | } |
| 507 | 509 | ||
| 510 | static inline int simple_positive(struct dentry *dentry) | ||
| 511 | { | ||
| 512 | return d_really_is_positive(dentry) && !d_unhashed(dentry); | ||
| 513 | } | ||
| 514 | |||
| 508 | extern void d_set_fallthru(struct dentry *dentry); | 515 | extern void d_set_fallthru(struct dentry *dentry); |
| 509 | 516 | ||
| 510 | static inline bool d_is_fallthru(const struct dentry *dentry) | 517 | static inline bool d_is_fallthru(const struct dentry *dentry) |
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h index 230f87bdf5ad..fbb88740634a 100644 --- a/include/linux/fdtable.h +++ b/include/linux/fdtable.h | |||
| @@ -47,6 +47,9 @@ struct files_struct { | |||
| 47 | * read mostly part | 47 | * read mostly part |
| 48 | */ | 48 | */ |
| 49 | atomic_t count; | 49 | atomic_t count; |
| 50 | bool resize_in_progress; | ||
| 51 | wait_queue_head_t resize_wait; | ||
| 52 | |||
| 50 | struct fdtable __rcu *fdt; | 53 | struct fdtable __rcu *fdt; |
| 51 | struct fdtable fdtab; | 54 | struct fdtable fdtab; |
| 52 | /* | 55 | /* |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 8a81fcbb0074..a0653e560c26 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -1654,7 +1654,6 @@ struct inode_operations { | |||
| 1654 | int (*set_acl)(struct inode *, struct posix_acl *, int); | 1654 | int (*set_acl)(struct inode *, struct posix_acl *, int); |
| 1655 | 1655 | ||
| 1656 | /* WARNING: probably going away soon, do not use! */ | 1656 | /* WARNING: probably going away soon, do not use! */ |
| 1657 | int (*dentry_open)(struct dentry *, struct file *, const struct cred *); | ||
| 1658 | } ____cacheline_aligned; | 1657 | } ____cacheline_aligned; |
| 1659 | 1658 | ||
| 1660 | ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, | 1659 | ssize_t rw_copy_check_uvector(int type, const struct iovec __user * uvector, |
| @@ -2213,7 +2212,6 @@ extern struct file *file_open_name(struct filename *, int, umode_t); | |||
| 2213 | extern struct file *filp_open(const char *, int, umode_t); | 2212 | extern struct file *filp_open(const char *, int, umode_t); |
| 2214 | extern struct file *file_open_root(struct dentry *, struct vfsmount *, | 2213 | extern struct file *file_open_root(struct dentry *, struct vfsmount *, |
| 2215 | const char *, int); | 2214 | const char *, int); |
| 2216 | extern int vfs_open(const struct path *, struct file *, const struct cred *); | ||
| 2217 | extern struct file * dentry_open(const struct path *, int, const struct cred *); | 2215 | extern struct file * dentry_open(const struct path *, int, const struct cred *); |
| 2218 | extern int filp_close(struct file *, fl_owner_t id); | 2216 | extern int filp_close(struct file *, fl_owner_t id); |
| 2219 | 2217 | ||
| @@ -2530,6 +2528,8 @@ extern struct file * open_exec(const char *); | |||
| 2530 | extern int is_subdir(struct dentry *, struct dentry *); | 2528 | extern int is_subdir(struct dentry *, struct dentry *); |
| 2531 | extern int path_is_under(struct path *, struct path *); | 2529 | extern int path_is_under(struct path *, struct path *); |
| 2532 | 2530 | ||
| 2531 | extern char *file_path(struct file *, char *, int); | ||
| 2532 | |||
| 2533 | #include <linux/err.h> | 2533 | #include <linux/err.h> |
| 2534 | 2534 | ||
| 2535 | /* needed for stackable file system support */ | 2535 | /* needed for stackable file system support */ |
| @@ -2581,7 +2581,12 @@ extern struct inode *new_inode_pseudo(struct super_block *sb); | |||
| 2581 | extern struct inode *new_inode(struct super_block *sb); | 2581 | extern struct inode *new_inode(struct super_block *sb); |
| 2582 | extern void free_inode_nonrcu(struct inode *inode); | 2582 | extern void free_inode_nonrcu(struct inode *inode); |
| 2583 | extern int should_remove_suid(struct dentry *); | 2583 | extern int should_remove_suid(struct dentry *); |
| 2584 | extern int file_remove_suid(struct file *); | 2584 | extern int file_remove_privs(struct file *); |
| 2585 | extern int dentry_needs_remove_privs(struct dentry *dentry); | ||
| 2586 | static inline int file_needs_remove_privs(struct file *file) | ||
| 2587 | { | ||
| 2588 | return dentry_needs_remove_privs(file->f_path.dentry); | ||
| 2589 | } | ||
| 2585 | 2590 | ||
| 2586 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); | 2591 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); |
| 2587 | static inline void insert_inode_hash(struct inode *inode) | 2592 | static inline void insert_inode_hash(struct inode *inode) |
diff --git a/include/linux/fscache-cache.h b/include/linux/fscache-cache.h index 771484993ca7..604e1526cd00 100644 --- a/include/linux/fscache-cache.h +++ b/include/linux/fscache-cache.h | |||
| @@ -74,6 +74,7 @@ extern wait_queue_head_t fscache_cache_cleared_wq; | |||
| 74 | */ | 74 | */ |
| 75 | typedef void (*fscache_operation_release_t)(struct fscache_operation *op); | 75 | typedef void (*fscache_operation_release_t)(struct fscache_operation *op); |
| 76 | typedef void (*fscache_operation_processor_t)(struct fscache_operation *op); | 76 | typedef void (*fscache_operation_processor_t)(struct fscache_operation *op); |
| 77 | typedef void (*fscache_operation_cancel_t)(struct fscache_operation *op); | ||
| 77 | 78 | ||
| 78 | enum fscache_operation_state { | 79 | enum fscache_operation_state { |
| 79 | FSCACHE_OP_ST_BLANK, /* Op is not yet submitted */ | 80 | FSCACHE_OP_ST_BLANK, /* Op is not yet submitted */ |
| @@ -109,6 +110,9 @@ struct fscache_operation { | |||
| 109 | * the op in a non-pool thread */ | 110 | * the op in a non-pool thread */ |
| 110 | fscache_operation_processor_t processor; | 111 | fscache_operation_processor_t processor; |
| 111 | 112 | ||
| 113 | /* Operation cancellation cleanup (optional) */ | ||
| 114 | fscache_operation_cancel_t cancel; | ||
| 115 | |||
| 112 | /* operation releaser */ | 116 | /* operation releaser */ |
| 113 | fscache_operation_release_t release; | 117 | fscache_operation_release_t release; |
| 114 | }; | 118 | }; |
| @@ -119,33 +123,17 @@ extern void fscache_op_work_func(struct work_struct *work); | |||
| 119 | extern void fscache_enqueue_operation(struct fscache_operation *); | 123 | extern void fscache_enqueue_operation(struct fscache_operation *); |
| 120 | extern void fscache_op_complete(struct fscache_operation *, bool); | 124 | extern void fscache_op_complete(struct fscache_operation *, bool); |
| 121 | extern void fscache_put_operation(struct fscache_operation *); | 125 | extern void fscache_put_operation(struct fscache_operation *); |
| 122 | 126 | extern void fscache_operation_init(struct fscache_operation *, | |
| 123 | /** | 127 | fscache_operation_processor_t, |
| 124 | * fscache_operation_init - Do basic initialisation of an operation | 128 | fscache_operation_cancel_t, |
| 125 | * @op: The operation to initialise | 129 | fscache_operation_release_t); |
| 126 | * @release: The release function to assign | ||
| 127 | * | ||
| 128 | * Do basic initialisation of an operation. The caller must still set flags, | ||
| 129 | * object and processor if needed. | ||
| 130 | */ | ||
| 131 | static inline void fscache_operation_init(struct fscache_operation *op, | ||
| 132 | fscache_operation_processor_t processor, | ||
| 133 | fscache_operation_release_t release) | ||
| 134 | { | ||
| 135 | INIT_WORK(&op->work, fscache_op_work_func); | ||
| 136 | atomic_set(&op->usage, 1); | ||
| 137 | op->state = FSCACHE_OP_ST_INITIALISED; | ||
| 138 | op->debug_id = atomic_inc_return(&fscache_op_debug_id); | ||
| 139 | op->processor = processor; | ||
| 140 | op->release = release; | ||
| 141 | INIT_LIST_HEAD(&op->pend_link); | ||
| 142 | } | ||
| 143 | 130 | ||
| 144 | /* | 131 | /* |
| 145 | * data read operation | 132 | * data read operation |
| 146 | */ | 133 | */ |
| 147 | struct fscache_retrieval { | 134 | struct fscache_retrieval { |
| 148 | struct fscache_operation op; | 135 | struct fscache_operation op; |
| 136 | struct fscache_cookie *cookie; /* The netfs cookie */ | ||
| 149 | struct address_space *mapping; /* netfs pages */ | 137 | struct address_space *mapping; /* netfs pages */ |
| 150 | fscache_rw_complete_t end_io_func; /* function to call on I/O completion */ | 138 | fscache_rw_complete_t end_io_func; /* function to call on I/O completion */ |
| 151 | void *context; /* netfs read context (pinned) */ | 139 | void *context; /* netfs read context (pinned) */ |
| @@ -371,6 +359,7 @@ struct fscache_object { | |||
| 371 | #define FSCACHE_OBJECT_IS_LOOKED_UP 4 /* T if object has been looked up */ | 359 | #define FSCACHE_OBJECT_IS_LOOKED_UP 4 /* T if object has been looked up */ |
| 372 | #define FSCACHE_OBJECT_IS_AVAILABLE 5 /* T if object has become active */ | 360 | #define FSCACHE_OBJECT_IS_AVAILABLE 5 /* T if object has become active */ |
| 373 | #define FSCACHE_OBJECT_RETIRED 6 /* T if object was retired on relinquishment */ | 361 | #define FSCACHE_OBJECT_RETIRED 6 /* T if object was retired on relinquishment */ |
| 362 | #define FSCACHE_OBJECT_KILLED_BY_CACHE 7 /* T if object was killed by the cache */ | ||
| 374 | 363 | ||
| 375 | struct list_head cache_link; /* link in cache->object_list */ | 364 | struct list_head cache_link; /* link in cache->object_list */ |
| 376 | struct hlist_node cookie_link; /* link in cookie->backing_objects */ | 365 | struct hlist_node cookie_link; /* link in cookie->backing_objects */ |
| @@ -410,17 +399,16 @@ static inline bool fscache_object_is_available(struct fscache_object *object) | |||
| 410 | return test_bit(FSCACHE_OBJECT_IS_AVAILABLE, &object->flags); | 399 | return test_bit(FSCACHE_OBJECT_IS_AVAILABLE, &object->flags); |
| 411 | } | 400 | } |
| 412 | 401 | ||
| 413 | static inline bool fscache_object_is_active(struct fscache_object *object) | 402 | static inline bool fscache_cache_is_broken(struct fscache_object *object) |
| 414 | { | 403 | { |
| 415 | return fscache_object_is_available(object) && | 404 | return test_bit(FSCACHE_IOERROR, &object->cache->flags); |
| 416 | fscache_object_is_live(object) && | ||
| 417 | !test_bit(FSCACHE_IOERROR, &object->cache->flags); | ||
| 418 | } | 405 | } |
| 419 | 406 | ||
| 420 | static inline bool fscache_object_is_dead(struct fscache_object *object) | 407 | static inline bool fscache_object_is_active(struct fscache_object *object) |
| 421 | { | 408 | { |
| 422 | return fscache_object_is_dying(object) && | 409 | return fscache_object_is_available(object) && |
| 423 | test_bit(FSCACHE_IOERROR, &object->cache->flags); | 410 | fscache_object_is_live(object) && |
| 411 | !fscache_cache_is_broken(object); | ||
| 424 | } | 412 | } |
| 425 | 413 | ||
| 426 | /** | 414 | /** |
| @@ -551,4 +539,15 @@ extern enum fscache_checkaux fscache_check_aux(struct fscache_object *object, | |||
| 551 | const void *data, | 539 | const void *data, |
| 552 | uint16_t datalen); | 540 | uint16_t datalen); |
| 553 | 541 | ||
| 542 | extern void fscache_object_retrying_stale(struct fscache_object *object); | ||
| 543 | |||
| 544 | enum fscache_why_object_killed { | ||
| 545 | FSCACHE_OBJECT_IS_STALE, | ||
| 546 | FSCACHE_OBJECT_NO_SPACE, | ||
| 547 | FSCACHE_OBJECT_WAS_RETIRED, | ||
| 548 | FSCACHE_OBJECT_WAS_CULLED, | ||
| 549 | }; | ||
| 550 | extern void fscache_object_mark_killed(struct fscache_object *object, | ||
| 551 | enum fscache_why_object_killed why); | ||
| 552 | |||
| 554 | #endif /* _LINUX_FSCACHE_CACHE_H */ | 553 | #endif /* _LINUX_FSCACHE_CACHE_H */ |
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index fb0814ca65c7..a6c78e00ea96 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h | |||
| @@ -671,4 +671,10 @@ static inline int add_to_page_cache(struct page *page, | |||
| 671 | return error; | 671 | return error; |
| 672 | } | 672 | } |
| 673 | 673 | ||
| 674 | static inline unsigned long dir_pages(struct inode *inode) | ||
| 675 | { | ||
| 676 | return (unsigned long)(inode->i_size + PAGE_CACHE_SIZE - 1) >> | ||
| 677 | PAGE_CACHE_SHIFT; | ||
| 678 | } | ||
| 679 | |||
| 674 | #endif /* _LINUX_PAGEMAP_H */ | 680 | #endif /* _LINUX_PAGEMAP_H */ |
diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h index afbb1fd77c77..912a7c482649 100644 --- a/include/linux/seq_file.h +++ b/include/linux/seq_file.h | |||
| @@ -123,6 +123,7 @@ __printf(2, 3) int seq_printf(struct seq_file *, const char *, ...); | |||
| 123 | __printf(2, 0) int seq_vprintf(struct seq_file *, const char *, va_list args); | 123 | __printf(2, 0) int seq_vprintf(struct seq_file *, const char *, va_list args); |
| 124 | 124 | ||
| 125 | int seq_path(struct seq_file *, const struct path *, const char *); | 125 | int seq_path(struct seq_file *, const struct path *, const char *); |
| 126 | int seq_file_path(struct seq_file *, struct file *, const char *); | ||
| 126 | int seq_dentry(struct seq_file *, struct dentry *, const char *); | 127 | int seq_dentry(struct seq_file *, struct dentry *, const char *); |
| 127 | int seq_path_root(struct seq_file *m, const struct path *path, | 128 | int seq_path_root(struct seq_file *m, const struct path *path, |
| 128 | const struct path *root, const char *esc); | 129 | const struct path *root, const char *esc); |
