aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fcntl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fcntl.c')
-rw-r--r--fs/fcntl.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/fs/fcntl.c b/fs/fcntl.c
index f74d270ba155..6769fd0f35b8 100644
--- a/fs/fcntl.c
+++ b/fs/fcntl.c
@@ -274,7 +274,7 @@ static int f_setown_ex(struct file *filp, unsigned long arg)
274 274
275 ret = copy_from_user(&owner, owner_p, sizeof(owner)); 275 ret = copy_from_user(&owner, owner_p, sizeof(owner));
276 if (ret) 276 if (ret)
277 return ret; 277 return -EFAULT;
278 278
279 switch (owner.type) { 279 switch (owner.type) {
280 case F_OWNER_TID: 280 case F_OWNER_TID:
@@ -332,8 +332,11 @@ static int f_getown_ex(struct file *filp, unsigned long arg)
332 } 332 }
333 read_unlock(&filp->f_owner.lock); 333 read_unlock(&filp->f_owner.lock);
334 334
335 if (!ret) 335 if (!ret) {
336 ret = copy_to_user(owner_p, &owner, sizeof(owner)); 336 ret = copy_to_user(owner_p, &owner, sizeof(owner));
337 if (ret)
338 ret = -EFAULT;
339 }
337 return ret; 340 return ret;
338} 341}
339 342
@@ -730,12 +733,14 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
730{ 733{
731 while (fa) { 734 while (fa) {
732 struct fown_struct *fown; 735 struct fown_struct *fown;
736 unsigned long flags;
737
733 if (fa->magic != FASYNC_MAGIC) { 738 if (fa->magic != FASYNC_MAGIC) {
734 printk(KERN_ERR "kill_fasync: bad magic number in " 739 printk(KERN_ERR "kill_fasync: bad magic number in "
735 "fasync_struct!\n"); 740 "fasync_struct!\n");
736 return; 741 return;
737 } 742 }
738 spin_lock(&fa->fa_lock); 743 spin_lock_irqsave(&fa->fa_lock, flags);
739 if (fa->fa_file) { 744 if (fa->fa_file) {
740 fown = &fa->fa_file->f_owner; 745 fown = &fa->fa_file->f_owner;
741 /* Don't send SIGURG to processes which have not set a 746 /* Don't send SIGURG to processes which have not set a
@@ -744,7 +749,7 @@ static void kill_fasync_rcu(struct fasync_struct *fa, int sig, int band)
744 if (!(sig == SIGURG && fown->signum == 0)) 749 if (!(sig == SIGURG && fown->signum == 0))
745 send_sigio(fown, fa->fa_fd, band); 750 send_sigio(fown, fa->fa_fd, band);
746 } 751 }
747 spin_unlock(&fa->fa_lock); 752 spin_unlock_irqrestore(&fa->fa_lock, flags);
748 fa = rcu_dereference(fa->fa_next); 753 fa = rcu_dereference(fa->fa_next);
749 } 754 }
750} 755}
@@ -762,11 +767,22 @@ void kill_fasync(struct fasync_struct **fp, int sig, int band)
762} 767}
763EXPORT_SYMBOL(kill_fasync); 768EXPORT_SYMBOL(kill_fasync);
764 769
765static int __init fasync_init(void) 770static int __init fcntl_init(void)
766{ 771{
772 /* please add new bits here to ensure allocation uniqueness */
773 BUILD_BUG_ON(19 - 1 /* for O_RDONLY being 0 */ != HWEIGHT32(
774 O_RDONLY | O_WRONLY | O_RDWR |
775 O_CREAT | O_EXCL | O_NOCTTY |
776 O_TRUNC | O_APPEND | O_NONBLOCK |
777 __O_SYNC | O_DSYNC | FASYNC |
778 O_DIRECT | O_LARGEFILE | O_DIRECTORY |
779 O_NOFOLLOW | O_NOATIME | O_CLOEXEC |
780 FMODE_EXEC
781 ));
782
767 fasync_cache = kmem_cache_create("fasync_cache", 783 fasync_cache = kmem_cache_create("fasync_cache",
768 sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL); 784 sizeof(struct fasync_struct), 0, SLAB_PANIC, NULL);
769 return 0; 785 return 0;
770} 786}
771 787
772module_init(fasync_init) 788module_init(fcntl_init)