diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/cifs/cifssmb.c | 24 | ||||
-rw-r--r-- | fs/cifs/connect.c | 17 | ||||
-rw-r--r-- | fs/cifs/file.c | 10 | ||||
-rw-r--r-- | fs/cifs/netmisc.c | 3 | ||||
-rw-r--r-- | fs/debugfs/file.c | 14 | ||||
-rw-r--r-- | fs/dlm/debug_fs.c | 9 | ||||
-rw-r--r-- | fs/exec.c | 7 | ||||
-rw-r--r-- | fs/hugetlbfs/inode.c | 1 | ||||
-rw-r--r-- | fs/libfs.c | 8 | ||||
-rw-r--r-- | fs/locks.c | 3 | ||||
-rw-r--r-- | fs/namei.c | 35 | ||||
-rw-r--r-- | fs/proc/root.c | 9 | ||||
-rw-r--r-- | fs/pstore/inode.c | 8 | ||||
-rw-r--r-- | fs/splice.c | 5 | ||||
-rw-r--r-- | fs/xattr.c | 40 |
15 files changed, 92 insertions, 101 deletions
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c index 8fecc99be344..f52c5ab78f9d 100644 --- a/fs/cifs/cifssmb.c +++ b/fs/cifs/cifssmb.c | |||
@@ -3892,13 +3892,12 @@ CIFSSMBSetCIFSACL(const int xid, struct cifs_tcon *tcon, __u16 fid, | |||
3892 | int rc = 0; | 3892 | int rc = 0; |
3893 | int bytes_returned = 0; | 3893 | int bytes_returned = 0; |
3894 | SET_SEC_DESC_REQ *pSMB = NULL; | 3894 | SET_SEC_DESC_REQ *pSMB = NULL; |
3895 | NTRANSACT_RSP *pSMBr = NULL; | 3895 | void *pSMBr; |
3896 | 3896 | ||
3897 | setCifsAclRetry: | 3897 | setCifsAclRetry: |
3898 | rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, | 3898 | rc = smb_init(SMB_COM_NT_TRANSACT, 19, tcon, (void **) &pSMB, &pSMBr); |
3899 | (void **) &pSMBr); | ||
3900 | if (rc) | 3899 | if (rc) |
3901 | return (rc); | 3900 | return rc; |
3902 | 3901 | ||
3903 | pSMB->MaxSetupCount = 0; | 3902 | pSMB->MaxSetupCount = 0; |
3904 | pSMB->Reserved = 0; | 3903 | pSMB->Reserved = 0; |
@@ -3926,9 +3925,8 @@ setCifsAclRetry: | |||
3926 | pSMB->AclFlags = cpu_to_le32(aclflag); | 3925 | pSMB->AclFlags = cpu_to_le32(aclflag); |
3927 | 3926 | ||
3928 | if (pntsd && acllen) { | 3927 | if (pntsd && acllen) { |
3929 | memcpy((char *) &pSMBr->hdr.Protocol + data_offset, | 3928 | memcpy((char *)pSMBr + offsetof(struct smb_hdr, Protocol) + |
3930 | (char *) pntsd, | 3929 | data_offset, pntsd, acllen); |
3931 | acllen); | ||
3932 | inc_rfc1001_len(pSMB, byte_count + data_count); | 3930 | inc_rfc1001_len(pSMB, byte_count + data_count); |
3933 | } else | 3931 | } else |
3934 | inc_rfc1001_len(pSMB, byte_count); | 3932 | inc_rfc1001_len(pSMB, byte_count); |
@@ -5708,7 +5706,8 @@ CIFSSMBSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
5708 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; | 5706 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; |
5709 | offset = param_offset + params; | 5707 | offset = param_offset + params; |
5710 | 5708 | ||
5711 | data_offset = (char *) (&pSMB->hdr.Protocol) + offset; | 5709 | data_offset = (char *)pSMB + |
5710 | offsetof(struct smb_hdr, Protocol) + offset; | ||
5712 | 5711 | ||
5713 | count = sizeof(FILE_BASIC_INFO); | 5712 | count = sizeof(FILE_BASIC_INFO); |
5714 | pSMB->MaxParameterCount = cpu_to_le16(2); | 5713 | pSMB->MaxParameterCount = cpu_to_le16(2); |
@@ -5977,7 +5976,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
5977 | u16 fid, u32 pid_of_opener) | 5976 | u16 fid, u32 pid_of_opener) |
5978 | { | 5977 | { |
5979 | struct smb_com_transaction2_sfi_req *pSMB = NULL; | 5978 | struct smb_com_transaction2_sfi_req *pSMB = NULL; |
5980 | FILE_UNIX_BASIC_INFO *data_offset; | 5979 | char *data_offset; |
5981 | int rc = 0; | 5980 | int rc = 0; |
5982 | u16 params, param_offset, offset, byte_count, count; | 5981 | u16 params, param_offset, offset, byte_count, count; |
5983 | 5982 | ||
@@ -5999,8 +5998,9 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
5999 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; | 5998 | param_offset = offsetof(struct smb_com_transaction2_sfi_req, Fid) - 4; |
6000 | offset = param_offset + params; | 5999 | offset = param_offset + params; |
6001 | 6000 | ||
6002 | data_offset = (FILE_UNIX_BASIC_INFO *) | 6001 | data_offset = (char *)pSMB + |
6003 | ((char *)(&pSMB->hdr.Protocol) + offset); | 6002 | offsetof(struct smb_hdr, Protocol) + offset; |
6003 | |||
6004 | count = sizeof(FILE_UNIX_BASIC_INFO); | 6004 | count = sizeof(FILE_UNIX_BASIC_INFO); |
6005 | 6005 | ||
6006 | pSMB->MaxParameterCount = cpu_to_le16(2); | 6006 | pSMB->MaxParameterCount = cpu_to_le16(2); |
@@ -6022,7 +6022,7 @@ CIFSSMBUnixSetFileInfo(const int xid, struct cifs_tcon *tcon, | |||
6022 | inc_rfc1001_len(pSMB, byte_count); | 6022 | inc_rfc1001_len(pSMB, byte_count); |
6023 | pSMB->ByteCount = cpu_to_le16(byte_count); | 6023 | pSMB->ByteCount = cpu_to_le16(byte_count); |
6024 | 6024 | ||
6025 | cifs_fill_unix_set_info(data_offset, args); | 6025 | cifs_fill_unix_set_info((FILE_UNIX_BASIC_INFO *)data_offset, args); |
6026 | 6026 | ||
6027 | rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); | 6027 | rc = SendReceiveNoRsp(xid, tcon->ses, (char *) pSMB, 0); |
6028 | if (rc) | 6028 | if (rc) |
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 302a15c505a9..d81e933a796b 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -1565,8 +1565,7 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1565 | 1565 | ||
1566 | /* Obtain the value string */ | 1566 | /* Obtain the value string */ |
1567 | value = strchr(data, '='); | 1567 | value = strchr(data, '='); |
1568 | if (value != NULL) | 1568 | value++; |
1569 | *value++ = '\0'; | ||
1570 | 1569 | ||
1571 | /* Set tmp_end to end of the string */ | 1570 | /* Set tmp_end to end of the string */ |
1572 | tmp_end = (char *) value + strlen(value); | 1571 | tmp_end = (char *) value + strlen(value); |
@@ -1649,6 +1648,13 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1649 | goto cifs_parse_mount_err; | 1648 | goto cifs_parse_mount_err; |
1650 | } | 1649 | } |
1651 | 1650 | ||
1651 | vol->UNC = kmalloc(temp_len+1, GFP_KERNEL); | ||
1652 | if (vol->UNC == NULL) { | ||
1653 | printk(KERN_WARNING "CIFS: no memory for UNC\n"); | ||
1654 | goto cifs_parse_mount_err; | ||
1655 | } | ||
1656 | strcpy(vol->UNC, string); | ||
1657 | |||
1652 | if (strncmp(string, "//", 2) == 0) { | 1658 | if (strncmp(string, "//", 2) == 0) { |
1653 | vol->UNC[0] = '\\'; | 1659 | vol->UNC[0] = '\\'; |
1654 | vol->UNC[1] = '\\'; | 1660 | vol->UNC[1] = '\\'; |
@@ -1658,13 +1664,6 @@ cifs_parse_mount_options(const char *mountdata, const char *devname, | |||
1658 | goto cifs_parse_mount_err; | 1664 | goto cifs_parse_mount_err; |
1659 | } | 1665 | } |
1660 | 1666 | ||
1661 | vol->UNC = kmalloc(temp_len+1, GFP_KERNEL); | ||
1662 | if (vol->UNC == NULL) { | ||
1663 | printk(KERN_WARNING "CIFS: no memory " | ||
1664 | "for UNC\n"); | ||
1665 | goto cifs_parse_mount_err; | ||
1666 | } | ||
1667 | strcpy(vol->UNC, string); | ||
1668 | break; | 1667 | break; |
1669 | case Opt_domain: | 1668 | case Opt_domain: |
1670 | string = match_strdup(args); | 1669 | string = match_strdup(args); |
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 460d87b7cda0..fae765dac934 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
@@ -835,13 +835,21 @@ cifs_posix_lock_set(struct file *file, struct file_lock *flock) | |||
835 | if ((flock->fl_flags & FL_POSIX) == 0) | 835 | if ((flock->fl_flags & FL_POSIX) == 0) |
836 | return rc; | 836 | return rc; |
837 | 837 | ||
838 | try_again: | ||
838 | mutex_lock(&cinode->lock_mutex); | 839 | mutex_lock(&cinode->lock_mutex); |
839 | if (!cinode->can_cache_brlcks) { | 840 | if (!cinode->can_cache_brlcks) { |
840 | mutex_unlock(&cinode->lock_mutex); | 841 | mutex_unlock(&cinode->lock_mutex); |
841 | return rc; | 842 | return rc; |
842 | } | 843 | } |
843 | rc = posix_lock_file_wait(file, flock); | 844 | |
845 | rc = posix_lock_file(file, flock, NULL); | ||
844 | mutex_unlock(&cinode->lock_mutex); | 846 | mutex_unlock(&cinode->lock_mutex); |
847 | if (rc == FILE_LOCK_DEFERRED) { | ||
848 | rc = wait_event_interruptible(flock->fl_wait, !flock->fl_next); | ||
849 | if (!rc) | ||
850 | goto try_again; | ||
851 | locks_delete_block(flock); | ||
852 | } | ||
845 | return rc; | 853 | return rc; |
846 | } | 854 | } |
847 | 855 | ||
diff --git a/fs/cifs/netmisc.c b/fs/cifs/netmisc.c index dd23a321bdda..581c225f7f50 100644 --- a/fs/cifs/netmisc.c +++ b/fs/cifs/netmisc.c | |||
@@ -197,8 +197,7 @@ cifs_convert_address(struct sockaddr *dst, const char *src, int len) | |||
197 | memcpy(scope_id, pct + 1, slen); | 197 | memcpy(scope_id, pct + 1, slen); |
198 | scope_id[slen] = '\0'; | 198 | scope_id[slen] = '\0'; |
199 | 199 | ||
200 | rc = strict_strtoul(scope_id, 0, | 200 | rc = kstrtouint(scope_id, 0, &s6->sin6_scope_id); |
201 | (unsigned long *)&s6->sin6_scope_id); | ||
202 | rc = (rc == 0) ? 1 : 0; | 201 | rc = (rc == 0) ? 1 : 0; |
203 | } | 202 | } |
204 | 203 | ||
diff --git a/fs/debugfs/file.c b/fs/debugfs/file.c index 21e93605161c..5dfafdd1dbd3 100644 --- a/fs/debugfs/file.c +++ b/fs/debugfs/file.c | |||
@@ -33,18 +33,10 @@ static ssize_t default_write_file(struct file *file, const char __user *buf, | |||
33 | return count; | 33 | return count; |
34 | } | 34 | } |
35 | 35 | ||
36 | static int default_open(struct inode *inode, struct file *file) | ||
37 | { | ||
38 | if (inode->i_private) | ||
39 | file->private_data = inode->i_private; | ||
40 | |||
41 | return 0; | ||
42 | } | ||
43 | |||
44 | const struct file_operations debugfs_file_operations = { | 36 | const struct file_operations debugfs_file_operations = { |
45 | .read = default_read_file, | 37 | .read = default_read_file, |
46 | .write = default_write_file, | 38 | .write = default_write_file, |
47 | .open = default_open, | 39 | .open = simple_open, |
48 | .llseek = noop_llseek, | 40 | .llseek = noop_llseek, |
49 | }; | 41 | }; |
50 | 42 | ||
@@ -447,7 +439,7 @@ static ssize_t write_file_bool(struct file *file, const char __user *user_buf, | |||
447 | static const struct file_operations fops_bool = { | 439 | static const struct file_operations fops_bool = { |
448 | .read = read_file_bool, | 440 | .read = read_file_bool, |
449 | .write = write_file_bool, | 441 | .write = write_file_bool, |
450 | .open = default_open, | 442 | .open = simple_open, |
451 | .llseek = default_llseek, | 443 | .llseek = default_llseek, |
452 | }; | 444 | }; |
453 | 445 | ||
@@ -492,7 +484,7 @@ static ssize_t read_file_blob(struct file *file, char __user *user_buf, | |||
492 | 484 | ||
493 | static const struct file_operations fops_blob = { | 485 | static const struct file_operations fops_blob = { |
494 | .read = read_file_blob, | 486 | .read = read_file_blob, |
495 | .open = default_open, | 487 | .open = simple_open, |
496 | .llseek = default_llseek, | 488 | .llseek = default_llseek, |
497 | }; | 489 | }; |
498 | 490 | ||
diff --git a/fs/dlm/debug_fs.c b/fs/dlm/debug_fs.c index 3dca2b39e83f..1c9b08095f98 100644 --- a/fs/dlm/debug_fs.c +++ b/fs/dlm/debug_fs.c | |||
@@ -609,13 +609,6 @@ static const struct file_operations format3_fops = { | |||
609 | /* | 609 | /* |
610 | * dump lkb's on the ls_waiters list | 610 | * dump lkb's on the ls_waiters list |
611 | */ | 611 | */ |
612 | |||
613 | static int waiters_open(struct inode *inode, struct file *file) | ||
614 | { | ||
615 | file->private_data = inode->i_private; | ||
616 | return 0; | ||
617 | } | ||
618 | |||
619 | static ssize_t waiters_read(struct file *file, char __user *userbuf, | 612 | static ssize_t waiters_read(struct file *file, char __user *userbuf, |
620 | size_t count, loff_t *ppos) | 613 | size_t count, loff_t *ppos) |
621 | { | 614 | { |
@@ -644,7 +637,7 @@ static ssize_t waiters_read(struct file *file, char __user *userbuf, | |||
644 | 637 | ||
645 | static const struct file_operations waiters_fops = { | 638 | static const struct file_operations waiters_fops = { |
646 | .owner = THIS_MODULE, | 639 | .owner = THIS_MODULE, |
647 | .open = waiters_open, | 640 | .open = simple_open, |
648 | .read = waiters_read, | 641 | .read = waiters_read, |
649 | .llseek = default_llseek, | 642 | .llseek = default_llseek, |
650 | }; | 643 | }; |
@@ -1371,7 +1371,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) | |||
1371 | unsigned int depth = bprm->recursion_depth; | 1371 | unsigned int depth = bprm->recursion_depth; |
1372 | int try,retval; | 1372 | int try,retval; |
1373 | struct linux_binfmt *fmt; | 1373 | struct linux_binfmt *fmt; |
1374 | pid_t old_pid; | 1374 | pid_t old_pid, old_vpid; |
1375 | 1375 | ||
1376 | retval = security_bprm_check(bprm); | 1376 | retval = security_bprm_check(bprm); |
1377 | if (retval) | 1377 | if (retval) |
@@ -1382,8 +1382,9 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) | |||
1382 | return retval; | 1382 | return retval; |
1383 | 1383 | ||
1384 | /* Need to fetch pid before load_binary changes it */ | 1384 | /* Need to fetch pid before load_binary changes it */ |
1385 | old_pid = current->pid; | ||
1385 | rcu_read_lock(); | 1386 | rcu_read_lock(); |
1386 | old_pid = task_pid_nr_ns(current, task_active_pid_ns(current->parent)); | 1387 | old_vpid = task_pid_nr_ns(current, task_active_pid_ns(current->parent)); |
1387 | rcu_read_unlock(); | 1388 | rcu_read_unlock(); |
1388 | 1389 | ||
1389 | retval = -ENOENT; | 1390 | retval = -ENOENT; |
@@ -1406,7 +1407,7 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs) | |||
1406 | if (retval >= 0) { | 1407 | if (retval >= 0) { |
1407 | if (depth == 0) { | 1408 | if (depth == 0) { |
1408 | trace_sched_process_exec(current, old_pid, bprm); | 1409 | trace_sched_process_exec(current, old_pid, bprm); |
1409 | ptrace_event(PTRACE_EVENT_EXEC, old_pid); | 1410 | ptrace_event(PTRACE_EVENT_EXEC, old_vpid); |
1410 | } | 1411 | } |
1411 | put_binfmt(fmt); | 1412 | put_binfmt(fmt); |
1412 | allow_write_access(bprm->file); | 1413 | allow_write_access(bprm->file); |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index ea251749d9d5..28cf06e4ec84 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -1031,7 +1031,6 @@ static int __init init_hugetlbfs_fs(void) | |||
1031 | } | 1031 | } |
1032 | 1032 | ||
1033 | error = PTR_ERR(vfsmount); | 1033 | error = PTR_ERR(vfsmount); |
1034 | unregister_filesystem(&hugetlbfs_fs_type); | ||
1035 | 1034 | ||
1036 | out: | 1035 | out: |
1037 | kmem_cache_destroy(hugetlbfs_inode_cachep); | 1036 | kmem_cache_destroy(hugetlbfs_inode_cachep); |
diff --git a/fs/libfs.c b/fs/libfs.c index 4a0d1f06da57..358094f0433d 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
@@ -264,6 +264,13 @@ Enomem: | |||
264 | return ERR_PTR(-ENOMEM); | 264 | return ERR_PTR(-ENOMEM); |
265 | } | 265 | } |
266 | 266 | ||
267 | int simple_open(struct inode *inode, struct file *file) | ||
268 | { | ||
269 | if (inode->i_private) | ||
270 | file->private_data = inode->i_private; | ||
271 | return 0; | ||
272 | } | ||
273 | |||
267 | int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) | 274 | int simple_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) |
268 | { | 275 | { |
269 | struct inode *inode = old_dentry->d_inode; | 276 | struct inode *inode = old_dentry->d_inode; |
@@ -984,6 +991,7 @@ EXPORT_SYMBOL(simple_dir_operations); | |||
984 | EXPORT_SYMBOL(simple_empty); | 991 | EXPORT_SYMBOL(simple_empty); |
985 | EXPORT_SYMBOL(simple_fill_super); | 992 | EXPORT_SYMBOL(simple_fill_super); |
986 | EXPORT_SYMBOL(simple_getattr); | 993 | EXPORT_SYMBOL(simple_getattr); |
994 | EXPORT_SYMBOL(simple_open); | ||
987 | EXPORT_SYMBOL(simple_link); | 995 | EXPORT_SYMBOL(simple_link); |
988 | EXPORT_SYMBOL(simple_lookup); | 996 | EXPORT_SYMBOL(simple_lookup); |
989 | EXPORT_SYMBOL(simple_pin_fs); | 997 | EXPORT_SYMBOL(simple_pin_fs); |
diff --git a/fs/locks.c b/fs/locks.c index 637694bf3a03..0d68f1f81799 100644 --- a/fs/locks.c +++ b/fs/locks.c | |||
@@ -510,12 +510,13 @@ static void __locks_delete_block(struct file_lock *waiter) | |||
510 | 510 | ||
511 | /* | 511 | /* |
512 | */ | 512 | */ |
513 | static void locks_delete_block(struct file_lock *waiter) | 513 | void locks_delete_block(struct file_lock *waiter) |
514 | { | 514 | { |
515 | lock_flocks(); | 515 | lock_flocks(); |
516 | __locks_delete_block(waiter); | 516 | __locks_delete_block(waiter); |
517 | unlock_flocks(); | 517 | unlock_flocks(); |
518 | } | 518 | } |
519 | EXPORT_SYMBOL(locks_delete_block); | ||
519 | 520 | ||
520 | /* Insert waiter into blocker's block list. | 521 | /* Insert waiter into blocker's block list. |
521 | * We use a circular list so that processes can be easily woken up in | 522 | * We use a circular list so that processes can be easily woken up in |
diff --git a/fs/namei.c b/fs/namei.c index 1898198abc3d..0062dd17eb55 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1407,18 +1407,9 @@ static inline int can_lookup(struct inode *inode) | |||
1407 | */ | 1407 | */ |
1408 | #ifdef CONFIG_DCACHE_WORD_ACCESS | 1408 | #ifdef CONFIG_DCACHE_WORD_ACCESS |
1409 | 1409 | ||
1410 | #ifdef CONFIG_64BIT | 1410 | #include <asm/word-at-a-time.h> |
1411 | 1411 | ||
1412 | /* | 1412 | #ifdef CONFIG_64BIT |
1413 | * Jan Achrenius on G+: microoptimized version of | ||
1414 | * the simpler "(mask & ONEBYTES) * ONEBYTES >> 56" | ||
1415 | * that works for the bytemasks without having to | ||
1416 | * mask them first. | ||
1417 | */ | ||
1418 | static inline long count_masked_bytes(unsigned long mask) | ||
1419 | { | ||
1420 | return mask*0x0001020304050608ul >> 56; | ||
1421 | } | ||
1422 | 1413 | ||
1423 | static inline unsigned int fold_hash(unsigned long hash) | 1414 | static inline unsigned int fold_hash(unsigned long hash) |
1424 | { | 1415 | { |
@@ -1428,15 +1419,6 @@ static inline unsigned int fold_hash(unsigned long hash) | |||
1428 | 1419 | ||
1429 | #else /* 32-bit case */ | 1420 | #else /* 32-bit case */ |
1430 | 1421 | ||
1431 | /* Carl Chatfield / Jan Achrenius G+ version for 32-bit */ | ||
1432 | static inline long count_masked_bytes(long mask) | ||
1433 | { | ||
1434 | /* (000000 0000ff 00ffff ffffff) -> ( 1 1 2 3 ) */ | ||
1435 | long a = (0x0ff0001+mask) >> 23; | ||
1436 | /* Fix the 1 for 00 case */ | ||
1437 | return a & mask; | ||
1438 | } | ||
1439 | |||
1440 | #define fold_hash(x) (x) | 1422 | #define fold_hash(x) (x) |
1441 | 1423 | ||
1442 | #endif | 1424 | #endif |
@@ -1464,17 +1446,6 @@ done: | |||
1464 | } | 1446 | } |
1465 | EXPORT_SYMBOL(full_name_hash); | 1447 | EXPORT_SYMBOL(full_name_hash); |
1466 | 1448 | ||
1467 | #define REPEAT_BYTE(x) ((~0ul / 0xff) * (x)) | ||
1468 | #define ONEBYTES REPEAT_BYTE(0x01) | ||
1469 | #define SLASHBYTES REPEAT_BYTE('/') | ||
1470 | #define HIGHBITS REPEAT_BYTE(0x80) | ||
1471 | |||
1472 | /* Return the high bit set in the first byte that is a zero */ | ||
1473 | static inline unsigned long has_zero(unsigned long a) | ||
1474 | { | ||
1475 | return ((a - ONEBYTES) & ~a) & HIGHBITS; | ||
1476 | } | ||
1477 | |||
1478 | /* | 1449 | /* |
1479 | * Calculate the length and hash of the path component, and | 1450 | * Calculate the length and hash of the path component, and |
1480 | * return the length of the component; | 1451 | * return the length of the component; |
@@ -1490,7 +1461,7 @@ static inline unsigned long hash_name(const char *name, unsigned int *hashp) | |||
1490 | len += sizeof(unsigned long); | 1461 | len += sizeof(unsigned long); |
1491 | a = *(unsigned long *)(name+len); | 1462 | a = *(unsigned long *)(name+len); |
1492 | /* Do we have any NUL or '/' bytes in this word? */ | 1463 | /* Do we have any NUL or '/' bytes in this word? */ |
1493 | mask = has_zero(a) | has_zero(a ^ SLASHBYTES); | 1464 | mask = has_zero(a) | has_zero(a ^ REPEAT_BYTE('/')); |
1494 | } while (!mask); | 1465 | } while (!mask); |
1495 | 1466 | ||
1496 | /* The mask *below* the first high bit set */ | 1467 | /* The mask *below* the first high bit set */ |
diff --git a/fs/proc/root.c b/fs/proc/root.c index 46a15d8a29ca..eed44bfc85db 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c | |||
@@ -115,12 +115,13 @@ static struct dentry *proc_mount(struct file_system_type *fs_type, | |||
115 | if (IS_ERR(sb)) | 115 | if (IS_ERR(sb)) |
116 | return ERR_CAST(sb); | 116 | return ERR_CAST(sb); |
117 | 117 | ||
118 | if (!proc_parse_options(options, ns)) { | ||
119 | deactivate_locked_super(sb); | ||
120 | return ERR_PTR(-EINVAL); | ||
121 | } | ||
122 | |||
118 | if (!sb->s_root) { | 123 | if (!sb->s_root) { |
119 | sb->s_flags = flags; | 124 | sb->s_flags = flags; |
120 | if (!proc_parse_options(options, ns)) { | ||
121 | deactivate_locked_super(sb); | ||
122 | return ERR_PTR(-EINVAL); | ||
123 | } | ||
124 | err = proc_fill_super(sb); | 125 | err = proc_fill_super(sb); |
125 | if (err) { | 126 | if (err) { |
126 | deactivate_locked_super(sb); | 127 | deactivate_locked_super(sb); |
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 50952c9bd06c..19507889bb7f 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c | |||
@@ -52,12 +52,6 @@ struct pstore_private { | |||
52 | char data[]; | 52 | char data[]; |
53 | }; | 53 | }; |
54 | 54 | ||
55 | static int pstore_file_open(struct inode *inode, struct file *file) | ||
56 | { | ||
57 | file->private_data = inode->i_private; | ||
58 | return 0; | ||
59 | } | ||
60 | |||
61 | static ssize_t pstore_file_read(struct file *file, char __user *userbuf, | 55 | static ssize_t pstore_file_read(struct file *file, char __user *userbuf, |
62 | size_t count, loff_t *ppos) | 56 | size_t count, loff_t *ppos) |
63 | { | 57 | { |
@@ -67,7 +61,7 @@ static ssize_t pstore_file_read(struct file *file, char __user *userbuf, | |||
67 | } | 61 | } |
68 | 62 | ||
69 | static const struct file_operations pstore_file_operations = { | 63 | static const struct file_operations pstore_file_operations = { |
70 | .open = pstore_file_open, | 64 | .open = simple_open, |
71 | .read = pstore_file_read, | 65 | .read = pstore_file_read, |
72 | .llseek = default_llseek, | 66 | .llseek = default_llseek, |
73 | }; | 67 | }; |
diff --git a/fs/splice.c b/fs/splice.c index 5f883de7ef3a..f8476841eb04 100644 --- a/fs/splice.c +++ b/fs/splice.c | |||
@@ -30,6 +30,7 @@ | |||
30 | #include <linux/uio.h> | 30 | #include <linux/uio.h> |
31 | #include <linux/security.h> | 31 | #include <linux/security.h> |
32 | #include <linux/gfp.h> | 32 | #include <linux/gfp.h> |
33 | #include <linux/socket.h> | ||
33 | 34 | ||
34 | /* | 35 | /* |
35 | * Attempt to steal a page from a pipe buffer. This should perhaps go into | 36 | * Attempt to steal a page from a pipe buffer. This should perhaps go into |
@@ -690,7 +691,9 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe, | |||
690 | if (!likely(file->f_op && file->f_op->sendpage)) | 691 | if (!likely(file->f_op && file->f_op->sendpage)) |
691 | return -EINVAL; | 692 | return -EINVAL; |
692 | 693 | ||
693 | more = (sd->flags & SPLICE_F_MORE) || sd->len < sd->total_len; | 694 | more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0; |
695 | if (sd->len < sd->total_len) | ||
696 | more |= MSG_SENDPAGE_NOTLAST; | ||
694 | return file->f_op->sendpage(file, buf->page, buf->offset, | 697 | return file->f_op->sendpage(file, buf->page, buf->offset, |
695 | sd->len, &pos, more); | 698 | sd->len, &pos, more); |
696 | } | 699 | } |
diff --git a/fs/xattr.c b/fs/xattr.c index d6dfd247bb2f..3c8c1cc333c7 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
@@ -19,8 +19,9 @@ | |||
19 | #include <linux/export.h> | 19 | #include <linux/export.h> |
20 | #include <linux/fsnotify.h> | 20 | #include <linux/fsnotify.h> |
21 | #include <linux/audit.h> | 21 | #include <linux/audit.h> |
22 | #include <asm/uaccess.h> | 22 | #include <linux/vmalloc.h> |
23 | 23 | ||
24 | #include <asm/uaccess.h> | ||
24 | 25 | ||
25 | /* | 26 | /* |
26 | * Check permissions for extended attribute access. This is a bit complicated | 27 | * Check permissions for extended attribute access. This is a bit complicated |
@@ -320,6 +321,7 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
320 | { | 321 | { |
321 | int error; | 322 | int error; |
322 | void *kvalue = NULL; | 323 | void *kvalue = NULL; |
324 | void *vvalue = NULL; /* If non-NULL, we used vmalloc() */ | ||
323 | char kname[XATTR_NAME_MAX + 1]; | 325 | char kname[XATTR_NAME_MAX + 1]; |
324 | 326 | ||
325 | if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) | 327 | if (flags & ~(XATTR_CREATE|XATTR_REPLACE)) |
@@ -334,13 +336,25 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value, | |||
334 | if (size) { | 336 | if (size) { |
335 | if (size > XATTR_SIZE_MAX) | 337 | if (size > XATTR_SIZE_MAX) |
336 | return -E2BIG; | 338 | return -E2BIG; |
337 | kvalue = memdup_user(value, size); | 339 | kvalue = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); |
338 | if (IS_ERR(kvalue)) | 340 | if (!kvalue) { |
339 | return PTR_ERR(kvalue); | 341 | vvalue = vmalloc(size); |
342 | if (!vvalue) | ||
343 | return -ENOMEM; | ||
344 | kvalue = vvalue; | ||
345 | } | ||
346 | if (copy_from_user(kvalue, value, size)) { | ||
347 | error = -EFAULT; | ||
348 | goto out; | ||
349 | } | ||
340 | } | 350 | } |
341 | 351 | ||
342 | error = vfs_setxattr(d, kname, kvalue, size, flags); | 352 | error = vfs_setxattr(d, kname, kvalue, size, flags); |
343 | kfree(kvalue); | 353 | out: |
354 | if (vvalue) | ||
355 | vfree(vvalue); | ||
356 | else | ||
357 | kfree(kvalue); | ||
344 | return error; | 358 | return error; |
345 | } | 359 | } |
346 | 360 | ||
@@ -492,13 +506,18 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
492 | { | 506 | { |
493 | ssize_t error; | 507 | ssize_t error; |
494 | char *klist = NULL; | 508 | char *klist = NULL; |
509 | char *vlist = NULL; /* If non-NULL, we used vmalloc() */ | ||
495 | 510 | ||
496 | if (size) { | 511 | if (size) { |
497 | if (size > XATTR_LIST_MAX) | 512 | if (size > XATTR_LIST_MAX) |
498 | size = XATTR_LIST_MAX; | 513 | size = XATTR_LIST_MAX; |
499 | klist = kmalloc(size, GFP_KERNEL); | 514 | klist = kmalloc(size, __GFP_NOWARN | GFP_KERNEL); |
500 | if (!klist) | 515 | if (!klist) { |
501 | return -ENOMEM; | 516 | vlist = vmalloc(size); |
517 | if (!vlist) | ||
518 | return -ENOMEM; | ||
519 | klist = vlist; | ||
520 | } | ||
502 | } | 521 | } |
503 | 522 | ||
504 | error = vfs_listxattr(d, klist, size); | 523 | error = vfs_listxattr(d, klist, size); |
@@ -510,7 +529,10 @@ listxattr(struct dentry *d, char __user *list, size_t size) | |||
510 | than XATTR_LIST_MAX bytes. Not possible. */ | 529 | than XATTR_LIST_MAX bytes. Not possible. */ |
511 | error = -E2BIG; | 530 | error = -E2BIG; |
512 | } | 531 | } |
513 | kfree(klist); | 532 | if (vlist) |
533 | vfree(vlist); | ||
534 | else | ||
535 | kfree(klist); | ||
514 | return error; | 536 | return error; |
515 | } | 537 | } |
516 | 538 | ||