diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/cifs/file.c | 23 | ||||
| -rw-r--r-- | fs/compat.c | 20 | ||||
| -rw-r--r-- | fs/ecryptfs/crypto.c | 2 | ||||
| -rw-r--r-- | fs/fuse/file.c | 9 | ||||
| -rw-r--r-- | fs/gfs2/ops_address.c | 7 | ||||
| -rw-r--r-- | fs/nfsd/nfs4recover.c | 2 | ||||
| -rw-r--r-- | fs/reiserfs/super.c | 1 | ||||
| -rw-r--r-- | fs/xattr.c | 13 |
8 files changed, 34 insertions, 43 deletions
diff --git a/fs/cifs/file.c b/fs/cifs/file.c index 976a691c5a68..7e056b9b49e8 100644 --- a/fs/cifs/file.c +++ b/fs/cifs/file.c | |||
| @@ -1806,13 +1806,6 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 1806 | } | 1806 | } |
| 1807 | if ((rc < 0) || (smb_read_data == NULL)) { | 1807 | if ((rc < 0) || (smb_read_data == NULL)) { |
| 1808 | cFYI(1, ("Read error in readpages: %d", rc)); | 1808 | cFYI(1, ("Read error in readpages: %d", rc)); |
| 1809 | /* clean up remaing pages off list */ | ||
| 1810 | while (!list_empty(page_list) && (i < num_pages)) { | ||
| 1811 | page = list_entry(page_list->prev, struct page, | ||
| 1812 | lru); | ||
| 1813 | list_del(&page->lru); | ||
| 1814 | page_cache_release(page); | ||
| 1815 | } | ||
| 1816 | break; | 1809 | break; |
| 1817 | } else if (bytes_read > 0) { | 1810 | } else if (bytes_read > 0) { |
| 1818 | pSMBr = (struct smb_com_read_rsp *)smb_read_data; | 1811 | pSMBr = (struct smb_com_read_rsp *)smb_read_data; |
| @@ -1831,13 +1824,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 1831 | this case is ok - if we are at server EOF | 1824 | this case is ok - if we are at server EOF |
| 1832 | we will hit it on next read */ | 1825 | we will hit it on next read */ |
| 1833 | 1826 | ||
| 1834 | /* while (!list_empty(page_list) && (i < num_pages)) { | 1827 | /* break; */ |
| 1835 | page = list_entry(page_list->prev, | ||
| 1836 | struct page, list); | ||
| 1837 | list_del(&page->list); | ||
| 1838 | page_cache_release(page); | ||
| 1839 | } | ||
| 1840 | break; */ | ||
| 1841 | } | 1828 | } |
| 1842 | } else { | 1829 | } else { |
| 1843 | cFYI(1, ("No bytes read (%d) at offset %lld . " | 1830 | cFYI(1, ("No bytes read (%d) at offset %lld . " |
| @@ -1845,14 +1832,6 @@ static int cifs_readpages(struct file *file, struct address_space *mapping, | |||
| 1845 | bytes_read, offset)); | 1832 | bytes_read, offset)); |
| 1846 | /* BB turn off caching and do new lookup on | 1833 | /* BB turn off caching and do new lookup on |
| 1847 | file size at server? */ | 1834 | file size at server? */ |
| 1848 | while (!list_empty(page_list) && (i < num_pages)) { | ||
| 1849 | page = list_entry(page_list->prev, struct page, | ||
| 1850 | lru); | ||
| 1851 | list_del(&page->lru); | ||
| 1852 | |||
| 1853 | /* BB removeme - replace with zero of page? */ | ||
| 1854 | page_cache_release(page); | ||
| 1855 | } | ||
| 1856 | break; | 1835 | break; |
| 1857 | } | 1836 | } |
| 1858 | if (smb_read_data) { | 1837 | if (smb_read_data) { |
diff --git a/fs/compat.c b/fs/compat.c index 50624d4a70c6..8d0a0018a7d2 100644 --- a/fs/compat.c +++ b/fs/compat.c | |||
| @@ -1835,9 +1835,12 @@ asmlinkage long compat_sys_pselect7(int n, compat_ulong_t __user *inp, | |||
| 1835 | 1835 | ||
| 1836 | } while (!ret && !timeout && tsp && (ts.tv_sec || ts.tv_nsec)); | 1836 | } while (!ret && !timeout && tsp && (ts.tv_sec || ts.tv_nsec)); |
| 1837 | 1837 | ||
| 1838 | if (ret == 0 && tsp && !(current->personality & STICKY_TIMEOUTS)) { | 1838 | if (tsp) { |
| 1839 | struct compat_timespec rts; | 1839 | struct compat_timespec rts; |
| 1840 | 1840 | ||
| 1841 | if (current->personality & STICKY_TIMEOUTS) | ||
| 1842 | goto sticky; | ||
| 1843 | |||
| 1841 | rts.tv_sec = timeout / HZ; | 1844 | rts.tv_sec = timeout / HZ; |
| 1842 | rts.tv_nsec = (timeout % HZ) * (NSEC_PER_SEC/HZ); | 1845 | rts.tv_nsec = (timeout % HZ) * (NSEC_PER_SEC/HZ); |
| 1843 | if (rts.tv_nsec >= NSEC_PER_SEC) { | 1846 | if (rts.tv_nsec >= NSEC_PER_SEC) { |
| @@ -1846,8 +1849,19 @@ asmlinkage long compat_sys_pselect7(int n, compat_ulong_t __user *inp, | |||
| 1846 | } | 1849 | } |
| 1847 | if (compat_timespec_compare(&rts, &ts) >= 0) | 1850 | if (compat_timespec_compare(&rts, &ts) >= 0) |
| 1848 | rts = ts; | 1851 | rts = ts; |
| 1849 | if (copy_to_user(tsp, &rts, sizeof(rts))) | 1852 | if (copy_to_user(tsp, &rts, sizeof(rts))) { |
| 1850 | ret = -EFAULT; | 1853 | sticky: |
| 1854 | /* | ||
| 1855 | * If an application puts its timeval in read-only | ||
| 1856 | * memory, we don't want the Linux-specific update to | ||
| 1857 | * the timeval to cause a fault after the select has | ||
| 1858 | * completed successfully. However, because we're not | ||
| 1859 | * updating the timeval, we can't restart the system | ||
| 1860 | * call. | ||
| 1861 | */ | ||
| 1862 | if (ret == -ERESTARTNOHAND) | ||
| 1863 | ret = -EINTR; | ||
| 1864 | } | ||
| 1851 | } | 1865 | } |
| 1852 | 1866 | ||
| 1853 | if (ret == -ERESTARTNOHAND) { | 1867 | if (ret == -ERESTARTNOHAND) { |
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c index f49f105394b7..136175a69332 100644 --- a/fs/ecryptfs/crypto.c +++ b/fs/ecryptfs/crypto.c | |||
| @@ -134,7 +134,7 @@ int ecryptfs_crypto_api_algify_cipher_name(char **algified_name, | |||
| 134 | 134 | ||
| 135 | algified_name_len = (chaining_modifier_len + cipher_name_len + 3); | 135 | algified_name_len = (chaining_modifier_len + cipher_name_len + 3); |
| 136 | (*algified_name) = kmalloc(algified_name_len, GFP_KERNEL); | 136 | (*algified_name) = kmalloc(algified_name_len, GFP_KERNEL); |
| 137 | if (!(algified_name)) { | 137 | if (!(*algified_name)) { |
| 138 | rc = -ENOMEM; | 138 | rc = -ENOMEM; |
| 139 | goto out; | 139 | goto out; |
| 140 | } | 140 | } |
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 2bb5ace3882d..763a50daf1c0 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
| @@ -397,14 +397,14 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, | |||
| 397 | 397 | ||
| 398 | err = -EIO; | 398 | err = -EIO; |
| 399 | if (is_bad_inode(inode)) | 399 | if (is_bad_inode(inode)) |
| 400 | goto clean_pages_up; | 400 | goto out; |
| 401 | 401 | ||
| 402 | data.file = file; | 402 | data.file = file; |
| 403 | data.inode = inode; | 403 | data.inode = inode; |
| 404 | data.req = fuse_get_req(fc); | 404 | data.req = fuse_get_req(fc); |
| 405 | err = PTR_ERR(data.req); | 405 | err = PTR_ERR(data.req); |
| 406 | if (IS_ERR(data.req)) | 406 | if (IS_ERR(data.req)) |
| 407 | goto clean_pages_up; | 407 | goto out; |
| 408 | 408 | ||
| 409 | err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data); | 409 | err = read_cache_pages(mapping, pages, fuse_readpages_fill, &data); |
| 410 | if (!err) { | 410 | if (!err) { |
| @@ -413,10 +413,7 @@ static int fuse_readpages(struct file *file, struct address_space *mapping, | |||
| 413 | else | 413 | else |
| 414 | fuse_put_request(fc, data.req); | 414 | fuse_put_request(fc, data.req); |
| 415 | } | 415 | } |
| 416 | return err; | 416 | out: |
| 417 | |||
| 418 | clean_pages_up: | ||
| 419 | put_pages_list(pages); | ||
| 420 | return err; | 417 | return err; |
| 421 | } | 418 | } |
| 422 | 419 | ||
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c index 8d5963c7e123..015640b3f123 100644 --- a/fs/gfs2/ops_address.c +++ b/fs/gfs2/ops_address.c | |||
| @@ -337,13 +337,6 @@ out: | |||
| 337 | out_noerror: | 337 | out_noerror: |
| 338 | ret = 0; | 338 | ret = 0; |
| 339 | out_unlock: | 339 | out_unlock: |
| 340 | /* unlock all pages, we can't do any I/O right now */ | ||
| 341 | for (page_idx = 0; page_idx < nr_pages; page_idx++) { | ||
| 342 | struct page *page = list_entry(pages->prev, struct page, lru); | ||
| 343 | list_del(&page->lru); | ||
| 344 | unlock_page(page); | ||
| 345 | page_cache_release(page); | ||
| 346 | } | ||
| 347 | if (do_unlock) | 340 | if (do_unlock) |
| 348 | gfs2_holder_uninit(&gh); | 341 | gfs2_holder_uninit(&gh); |
| 349 | goto out; | 342 | goto out; |
diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c index e9d07704680e..81b8565d3837 100644 --- a/fs/nfsd/nfs4recover.c +++ b/fs/nfsd/nfs4recover.c | |||
| @@ -274,7 +274,7 @@ nfsd4_clear_clid_dir(struct dentry *dir, struct dentry *dentry) | |||
| 274 | * any regular files anyway, just in case the directory was created by | 274 | * any regular files anyway, just in case the directory was created by |
| 275 | * a kernel from the future.... */ | 275 | * a kernel from the future.... */ |
| 276 | nfsd4_list_rec_dir(dentry, nfsd4_remove_clid_file); | 276 | nfsd4_list_rec_dir(dentry, nfsd4_remove_clid_file); |
| 277 | mutex_lock(&dir->d_inode->i_mutex); | 277 | mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT); |
| 278 | status = vfs_rmdir(dir->d_inode, dentry); | 278 | status = vfs_rmdir(dir->d_inode, dentry); |
| 279 | mutex_unlock(&dir->d_inode->i_mutex); | 279 | mutex_unlock(&dir->d_inode->i_mutex); |
| 280 | return status; | 280 | return status; |
diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c index 9041802df832..17249994110f 100644 --- a/fs/reiserfs/super.c +++ b/fs/reiserfs/super.c | |||
| @@ -1619,6 +1619,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent) | |||
| 1619 | "jmacd-8: reiserfs_fill_super: unable to read bitmap"); | 1619 | "jmacd-8: reiserfs_fill_super: unable to read bitmap"); |
| 1620 | goto error; | 1620 | goto error; |
| 1621 | } | 1621 | } |
| 1622 | errval = -EINVAL; | ||
| 1622 | #ifdef CONFIG_REISERFS_CHECK | 1623 | #ifdef CONFIG_REISERFS_CHECK |
| 1623 | SWARN(silent, s, "CONFIG_REISERFS_CHECK is set ON"); | 1624 | SWARN(silent, s, "CONFIG_REISERFS_CHECK is set ON"); |
| 1624 | SWARN(silent, s, "- it is slow mode for debugging."); | 1625 | SWARN(silent, s, "- it is slow mode for debugging."); |
diff --git a/fs/xattr.c b/fs/xattr.c index 395635100f77..0901bdc2ce24 100644 --- a/fs/xattr.c +++ b/fs/xattr.c | |||
| @@ -48,14 +48,21 @@ xattr_permission(struct inode *inode, const char *name, int mask) | |||
| 48 | return 0; | 48 | return 0; |
| 49 | 49 | ||
| 50 | /* | 50 | /* |
| 51 | * The trusted.* namespace can only accessed by a privilegued user. | 51 | * The trusted.* namespace can only be accessed by a privileged user. |
| 52 | */ | 52 | */ |
| 53 | if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) | 53 | if (!strncmp(name, XATTR_TRUSTED_PREFIX, XATTR_TRUSTED_PREFIX_LEN)) |
| 54 | return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); | 54 | return (capable(CAP_SYS_ADMIN) ? 0 : -EPERM); |
| 55 | 55 | ||
| 56 | /* In user.* namespace, only regular files and directories can have | ||
| 57 | * extended attributes. For sticky directories, only the owner and | ||
| 58 | * privileged user can write attributes. | ||
| 59 | */ | ||
| 56 | if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) { | 60 | if (!strncmp(name, XATTR_USER_PREFIX, XATTR_USER_PREFIX_LEN)) { |
| 57 | if (!S_ISREG(inode->i_mode) && | 61 | if (!S_ISREG(inode->i_mode) && !S_ISDIR(inode->i_mode)) |
| 58 | (!S_ISDIR(inode->i_mode) || inode->i_mode & S_ISVTX)) | 62 | return -EPERM; |
| 63 | if (S_ISDIR(inode->i_mode) && (inode->i_mode & S_ISVTX) && | ||
| 64 | (mask & MAY_WRITE) && (current->fsuid != inode->i_uid) && | ||
| 65 | !capable(CAP_FOWNER)) | ||
| 59 | return -EPERM; | 66 | return -EPERM; |
| 60 | } | 67 | } |
| 61 | 68 | ||
