You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs pile (part one) from Al Viro: "Assorted stuff - cleaning namei.c up a bit, fixing ->d_name/->d_parent locking violations, etc. The most visible changes here are death of FS_REVAL_DOT (replaced with "has ->d_weak_revalidate()") and a new helper getting from struct file to inode. Some bits of preparation to xattr method interface changes. Misc patches by various people sent this cycle *and* ocfs2 fixes from several cycles ago that should've been upstream right then. PS: the next vfs pile will be xattr stuff." * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (46 commits) saner proc_get_inode() calling conventions proc: avoid extra pde_put() in proc_fill_super() fs: change return values from -EACCES to -EPERM fs/exec.c: make bprm_mm_init() static ocfs2/dlm: use GFP_ATOMIC inside a spin_lock ocfs2: fix possible use-after-free with AIO ocfs2: Fix oops in ocfs2_fast_symlink_readpage() code path get_empty_filp()/alloc_file() leave both ->f_pos and ->f_version zero target: writev() on single-element vector is pointless export kernel_write(), convert open-coded instances fs: encode_fh: return FILEID_INVALID if invalid fid_type kill f_vfsmnt vfs: kill FS_REVAL_DOT by adding a d_weak_revalidate dentry op nfsd: handle vfs_getattr errors in acl protocol switch vfs_getattr() to struct path default SET_PERSONALITY() in linux/elf.h ceph: prepopulate inodes only when request is aborted d_hash_and_lookup(): export, switch open-coded instances 9p: switch v9fs_set_create_acl() to inode+fid, do it before d_instantiate() 9p: split dropping the acls from v9fs_set_create_acl() ...
This commit is contained in:
@@ -10,6 +10,7 @@ be able to use diff(1).
|
||||
--------------------------- dentry_operations --------------------------
|
||||
prototypes:
|
||||
int (*d_revalidate)(struct dentry *, unsigned int);
|
||||
int (*d_weak_revalidate)(struct dentry *, unsigned int);
|
||||
int (*d_hash)(const struct dentry *, const struct inode *,
|
||||
struct qstr *);
|
||||
int (*d_compare)(const struct dentry *, const struct inode *,
|
||||
@@ -25,6 +26,7 @@ prototypes:
|
||||
locking rules:
|
||||
rename_lock ->d_lock may block rcu-walk
|
||||
d_revalidate: no no yes (ref-walk) maybe
|
||||
d_weak_revalidate:no no yes no
|
||||
d_hash no no no maybe
|
||||
d_compare: yes no no maybe
|
||||
d_delete: no yes no no
|
||||
|
||||
@@ -441,3 +441,7 @@ d_make_root() drops the reference to inode if dentry allocation fails.
|
||||
two, it gets "is it an O_EXCL or equivalent?" boolean argument. Note that
|
||||
local filesystems can ignore tha argument - they are guaranteed that the
|
||||
object doesn't exist. It's remote/distributed ones that might care...
|
||||
--
|
||||
[mandatory]
|
||||
FS_REVAL_DOT is gone; if you used to have it, add ->d_weak_revalidate()
|
||||
in your dentry operations instead.
|
||||
|
||||
@@ -900,6 +900,7 @@ defined:
|
||||
|
||||
struct dentry_operations {
|
||||
int (*d_revalidate)(struct dentry *, unsigned int);
|
||||
int (*d_weak_revalidate)(struct dentry *, unsigned int);
|
||||
int (*d_hash)(const struct dentry *, const struct inode *,
|
||||
struct qstr *);
|
||||
int (*d_compare)(const struct dentry *, const struct inode *,
|
||||
@@ -915,8 +916,13 @@ struct dentry_operations {
|
||||
|
||||
d_revalidate: called when the VFS needs to revalidate a dentry. This
|
||||
is called whenever a name look-up finds a dentry in the
|
||||
dcache. Most filesystems leave this as NULL, because all their
|
||||
dentries in the dcache are valid
|
||||
dcache. Most local filesystems leave this as NULL, because all their
|
||||
dentries in the dcache are valid. Network filesystems are different
|
||||
since things can change on the server without the client necessarily
|
||||
being aware of it.
|
||||
|
||||
This function should return a positive value if the dentry is still
|
||||
valid, and zero or a negative error code if it isn't.
|
||||
|
||||
d_revalidate may be called in rcu-walk mode (flags & LOOKUP_RCU).
|
||||
If in rcu-walk mode, the filesystem must revalidate the dentry without
|
||||
@@ -927,6 +933,20 @@ struct dentry_operations {
|
||||
If a situation is encountered that rcu-walk cannot handle, return
|
||||
-ECHILD and it will be called again in ref-walk mode.
|
||||
|
||||
d_weak_revalidate: called when the VFS needs to revalidate a "jumped" dentry.
|
||||
This is called when a path-walk ends at dentry that was not acquired by
|
||||
doing a lookup in the parent directory. This includes "/", "." and "..",
|
||||
as well as procfs-style symlinks and mountpoint traversal.
|
||||
|
||||
In this case, we are less concerned with whether the dentry is still
|
||||
fully correct, but rather that the inode is still valid. As with
|
||||
d_revalidate, most local filesystems will set this to NULL since their
|
||||
dcache entries are always valid.
|
||||
|
||||
This function has the same return code semantics as d_revalidate.
|
||||
|
||||
d_weak_revalidate is only called after leaving rcu-walk mode.
|
||||
|
||||
d_hash: called when the VFS adds a dentry to the hash table. The first
|
||||
dentry passed to d_hash is the parent directory that the name is
|
||||
to be hashed into. The inode is the dentry's inode.
|
||||
|
||||
@@ -111,7 +111,7 @@ static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,
|
||||
size_t count, loff_t *pos)
|
||||
{
|
||||
int res;
|
||||
srm_env_t *entry = PDE(file->f_path.dentry->d_inode)->data;
|
||||
srm_env_t *entry = PDE(file_inode(file))->data;
|
||||
char *buf = (char *) __get_free_page(GFP_USER);
|
||||
unsigned long ret1, ret2;
|
||||
|
||||
|
||||
@@ -102,7 +102,4 @@ typedef struct user_fpu_struct elf_fpregset_t;
|
||||
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX_32BIT | (current->personality & (~PER_MASK)))
|
||||
|
||||
#endif /* __ASM_AVR32_ELF_H */
|
||||
|
||||
@@ -132,7 +132,4 @@ do { \
|
||||
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
|
||||
#endif
|
||||
|
||||
@@ -116,7 +116,7 @@ static const struct seq_operations cplbinfo_sops = {
|
||||
|
||||
static int cplbinfo_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
struct proc_dir_entry *pde = PDE(file->f_path.dentry->d_inode);
|
||||
struct proc_dir_entry *pde = PDE(file_inode(file));
|
||||
char cplb_type;
|
||||
unsigned int cpu;
|
||||
int ret;
|
||||
|
||||
@@ -77,9 +77,6 @@ do { \
|
||||
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
|
||||
/* C6X specific section types */
|
||||
#define SHT_C6000_UNWIND 0x70000001
|
||||
#define SHT_C6000_PREEMPTMAP 0x70000002
|
||||
|
||||
@@ -654,7 +654,7 @@ static int sync_serial_release(struct inode *inode, struct file *file)
|
||||
|
||||
static unsigned int sync_serial_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
int dev = MINOR(file->f_dentry->d_inode->i_rdev);
|
||||
int dev = MINOR(file_inode(file)->i_rdev);
|
||||
unsigned int mask = 0;
|
||||
struct sync_port *port;
|
||||
DEBUGPOLL(static unsigned int prev_mask = 0);
|
||||
@@ -685,7 +685,7 @@ static int sync_serial_ioctl_unlocked(struct file *file,
|
||||
int return_val = 0;
|
||||
unsigned long flags;
|
||||
|
||||
int dev = MINOR(file->f_dentry->d_inode->i_rdev);
|
||||
int dev = MINOR(file_inode(file)->i_rdev);
|
||||
struct sync_port *port;
|
||||
|
||||
if (dev < 0 || dev >= NUMBER_OF_PORTS || !ports[dev].enabled) {
|
||||
@@ -973,7 +973,7 @@ static long sync_serial_ioctl(struct file *file,
|
||||
static ssize_t sync_serial_write(struct file *file, const char *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
int dev = MINOR(file->f_dentry->d_inode->i_rdev);
|
||||
int dev = MINOR(file_inode(file)->i_rdev);
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
struct sync_port *port;
|
||||
unsigned long flags;
|
||||
@@ -1097,7 +1097,7 @@ static ssize_t sync_serial_write(struct file *file, const char *buf,
|
||||
static ssize_t sync_serial_read(struct file *file, char *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
int dev = MINOR(file->f_dentry->d_inode->i_rdev);
|
||||
int dev = MINOR(file_inode(file)->i_rdev);
|
||||
int avail;
|
||||
struct sync_port *port;
|
||||
unsigned char *start;
|
||||
|
||||
@@ -3135,11 +3135,10 @@ static long cryptocop_ioctl_unlocked(struct inode *inode,
|
||||
static long
|
||||
cryptocop_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
long ret;
|
||||
|
||||
mutex_lock(&cryptocop_mutex);
|
||||
ret = cryptocop_ioctl_unlocked(inode, filp, cmd, arg);
|
||||
ret = cryptocop_ioctl_unlocked(file_inode(filp), filp, cmd, arg);
|
||||
mutex_unlock(&cryptocop_mutex);
|
||||
|
||||
return ret;
|
||||
|
||||
@@ -609,7 +609,7 @@ static int sync_serial_release(struct inode *inode, struct file *file)
|
||||
|
||||
static unsigned int sync_serial_poll(struct file *file, poll_table *wait)
|
||||
{
|
||||
int dev = iminor(file->f_path.dentry->d_inode);
|
||||
int dev = iminor(file_inode(file));
|
||||
unsigned int mask = 0;
|
||||
sync_port *port;
|
||||
DEBUGPOLL( static unsigned int prev_mask = 0; );
|
||||
@@ -657,7 +657,7 @@ static int sync_serial_ioctl(struct file *file,
|
||||
{
|
||||
int return_val = 0;
|
||||
int dma_w_size = regk_dma_set_w_size1;
|
||||
int dev = iminor(file->f_path.dentry->d_inode);
|
||||
int dev = iminor(file_inode(file));
|
||||
sync_port *port;
|
||||
reg_sser_rw_tr_cfg tr_cfg;
|
||||
reg_sser_rw_rec_cfg rec_cfg;
|
||||
@@ -979,7 +979,7 @@ static long sync_serial_ioctl(struct file *file,
|
||||
static ssize_t sync_serial_write(struct file *file, const char *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
int dev = iminor(file->f_path.dentry->d_inode);
|
||||
int dev = iminor(file_inode(file));
|
||||
DECLARE_WAITQUEUE(wait, current);
|
||||
struct sync_port *port;
|
||||
int trunc_count;
|
||||
@@ -1102,7 +1102,7 @@ static ssize_t sync_serial_write(struct file *file, const char *buf,
|
||||
static ssize_t sync_serial_read(struct file * file, char * buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
int dev = iminor(file->f_path.dentry->d_inode);
|
||||
int dev = iminor(file_inode(file));
|
||||
int avail;
|
||||
sync_port *port;
|
||||
unsigned char* start;
|
||||
|
||||
@@ -86,7 +86,4 @@ typedef unsigned long elf_fpregset_t;
|
||||
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
|
||||
#endif
|
||||
|
||||
@@ -137,7 +137,4 @@ do { \
|
||||
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
|
||||
#endif
|
||||
|
||||
@@ -54,9 +54,6 @@ typedef unsigned long elf_fpregset_t;
|
||||
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
|
||||
#define R_H8_NONE 0
|
||||
#define R_H8_DIR32 1
|
||||
#define R_H8_DIR32_28 2
|
||||
|
||||
@@ -216,11 +216,6 @@ do { \
|
||||
*/
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
#endif
|
||||
|
||||
#define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1
|
||||
struct linux_binprm;
|
||||
extern int arch_setup_additional_pages(struct linux_binprm *bprm,
|
||||
|
||||
@@ -201,9 +201,6 @@ extern void ia64_elf_core_copy_regs (struct pt_regs *src, elf_gregset_t dst);
|
||||
relevant until we have real hardware to play with... */
|
||||
#define ELF_PLATFORM NULL
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality((current->personality & ~PER_MASK) | PER_LINUX)
|
||||
|
||||
#define elf_read_implies_exec(ex, executable_stack) \
|
||||
((executable_stack!=EXSTACK_DISABLE_X) && ((ex).e_flags & EF_IA_64_LINUX_EXECUTABLE_STACK) != 0)
|
||||
|
||||
|
||||
@@ -2221,9 +2221,9 @@ pfm_alloc_file(pfm_context_t *ctx)
|
||||
d_add(path.dentry, inode);
|
||||
|
||||
file = alloc_file(&path, FMODE_READ, &pfm_file_ops);
|
||||
if (!file) {
|
||||
if (IS_ERR(file)) {
|
||||
path_put(&path);
|
||||
return ERR_PTR(-ENFILE);
|
||||
return file;
|
||||
}
|
||||
|
||||
file->f_flags = O_RDONLY;
|
||||
|
||||
@@ -301,7 +301,7 @@ salinfo_event_open(struct inode *inode, struct file *file)
|
||||
static ssize_t
|
||||
salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct proc_dir_entry *entry = PDE(inode);
|
||||
struct salinfo_data *data = entry->data;
|
||||
char cmd[32];
|
||||
@@ -463,7 +463,7 @@ retry:
|
||||
static ssize_t
|
||||
salinfo_log_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct proc_dir_entry *entry = PDE(inode);
|
||||
struct salinfo_data *data = entry->data;
|
||||
u8 *buf;
|
||||
@@ -524,7 +524,7 @@ salinfo_log_clear(struct salinfo_data *data, int cpu)
|
||||
static ssize_t
|
||||
salinfo_log_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
|
||||
{
|
||||
struct inode *inode = file->f_path.dentry->d_inode;
|
||||
struct inode *inode = file_inode(file);
|
||||
struct proc_dir_entry *entry = PDE(inode);
|
||||
struct salinfo_data *data = entry->data;
|
||||
char cmd[32];
|
||||
|
||||
@@ -128,7 +128,4 @@ typedef elf_fpreg_t elf_fpregset_t;
|
||||
intent than poking at uname or /proc/cpuinfo. */
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
|
||||
#endif /* _ASM_M32R__ELF_H */
|
||||
|
||||
@@ -113,7 +113,4 @@ typedef struct user_m68kfp_struct elf_fpregset_t;
|
||||
|
||||
#define ELF_PLATFORM (NULL)
|
||||
|
||||
#define SET_PERSONALITY(ex) \
|
||||
set_personality(PER_LINUX | (current->personality & (~PER_MASK)))
|
||||
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user