diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/efi.h | 7 | ||||
-rw-r--r-- | include/linux/file.h | 1 | ||||
-rw-r--r-- | include/linux/fs.h | 52 | ||||
-rw-r--r-- | include/linux/irqflags.h | 6 | ||||
-rw-r--r-- | include/linux/list.h | 48 | ||||
-rw-r--r-- | include/linux/mount.h | 11 | ||||
-rw-r--r-- | include/linux/prctl.h | 6 |
7 files changed, 94 insertions, 37 deletions
diff --git a/include/linux/efi.h b/include/linux/efi.h index 14813b595802..a5f359a7ad0e 100644 --- a/include/linux/efi.h +++ b/include/linux/efi.h | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/proc_fs.h> | 18 | #include <linux/proc_fs.h> |
19 | #include <linux/rtc.h> | 19 | #include <linux/rtc.h> |
20 | #include <linux/ioport.h> | 20 | #include <linux/ioport.h> |
21 | #include <linux/pfn.h> | ||
21 | 22 | ||
22 | #include <asm/page.h> | 23 | #include <asm/page.h> |
23 | #include <asm/system.h> | 24 | #include <asm/system.h> |
@@ -394,4 +395,10 @@ struct efi_generic_dev_path { | |||
394 | u16 length; | 395 | u16 length; |
395 | } __attribute ((packed)); | 396 | } __attribute ((packed)); |
396 | 397 | ||
398 | static inline void memrange_efi_to_native(u64 *addr, u64 *npages) | ||
399 | { | ||
400 | *npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr); | ||
401 | *addr &= PAGE_MASK; | ||
402 | } | ||
403 | |||
397 | #endif /* _LINUX_EFI_H */ | 404 | #endif /* _LINUX_EFI_H */ |
diff --git a/include/linux/file.h b/include/linux/file.h index 7239baac81a9..653477021e4c 100644 --- a/include/linux/file.h +++ b/include/linux/file.h | |||
@@ -61,6 +61,7 @@ extern struct kmem_cache *filp_cachep; | |||
61 | 61 | ||
62 | extern void __fput(struct file *); | 62 | extern void __fput(struct file *); |
63 | extern void fput(struct file *); | 63 | extern void fput(struct file *); |
64 | extern void drop_file_write_access(struct file *file); | ||
64 | 65 | ||
65 | struct file_operations; | 66 | struct file_operations; |
66 | struct vfsmount; | 67 | struct vfsmount; |
diff --git a/include/linux/fs.h b/include/linux/fs.h index b84b848431f2..d1eeea669d2c 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -776,6 +776,9 @@ static inline int ra_has_index(struct file_ra_state *ra, pgoff_t index) | |||
776 | index < ra->start + ra->size); | 776 | index < ra->start + ra->size); |
777 | } | 777 | } |
778 | 778 | ||
779 | #define FILE_MNT_WRITE_TAKEN 1 | ||
780 | #define FILE_MNT_WRITE_RELEASED 2 | ||
781 | |||
779 | struct file { | 782 | struct file { |
780 | /* | 783 | /* |
781 | * fu_list becomes invalid after file_free is called and queued via | 784 | * fu_list becomes invalid after file_free is called and queued via |
@@ -810,6 +813,9 @@ struct file { | |||
810 | spinlock_t f_ep_lock; | 813 | spinlock_t f_ep_lock; |
811 | #endif /* #ifdef CONFIG_EPOLL */ | 814 | #endif /* #ifdef CONFIG_EPOLL */ |
812 | struct address_space *f_mapping; | 815 | struct address_space *f_mapping; |
816 | #ifdef CONFIG_DEBUG_WRITECOUNT | ||
817 | unsigned long f_mnt_write_state; | ||
818 | #endif | ||
813 | }; | 819 | }; |
814 | extern spinlock_t files_lock; | 820 | extern spinlock_t files_lock; |
815 | #define file_list_lock() spin_lock(&files_lock); | 821 | #define file_list_lock() spin_lock(&files_lock); |
@@ -818,6 +824,49 @@ extern spinlock_t files_lock; | |||
818 | #define get_file(x) atomic_inc(&(x)->f_count) | 824 | #define get_file(x) atomic_inc(&(x)->f_count) |
819 | #define file_count(x) atomic_read(&(x)->f_count) | 825 | #define file_count(x) atomic_read(&(x)->f_count) |
820 | 826 | ||
827 | #ifdef CONFIG_DEBUG_WRITECOUNT | ||
828 | static inline void file_take_write(struct file *f) | ||
829 | { | ||
830 | WARN_ON(f->f_mnt_write_state != 0); | ||
831 | f->f_mnt_write_state = FILE_MNT_WRITE_TAKEN; | ||
832 | } | ||
833 | static inline void file_release_write(struct file *f) | ||
834 | { | ||
835 | f->f_mnt_write_state |= FILE_MNT_WRITE_RELEASED; | ||
836 | } | ||
837 | static inline void file_reset_write(struct file *f) | ||
838 | { | ||
839 | f->f_mnt_write_state = 0; | ||
840 | } | ||
841 | static inline void file_check_state(struct file *f) | ||
842 | { | ||
843 | /* | ||
844 | * At this point, either both or neither of these bits | ||
845 | * should be set. | ||
846 | */ | ||
847 | WARN_ON(f->f_mnt_write_state == FILE_MNT_WRITE_TAKEN); | ||
848 | WARN_ON(f->f_mnt_write_state == FILE_MNT_WRITE_RELEASED); | ||
849 | } | ||
850 | static inline int file_check_writeable(struct file *f) | ||
851 | { | ||
852 | if (f->f_mnt_write_state == FILE_MNT_WRITE_TAKEN) | ||
853 | return 0; | ||
854 | printk(KERN_WARNING "writeable file with no " | ||
855 | "mnt_want_write()\n"); | ||
856 | WARN_ON(1); | ||
857 | return -EINVAL; | ||
858 | } | ||
859 | #else /* !CONFIG_DEBUG_WRITECOUNT */ | ||
860 | static inline void file_take_write(struct file *filp) {} | ||
861 | static inline void file_release_write(struct file *filp) {} | ||
862 | static inline void file_reset_write(struct file *filp) {} | ||
863 | static inline void file_check_state(struct file *filp) {} | ||
864 | static inline int file_check_writeable(struct file *filp) | ||
865 | { | ||
866 | return 0; | ||
867 | } | ||
868 | #endif /* CONFIG_DEBUG_WRITECOUNT */ | ||
869 | |||
821 | #define MAX_NON_LFS ((1UL<<31) - 1) | 870 | #define MAX_NON_LFS ((1UL<<31) - 1) |
822 | 871 | ||
823 | /* Page cache limit. The filesystems should put that into their s_maxbytes | 872 | /* Page cache limit. The filesystems should put that into their s_maxbytes |
@@ -1735,7 +1784,8 @@ extern struct file *create_read_pipe(struct file *f); | |||
1735 | extern struct file *create_write_pipe(void); | 1784 | extern struct file *create_write_pipe(void); |
1736 | extern void free_write_pipe(struct file *); | 1785 | extern void free_write_pipe(struct file *); |
1737 | 1786 | ||
1738 | extern int open_namei(int dfd, const char *, int, int, struct nameidata *); | 1787 | extern struct file *do_filp_open(int dfd, const char *pathname, |
1788 | int open_flag, int mode); | ||
1739 | extern int may_open(struct nameidata *, int, int); | 1789 | extern int may_open(struct nameidata *, int, int); |
1740 | 1790 | ||
1741 | extern int kernel_read(struct file *, unsigned long, char *, unsigned long); | 1791 | extern int kernel_read(struct file *, unsigned long, char *, unsigned long); |
diff --git a/include/linux/irqflags.h b/include/linux/irqflags.h index 412e025bc5c7..e600c4e9b8c5 100644 --- a/include/linux/irqflags.h +++ b/include/linux/irqflags.h | |||
@@ -84,10 +84,10 @@ | |||
84 | 84 | ||
85 | #define irqs_disabled() \ | 85 | #define irqs_disabled() \ |
86 | ({ \ | 86 | ({ \ |
87 | unsigned long flags; \ | 87 | unsigned long _flags; \ |
88 | \ | 88 | \ |
89 | raw_local_save_flags(flags); \ | 89 | raw_local_save_flags(_flags); \ |
90 | raw_irqs_disabled_flags(flags); \ | 90 | raw_irqs_disabled_flags(_flags); \ |
91 | }) | 91 | }) |
92 | 92 | ||
93 | #define irqs_disabled_flags(flags) raw_irqs_disabled_flags(flags) | 93 | #define irqs_disabled_flags(flags) raw_irqs_disabled_flags(flags) |
diff --git a/include/linux/list.h b/include/linux/list.h index 75ce2cb4ff6e..dac16f99c701 100644 --- a/include/linux/list.h +++ b/include/linux/list.h | |||
@@ -631,31 +631,14 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
631 | * as long as the traversal is guarded by rcu_read_lock(). | 631 | * as long as the traversal is guarded by rcu_read_lock(). |
632 | */ | 632 | */ |
633 | #define list_for_each_rcu(pos, head) \ | 633 | #define list_for_each_rcu(pos, head) \ |
634 | for (pos = (head)->next; \ | 634 | for (pos = rcu_dereference((head)->next); \ |
635 | prefetch(rcu_dereference(pos)->next), pos != (head); \ | 635 | prefetch(pos->next), pos != (head); \ |
636 | pos = pos->next) | 636 | pos = rcu_dereference(pos->next)) |
637 | 637 | ||
638 | #define __list_for_each_rcu(pos, head) \ | 638 | #define __list_for_each_rcu(pos, head) \ |
639 | for (pos = (head)->next; \ | 639 | for (pos = rcu_dereference((head)->next); \ |
640 | rcu_dereference(pos) != (head); \ | 640 | pos != (head); \ |
641 | pos = pos->next) | 641 | pos = rcu_dereference(pos->next)) |
642 | |||
643 | /** | ||
644 | * list_for_each_safe_rcu | ||
645 | * @pos: the &struct list_head to use as a loop cursor. | ||
646 | * @n: another &struct list_head to use as temporary storage | ||
647 | * @head: the head for your list. | ||
648 | * | ||
649 | * Iterate over an rcu-protected list, safe against removal of list entry. | ||
650 | * | ||
651 | * This list-traversal primitive may safely run concurrently with | ||
652 | * the _rcu list-mutation primitives such as list_add_rcu() | ||
653 | * as long as the traversal is guarded by rcu_read_lock(). | ||
654 | */ | ||
655 | #define list_for_each_safe_rcu(pos, n, head) \ | ||
656 | for (pos = (head)->next; \ | ||
657 | n = rcu_dereference(pos)->next, pos != (head); \ | ||
658 | pos = n) | ||
659 | 642 | ||
660 | /** | 643 | /** |
661 | * list_for_each_entry_rcu - iterate over rcu list of given type | 644 | * list_for_each_entry_rcu - iterate over rcu list of given type |
@@ -668,10 +651,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
668 | * as long as the traversal is guarded by rcu_read_lock(). | 651 | * as long as the traversal is guarded by rcu_read_lock(). |
669 | */ | 652 | */ |
670 | #define list_for_each_entry_rcu(pos, head, member) \ | 653 | #define list_for_each_entry_rcu(pos, head, member) \ |
671 | for (pos = list_entry((head)->next, typeof(*pos), member); \ | 654 | for (pos = list_entry(rcu_dereference((head)->next), typeof(*pos), member); \ |
672 | prefetch(rcu_dereference(pos)->member.next), \ | 655 | prefetch(pos->member.next), &pos->member != (head); \ |
673 | &pos->member != (head); \ | 656 | pos = list_entry(rcu_dereference(pos->member.next), typeof(*pos), member)) |
674 | pos = list_entry(pos->member.next, typeof(*pos), member)) | ||
675 | 657 | ||
676 | 658 | ||
677 | /** | 659 | /** |
@@ -686,9 +668,9 @@ static inline void list_splice_init_rcu(struct list_head *list, | |||
686 | * as long as the traversal is guarded by rcu_read_lock(). | 668 | * as long as the traversal is guarded by rcu_read_lock(). |
687 | */ | 669 | */ |
688 | #define list_for_each_continue_rcu(pos, head) \ | 670 | #define list_for_each_continue_rcu(pos, head) \ |
689 | for ((pos) = (pos)->next; \ | 671 | for ((pos) = rcu_dereference((pos)->next); \ |
690 | prefetch(rcu_dereference((pos))->next), (pos) != (head); \ | 672 | prefetch((pos)->next), (pos) != (head); \ |
691 | (pos) = (pos)->next) | 673 | (pos) = rcu_dereference((pos)->next)) |
692 | 674 | ||
693 | /* | 675 | /* |
694 | * Double linked lists with a single pointer list head. | 676 | * Double linked lists with a single pointer list head. |
@@ -986,10 +968,10 @@ static inline void hlist_add_after_rcu(struct hlist_node *prev, | |||
986 | * as long as the traversal is guarded by rcu_read_lock(). | 968 | * as long as the traversal is guarded by rcu_read_lock(). |
987 | */ | 969 | */ |
988 | #define hlist_for_each_entry_rcu(tpos, pos, head, member) \ | 970 | #define hlist_for_each_entry_rcu(tpos, pos, head, member) \ |
989 | for (pos = (head)->first; \ | 971 | for (pos = rcu_dereference((head)->first); \ |
990 | rcu_dereference(pos) && ({ prefetch(pos->next); 1;}) && \ | 972 | pos && ({ prefetch(pos->next); 1;}) && \ |
991 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ | 973 | ({ tpos = hlist_entry(pos, typeof(*tpos), member); 1;}); \ |
992 | pos = pos->next) | 974 | pos = rcu_dereference(pos->next)) |
993 | 975 | ||
994 | #else | 976 | #else |
995 | #warning "don't include kernel headers in userspace" | 977 | #warning "don't include kernel headers in userspace" |
diff --git a/include/linux/mount.h b/include/linux/mount.h index 5ee2df217cdf..d6600e3f7e45 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include <linux/types.h> | 15 | #include <linux/types.h> |
16 | #include <linux/list.h> | 16 | #include <linux/list.h> |
17 | #include <linux/nodemask.h> | ||
17 | #include <linux/spinlock.h> | 18 | #include <linux/spinlock.h> |
18 | #include <asm/atomic.h> | 19 | #include <asm/atomic.h> |
19 | 20 | ||
@@ -28,8 +29,10 @@ struct mnt_namespace; | |||
28 | #define MNT_NOATIME 0x08 | 29 | #define MNT_NOATIME 0x08 |
29 | #define MNT_NODIRATIME 0x10 | 30 | #define MNT_NODIRATIME 0x10 |
30 | #define MNT_RELATIME 0x20 | 31 | #define MNT_RELATIME 0x20 |
32 | #define MNT_READONLY 0x40 /* does the user want this to be r/o? */ | ||
31 | 33 | ||
32 | #define MNT_SHRINKABLE 0x100 | 34 | #define MNT_SHRINKABLE 0x100 |
35 | #define MNT_IMBALANCED_WRITE_COUNT 0x200 /* just for debugging */ | ||
33 | 36 | ||
34 | #define MNT_SHARED 0x1000 /* if the vfsmount is a shared mount */ | 37 | #define MNT_SHARED 0x1000 /* if the vfsmount is a shared mount */ |
35 | #define MNT_UNBINDABLE 0x2000 /* if the vfsmount is a unbindable mount */ | 38 | #define MNT_UNBINDABLE 0x2000 /* if the vfsmount is a unbindable mount */ |
@@ -62,6 +65,11 @@ struct vfsmount { | |||
62 | int mnt_expiry_mark; /* true if marked for expiry */ | 65 | int mnt_expiry_mark; /* true if marked for expiry */ |
63 | int mnt_pinned; | 66 | int mnt_pinned; |
64 | int mnt_ghosts; | 67 | int mnt_ghosts; |
68 | /* | ||
69 | * This value is not stable unless all of the mnt_writers[] spinlocks | ||
70 | * are held, and all mnt_writer[]s on this mount have 0 as their ->count | ||
71 | */ | ||
72 | atomic_t __mnt_writers; | ||
65 | }; | 73 | }; |
66 | 74 | ||
67 | static inline struct vfsmount *mntget(struct vfsmount *mnt) | 75 | static inline struct vfsmount *mntget(struct vfsmount *mnt) |
@@ -71,9 +79,12 @@ static inline struct vfsmount *mntget(struct vfsmount *mnt) | |||
71 | return mnt; | 79 | return mnt; |
72 | } | 80 | } |
73 | 81 | ||
82 | extern int mnt_want_write(struct vfsmount *mnt); | ||
83 | extern void mnt_drop_write(struct vfsmount *mnt); | ||
74 | extern void mntput_no_expire(struct vfsmount *mnt); | 84 | extern void mntput_no_expire(struct vfsmount *mnt); |
75 | extern void mnt_pin(struct vfsmount *mnt); | 85 | extern void mnt_pin(struct vfsmount *mnt); |
76 | extern void mnt_unpin(struct vfsmount *mnt); | 86 | extern void mnt_unpin(struct vfsmount *mnt); |
87 | extern int __mnt_is_readonly(struct vfsmount *mnt); | ||
77 | 88 | ||
78 | static inline void mntput(struct vfsmount *mnt) | 89 | static inline void mntput(struct vfsmount *mnt) |
79 | { | 90 | { |
diff --git a/include/linux/prctl.h b/include/linux/prctl.h index 3800639775ae..5c80b1939636 100644 --- a/include/linux/prctl.h +++ b/include/linux/prctl.h | |||
@@ -67,4 +67,10 @@ | |||
67 | #define PR_CAPBSET_READ 23 | 67 | #define PR_CAPBSET_READ 23 |
68 | #define PR_CAPBSET_DROP 24 | 68 | #define PR_CAPBSET_DROP 24 |
69 | 69 | ||
70 | /* Get/set the process' ability to use the timestamp counter instruction */ | ||
71 | #define PR_GET_TSC 25 | ||
72 | #define PR_SET_TSC 26 | ||
73 | # define PR_TSC_ENABLE 1 /* allow the use of the timestamp counter */ | ||
74 | # define PR_TSC_SIGSEGV 2 /* throw a SIGSEGV instead of reading the TSC */ | ||
75 | |||
70 | #endif /* _LINUX_PRCTL_H */ | 76 | #endif /* _LINUX_PRCTL_H */ |