diff options
Diffstat (limited to 'mm/filemap.c')
| -rw-r--r-- | mm/filemap.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index f3e5f8944d17..f5769b4dc075 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
| @@ -1766,7 +1766,7 @@ int should_remove_suid(struct dentry *dentry) | |||
| 1766 | if (unlikely((mode & S_ISGID) && (mode & S_IXGRP))) | 1766 | if (unlikely((mode & S_ISGID) && (mode & S_IXGRP))) |
| 1767 | kill |= ATTR_KILL_SGID; | 1767 | kill |= ATTR_KILL_SGID; |
| 1768 | 1768 | ||
| 1769 | if (unlikely(kill && !capable(CAP_FSETID))) | 1769 | if (unlikely(kill && !capable(CAP_FSETID) && S_ISREG(mode))) |
| 1770 | return kill; | 1770 | return kill; |
| 1771 | 1771 | ||
| 1772 | return 0; | 1772 | return 0; |
| @@ -2140,19 +2140,24 @@ EXPORT_SYMBOL(generic_file_direct_write); | |||
| 2140 | * Find or create a page at the given pagecache position. Return the locked | 2140 | * Find or create a page at the given pagecache position. Return the locked |
| 2141 | * page. This function is specifically for buffered writes. | 2141 | * page. This function is specifically for buffered writes. |
| 2142 | */ | 2142 | */ |
| 2143 | struct page *__grab_cache_page(struct address_space *mapping, pgoff_t index) | 2143 | struct page *grab_cache_page_write_begin(struct address_space *mapping, |
| 2144 | pgoff_t index, unsigned flags) | ||
| 2144 | { | 2145 | { |
| 2145 | int status; | 2146 | int status; |
| 2146 | struct page *page; | 2147 | struct page *page; |
| 2148 | gfp_t gfp_notmask = 0; | ||
| 2149 | if (flags & AOP_FLAG_NOFS) | ||
| 2150 | gfp_notmask = __GFP_FS; | ||
| 2147 | repeat: | 2151 | repeat: |
| 2148 | page = find_lock_page(mapping, index); | 2152 | page = find_lock_page(mapping, index); |
| 2149 | if (likely(page)) | 2153 | if (likely(page)) |
| 2150 | return page; | 2154 | return page; |
| 2151 | 2155 | ||
| 2152 | page = page_cache_alloc(mapping); | 2156 | page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~gfp_notmask); |
| 2153 | if (!page) | 2157 | if (!page) |
| 2154 | return NULL; | 2158 | return NULL; |
| 2155 | status = add_to_page_cache_lru(page, mapping, index, GFP_KERNEL); | 2159 | status = add_to_page_cache_lru(page, mapping, index, |
| 2160 | GFP_KERNEL & ~gfp_notmask); | ||
| 2156 | if (unlikely(status)) { | 2161 | if (unlikely(status)) { |
| 2157 | page_cache_release(page); | 2162 | page_cache_release(page); |
| 2158 | if (status == -EEXIST) | 2163 | if (status == -EEXIST) |
| @@ -2161,7 +2166,7 @@ repeat: | |||
| 2161 | } | 2166 | } |
| 2162 | return page; | 2167 | return page; |
| 2163 | } | 2168 | } |
| 2164 | EXPORT_SYMBOL(__grab_cache_page); | 2169 | EXPORT_SYMBOL(grab_cache_page_write_begin); |
| 2165 | 2170 | ||
| 2166 | static ssize_t generic_perform_write(struct file *file, | 2171 | static ssize_t generic_perform_write(struct file *file, |
| 2167 | struct iov_iter *i, loff_t pos) | 2172 | struct iov_iter *i, loff_t pos) |
