mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-06 06:21:31 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull vfs updates from Al Viro: "All kinds of stuff this time around; some more notable parts: - RCU'd vfsmounts handling - new primitives for coredump handling - files_lock is gone - Bruce's delegations handling series - exportfs fixes plus misc stuff all over the place" * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (101 commits) ecryptfs: ->f_op is never NULL locks: break delegations on any attribute modification locks: break delegations on link locks: break delegations on rename locks: helper functions for delegation breaking locks: break delegations on unlink namei: minor vfs_unlink cleanup locks: implement delegations locks: introduce new FL_DELEG lock flag vfs: take i_mutex on renamed file vfs: rename I_MUTEX_QUOTA now that it's not used for quotas vfs: don't use PARENT/CHILD lock classes for non-directories vfs: pull ext4's double-i_mutex-locking into common code exportfs: fix quadratic behavior in filehandle lookup exportfs: better variable name exportfs: move most of reconnect_path to helper function exportfs: eliminate unused "noprogress" counter exportfs: stop retrying once we race with rename/remove exportfs: clear DISCONNECTED on all parents sooner exportfs: more detailed comment for path_reconnect ...
This commit is contained in:
commit
9bc9ccd7db
159 changed files with 2114 additions and 2506 deletions
|
@ -623,10 +623,13 @@ static inline int inode_unhashed(struct inode *inode)
|
|||
* 0: the object of the current VFS operation
|
||||
* 1: parent
|
||||
* 2: child/target
|
||||
* 3: quota file
|
||||
* 3: xattr
|
||||
* 4: second non-directory
|
||||
* The last is for certain operations (such as rename) which lock two
|
||||
* non-directories at once.
|
||||
*
|
||||
* The locking order between these classes is
|
||||
* parent -> child -> normal -> xattr -> quota
|
||||
* parent -> child -> normal -> xattr -> second non-directory
|
||||
*/
|
||||
enum inode_i_mutex_lock_class
|
||||
{
|
||||
|
@ -634,9 +637,12 @@ enum inode_i_mutex_lock_class
|
|||
I_MUTEX_PARENT,
|
||||
I_MUTEX_CHILD,
|
||||
I_MUTEX_XATTR,
|
||||
I_MUTEX_QUOTA
|
||||
I_MUTEX_NONDIR2
|
||||
};
|
||||
|
||||
void lock_two_nondirectories(struct inode *, struct inode*);
|
||||
void unlock_two_nondirectories(struct inode *, struct inode*);
|
||||
|
||||
/*
|
||||
* NOTE: in a 32bit arch with a preemptable kernel and
|
||||
* an UP compile the i_size_read/write must be atomic
|
||||
|
@ -764,12 +770,7 @@ static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index)
|
|||
#define FILE_MNT_WRITE_RELEASED 2
|
||||
|
||||
struct file {
|
||||
/*
|
||||
* fu_list becomes invalid after file_free is called and queued via
|
||||
* fu_rcuhead for RCU freeing
|
||||
*/
|
||||
union {
|
||||
struct list_head fu_list;
|
||||
struct llist_node fu_llist;
|
||||
struct rcu_head fu_rcuhead;
|
||||
} f_u;
|
||||
|
@ -783,9 +784,6 @@ struct file {
|
|||
* Must not be taken from IRQ context.
|
||||
*/
|
||||
spinlock_t f_lock;
|
||||
#ifdef CONFIG_SMP
|
||||
int f_sb_list_cpu;
|
||||
#endif
|
||||
atomic_long_t f_count;
|
||||
unsigned int f_flags;
|
||||
fmode_t f_mode;
|
||||
|
@ -882,6 +880,7 @@ static inline int file_check_writeable(struct file *filp)
|
|||
|
||||
#define FL_POSIX 1
|
||||
#define FL_FLOCK 2
|
||||
#define FL_DELEG 4 /* NFSv4 delegation */
|
||||
#define FL_ACCESS 8 /* not trying to lock, just looking */
|
||||
#define FL_EXISTS 16 /* when unlocking, test for existence */
|
||||
#define FL_LEASE 32 /* lease held on this file */
|
||||
|
@ -1023,7 +1022,7 @@ extern int vfs_test_lock(struct file *, struct file_lock *);
|
|||
extern int vfs_lock_file(struct file *, unsigned int, struct file_lock *, struct file_lock *);
|
||||
extern int vfs_cancel_lock(struct file *filp, struct file_lock *fl);
|
||||
extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl);
|
||||
extern int __break_lease(struct inode *inode, unsigned int flags);
|
||||
extern int __break_lease(struct inode *inode, unsigned int flags, unsigned int type);
|
||||
extern void lease_get_mtime(struct inode *, struct timespec *time);
|
||||
extern int generic_setlease(struct file *, long, struct file_lock **);
|
||||
extern int vfs_setlease(struct file *, long, struct file_lock **);
|
||||
|
@ -1132,7 +1131,7 @@ static inline int flock_lock_file_wait(struct file *filp,
|
|||
return -ENOLCK;
|
||||
}
|
||||
|
||||
static inline int __break_lease(struct inode *inode, unsigned int mode)
|
||||
static inline int __break_lease(struct inode *inode, unsigned int mode, unsigned int type)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -1264,11 +1263,6 @@ struct super_block {
|
|||
|
||||
struct list_head s_inodes; /* all inodes */
|
||||
struct hlist_bl_head s_anon; /* anonymous dentries for (nfs) exporting */
|
||||
#ifdef CONFIG_SMP
|
||||
struct list_head __percpu *s_files;
|
||||
#else
|
||||
struct list_head s_files;
|
||||
#endif
|
||||
struct list_head s_mounts; /* list of mounts; _not_ for fs use */
|
||||
struct block_device *s_bdev;
|
||||
struct backing_dev_info *s_bdi;
|
||||
|
@ -1330,6 +1324,7 @@ struct super_block {
|
|||
*/
|
||||
struct list_lru s_dentry_lru ____cacheline_aligned_in_smp;
|
||||
struct list_lru s_inode_lru ____cacheline_aligned_in_smp;
|
||||
struct rcu_head rcu;
|
||||
};
|
||||
|
||||
extern struct timespec current_fs_time(struct super_block *sb);
|
||||
|
@ -1458,10 +1453,10 @@ extern int vfs_create(struct inode *, struct dentry *, umode_t, bool);
|
|||
extern int vfs_mkdir(struct inode *, struct dentry *, umode_t);
|
||||
extern int vfs_mknod(struct inode *, struct dentry *, umode_t, dev_t);
|
||||
extern int vfs_symlink(struct inode *, struct dentry *, const char *);
|
||||
extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
|
||||
extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct inode **);
|
||||
extern int vfs_rmdir(struct inode *, struct dentry *);
|
||||
extern int vfs_unlink(struct inode *, struct dentry *);
|
||||
extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
|
||||
extern int vfs_unlink(struct inode *, struct dentry *, struct inode **);
|
||||
extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **);
|
||||
|
||||
/*
|
||||
* VFS dentry helper functions.
|
||||
|
@ -1875,6 +1870,17 @@ extern struct dentry *mount_pseudo(struct file_system_type *, char *,
|
|||
(((fops) && try_module_get((fops)->owner) ? (fops) : NULL))
|
||||
#define fops_put(fops) \
|
||||
do { if (fops) module_put((fops)->owner); } while(0)
|
||||
/*
|
||||
* This one is to be used *ONLY* from ->open() instances.
|
||||
* fops must be non-NULL, pinned down *and* module dependencies
|
||||
* should be sufficient to pin the caller down as well.
|
||||
*/
|
||||
#define replace_fops(f, fops) \
|
||||
do { \
|
||||
struct file *__file = (f); \
|
||||
fops_put(__file->f_op); \
|
||||
BUG_ON(!(__file->f_op = (fops))); \
|
||||
} while(0)
|
||||
|
||||
extern int register_filesystem(struct file_system_type *);
|
||||
extern int unregister_filesystem(struct file_system_type *);
|
||||
|
@ -1899,6 +1905,9 @@ extern bool fs_fully_visible(struct file_system_type *);
|
|||
|
||||
extern int current_umask(void);
|
||||
|
||||
extern void ihold(struct inode * inode);
|
||||
extern void iput(struct inode *);
|
||||
|
||||
/* /sys/fs */
|
||||
extern struct kobject *fs_kobj;
|
||||
|
||||
|
@ -1955,9 +1964,39 @@ static inline int locks_verify_truncate(struct inode *inode,
|
|||
static inline int break_lease(struct inode *inode, unsigned int mode)
|
||||
{
|
||||
if (inode->i_flock)
|
||||
return __break_lease(inode, mode);
|
||||
return __break_lease(inode, mode, FL_LEASE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int break_deleg(struct inode *inode, unsigned int mode)
|
||||
{
|
||||
if (inode->i_flock)
|
||||
return __break_lease(inode, mode, FL_DELEG);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int try_break_deleg(struct inode *inode, struct inode **delegated_inode)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = break_deleg(inode, O_WRONLY|O_NONBLOCK);
|
||||
if (ret == -EWOULDBLOCK && delegated_inode) {
|
||||
*delegated_inode = inode;
|
||||
ihold(inode);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int break_deleg_wait(struct inode **delegated_inode)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = break_deleg(*delegated_inode, O_WRONLY);
|
||||
iput(*delegated_inode);
|
||||
*delegated_inode = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
#else /* !CONFIG_FILE_LOCKING */
|
||||
static inline int locks_mandatory_locked(struct inode *inode)
|
||||
{
|
||||
|
@ -1997,6 +2036,22 @@ static inline int break_lease(struct inode *inode, unsigned int mode)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int break_deleg(struct inode *inode, unsigned int mode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int try_break_deleg(struct inode *inode, struct inode **delegated_inode)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int break_deleg_wait(struct inode **delegated_inode)
|
||||
{
|
||||
BUG();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_FILE_LOCKING */
|
||||
|
||||
/* fs/open.c */
|
||||
|
@ -2223,7 +2278,7 @@ extern void emergency_remount(void);
|
|||
#ifdef CONFIG_BLOCK
|
||||
extern sector_t bmap(struct inode *, sector_t);
|
||||
#endif
|
||||
extern int notify_change(struct dentry *, struct iattr *);
|
||||
extern int notify_change(struct dentry *, struct iattr *, struct inode **);
|
||||
extern int inode_permission(struct inode *, int);
|
||||
extern int generic_permission(struct inode *, int);
|
||||
|
||||
|
@ -2337,8 +2392,6 @@ extern loff_t vfs_llseek(struct file *file, loff_t offset, int whence);
|
|||
extern int inode_init_always(struct super_block *, struct inode *);
|
||||
extern void inode_init_once(struct inode *);
|
||||
extern void address_space_init_once(struct address_space *mapping);
|
||||
extern void ihold(struct inode * inode);
|
||||
extern void iput(struct inode *);
|
||||
extern struct inode * igrab(struct inode *);
|
||||
extern ino_t iunique(struct super_block *, ino_t);
|
||||
extern int inode_needs_sync(struct inode *inode);
|
||||
|
@ -2507,8 +2560,10 @@ extern int __page_symlink(struct inode *inode, const char *symname, int len,
|
|||
int nofs);
|
||||
extern int page_symlink(struct inode *inode, const char *symname, int len);
|
||||
extern const struct inode_operations page_symlink_inode_operations;
|
||||
extern void kfree_put_link(struct dentry *, struct nameidata *, void *);
|
||||
extern int generic_readlink(struct dentry *, char __user *, int);
|
||||
extern void generic_fillattr(struct inode *, struct kstat *);
|
||||
int vfs_getattr_nosec(struct path *path, struct kstat *stat);
|
||||
extern int vfs_getattr(struct path *, struct kstat *);
|
||||
void __inode_add_bytes(struct inode *inode, loff_t bytes);
|
||||
void inode_add_bytes(struct inode *inode, loff_t bytes);
|
||||
|
@ -2567,6 +2622,7 @@ extern int simple_write_begin(struct file *file, struct address_space *mapping,
|
|||
extern int simple_write_end(struct file *file, struct address_space *mapping,
|
||||
loff_t pos, unsigned len, unsigned copied,
|
||||
struct page *page, void *fsdata);
|
||||
extern struct inode *alloc_anon_inode(struct super_block *);
|
||||
|
||||
extern struct dentry *simple_lookup(struct inode *, struct dentry *, unsigned int flags);
|
||||
extern ssize_t generic_read_dir(struct file *, char __user *, size_t, loff_t *);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue