mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-24 13:44:26 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull VFS changes from Al Viro:
"First pile out of several (there _definitely_ will be more). Stuff in
this one:
- unification of d_splice_alias()/d_materialize_unique()
- iov_iter rewrite
- killing a bunch of ->f_path.dentry users (and f_dentry macro).
Getting that completed will make life much simpler for
unionmount/overlayfs, since then we'll be able to limit the places
sensitive to file _dentry_ to reasonably few. Which allows to have
file_inode(file) pointing to inode in a covered layer, with dentry
pointing to (negative) dentry in union one.
Still not complete, but much closer now.
- crapectomy in lustre (dead code removal, mostly)
- "let's make seq_printf return nothing" preparations
- assorted cleanups and fixes
There _definitely_ will be more piles"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (63 commits)
copy_from_iter_nocache()
new helper: iov_iter_kvec()
csum_and_copy_..._iter()
iov_iter.c: handle ITER_KVEC directly
iov_iter.c: convert copy_to_iter() to iterate_and_advance
iov_iter.c: convert copy_from_iter() to iterate_and_advance
iov_iter.c: get rid of bvec_copy_page_{to,from}_iter()
iov_iter.c: convert iov_iter_zero() to iterate_and_advance
iov_iter.c: convert iov_iter_get_pages_alloc() to iterate_all_kinds
iov_iter.c: convert iov_iter_get_pages() to iterate_all_kinds
iov_iter.c: convert iov_iter_npages() to iterate_all_kinds
iov_iter.c: iterate_and_advance
iov_iter.c: macros for iterating over iov_iter
kill f_dentry macro
dcache: fix kmemcheck warning in switch_names
new helper: audit_file()
nfsd_vfs_write(): use file_inode()
ncpfs: use file_inode()
kill f_dentry uses
lockd: get rid of ->f_path.dentry->d_sb
...
This commit is contained in:
commit
cbfe0de303
157 changed files with 1666 additions and 2166 deletions
|
|
@ -130,6 +130,7 @@ extern void audit_putname(struct filename *name);
|
|||
#define AUDIT_INODE_HIDDEN 2 /* audit record should be hidden */
|
||||
extern void __audit_inode(struct filename *name, const struct dentry *dentry,
|
||||
unsigned int flags);
|
||||
extern void __audit_file(const struct file *);
|
||||
extern void __audit_inode_child(const struct inode *parent,
|
||||
const struct dentry *dentry,
|
||||
const unsigned char type);
|
||||
|
|
@ -183,6 +184,11 @@ static inline void audit_inode(struct filename *name,
|
|||
__audit_inode(name, dentry, flags);
|
||||
}
|
||||
}
|
||||
static inline void audit_file(struct file *file)
|
||||
{
|
||||
if (unlikely(!audit_dummy_context()))
|
||||
__audit_file(file);
|
||||
}
|
||||
static inline void audit_inode_parent_hidden(struct filename *name,
|
||||
const struct dentry *dentry)
|
||||
{
|
||||
|
|
@ -357,6 +363,9 @@ static inline void audit_inode(struct filename *name,
|
|||
const struct dentry *dentry,
|
||||
unsigned int parent)
|
||||
{ }
|
||||
static inline void audit_file(struct file *file)
|
||||
{
|
||||
}
|
||||
static inline void audit_inode_parent_hidden(struct filename *name,
|
||||
const struct dentry *dentry)
|
||||
{ }
|
||||
|
|
|
|||
|
|
@ -367,8 +367,8 @@ struct css_set {
|
|||
* struct cftype: handler definitions for cgroup control files
|
||||
*
|
||||
* When reading/writing to a file:
|
||||
* - the cgroup to use is file->f_dentry->d_parent->d_fsdata
|
||||
* - the 'cftype' of the file is file->f_dentry->d_fsdata
|
||||
* - the cgroup to use is file->f_path.dentry->d_parent->d_fsdata
|
||||
* - the 'cftype' of the file is file->f_path.dentry->d_fsdata
|
||||
*/
|
||||
|
||||
/* cftype->flags */
|
||||
|
|
|
|||
|
|
@ -124,15 +124,15 @@ struct dentry {
|
|||
void *d_fsdata; /* fs-specific data */
|
||||
|
||||
struct list_head d_lru; /* LRU list */
|
||||
struct list_head d_child; /* child of parent list */
|
||||
struct list_head d_subdirs; /* our children */
|
||||
/*
|
||||
* d_child and d_rcu can share memory
|
||||
* d_alias and d_rcu can share memory
|
||||
*/
|
||||
union {
|
||||
struct list_head d_child; /* child of parent list */
|
||||
struct hlist_node d_alias; /* inode alias list */
|
||||
struct rcu_head d_rcu;
|
||||
} d_u;
|
||||
struct list_head d_subdirs; /* our children */
|
||||
struct hlist_node d_alias; /* inode alias list */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -230,7 +230,6 @@ extern seqlock_t rename_lock;
|
|||
*/
|
||||
extern void d_instantiate(struct dentry *, struct inode *);
|
||||
extern struct dentry * d_instantiate_unique(struct dentry *, struct inode *);
|
||||
extern struct dentry * d_materialise_unique(struct dentry *, struct inode *);
|
||||
extern int d_instantiate_no_diralias(struct dentry *, struct inode *);
|
||||
extern void __d_drop(struct dentry *dentry);
|
||||
extern void d_drop(struct dentry *dentry);
|
||||
|
|
|
|||
|
|
@ -92,8 +92,8 @@ struct dentry *debugfs_create_regset32(const char *name, umode_t mode,
|
|||
struct dentry *parent,
|
||||
struct debugfs_regset32 *regset);
|
||||
|
||||
int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
|
||||
int nregs, void __iomem *base, char *prefix);
|
||||
void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
|
||||
int nregs, void __iomem *base, char *prefix);
|
||||
|
||||
struct dentry *debugfs_create_u32_array(const char *name, umode_t mode,
|
||||
struct dentry *parent,
|
||||
|
|
@ -233,10 +233,9 @@ static inline struct dentry *debugfs_create_regset32(const char *name,
|
|||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
|
||||
static inline void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
|
||||
int nregs, void __iomem *base, char *prefix)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline bool debugfs_initialized(void)
|
||||
|
|
|
|||
|
|
@ -786,7 +786,6 @@ struct file {
|
|||
struct rcu_head fu_rcuhead;
|
||||
} f_u;
|
||||
struct path f_path;
|
||||
#define f_dentry f_path.dentry
|
||||
struct inode *f_inode; /* cached value */
|
||||
const struct file_operations *f_op;
|
||||
|
||||
|
|
@ -1465,7 +1464,10 @@ int fiemap_check_flags(struct fiemap_extent_info *fieinfo, u32 fs_flags);
|
|||
* This allows the kernel to read directories into kernel space or
|
||||
* to have different dirent layouts depending on the binary type.
|
||||
*/
|
||||
typedef int (*filldir_t)(void *, const char *, int, loff_t, u64, unsigned);
|
||||
struct dir_context;
|
||||
typedef int (*filldir_t)(struct dir_context *, const char *, int, loff_t, u64,
|
||||
unsigned);
|
||||
|
||||
struct dir_context {
|
||||
const filldir_t actor;
|
||||
loff_t pos;
|
||||
|
|
@ -1511,7 +1513,7 @@ struct file_operations {
|
|||
int (*setlease)(struct file *, long, struct file_lock **, void **);
|
||||
long (*fallocate)(struct file *file, int mode, loff_t offset,
|
||||
loff_t len);
|
||||
int (*show_fdinfo)(struct seq_file *m, struct file *f);
|
||||
void (*show_fdinfo)(struct seq_file *m, struct file *f);
|
||||
};
|
||||
|
||||
struct inode_operations {
|
||||
|
|
@ -2787,6 +2789,11 @@ static inline void inode_has_no_xattr(struct inode *inode)
|
|||
inode->i_flags |= S_NOSEC;
|
||||
}
|
||||
|
||||
static inline bool is_root_inode(struct inode *inode)
|
||||
{
|
||||
return inode == inode->i_sb->s_root->d_inode;
|
||||
}
|
||||
|
||||
static inline bool dir_emit(struct dir_context *ctx,
|
||||
const char *name, int namelen,
|
||||
u64 ino, unsigned type)
|
||||
|
|
|
|||
|
|
@ -42,6 +42,21 @@ struct seq_operations {
|
|||
|
||||
#define SEQ_SKIP 1
|
||||
|
||||
/**
|
||||
* seq_has_overflowed - check if the buffer has overflowed
|
||||
* @m: the seq_file handle
|
||||
*
|
||||
* seq_files have a buffer which may overflow. When this happens a larger
|
||||
* buffer is reallocated and all the data will be printed again.
|
||||
* The overflow state is true when m->count == m->size.
|
||||
*
|
||||
* Returns true if the buffer received more than it can hold.
|
||||
*/
|
||||
static inline bool seq_has_overflowed(struct seq_file *m)
|
||||
{
|
||||
return m->count == m->size;
|
||||
}
|
||||
|
||||
/**
|
||||
* seq_get_buf - get buffer to write arbitrary data to
|
||||
* @m: the seq_file handle
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ struct iov_iter {
|
|||
size_t count;
|
||||
union {
|
||||
const struct iovec *iov;
|
||||
const struct kvec *kvec;
|
||||
const struct bio_vec *bvec;
|
||||
};
|
||||
unsigned long nr_segs;
|
||||
|
|
@ -82,10 +83,13 @@ size_t copy_page_from_iter(struct page *page, size_t offset, size_t bytes,
|
|||
struct iov_iter *i);
|
||||
size_t copy_to_iter(void *addr, size_t bytes, struct iov_iter *i);
|
||||
size_t copy_from_iter(void *addr, size_t bytes, struct iov_iter *i);
|
||||
size_t copy_from_iter_nocache(void *addr, size_t bytes, struct iov_iter *i);
|
||||
size_t iov_iter_zero(size_t bytes, struct iov_iter *);
|
||||
unsigned long iov_iter_alignment(const struct iov_iter *i);
|
||||
void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov,
|
||||
unsigned long nr_segs, size_t count);
|
||||
void iov_iter_kvec(struct iov_iter *i, int direction, const struct kvec *iov,
|
||||
unsigned long nr_segs, size_t count);
|
||||
ssize_t iov_iter_get_pages(struct iov_iter *i, struct page **pages,
|
||||
size_t maxsize, unsigned maxpages, size_t *start);
|
||||
ssize_t iov_iter_get_pages_alloc(struct iov_iter *i, struct page ***pages,
|
||||
|
|
@ -123,6 +127,8 @@ static inline void iov_iter_reexpand(struct iov_iter *i, size_t count)
|
|||
{
|
||||
i->count = count;
|
||||
}
|
||||
size_t csum_and_copy_to_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
|
||||
size_t csum_and_copy_from_iter(void *addr, size_t bytes, __wsum *csum, struct iov_iter *i);
|
||||
|
||||
int memcpy_fromiovec(unsigned char *kdata, struct iovec *iov, int len);
|
||||
int memcpy_toiovec(struct iovec *iov, unsigned char *kdata, int len);
|
||||
|
|
|
|||
Loading…
Reference in a new issue