Annotation of /trunk/kernel-magellan/patches-3.10/0100-3.10.1-all-fixes.patch
Parent Directory | Revision Log
Revision 2253 -
(hide annotations)
(download)
Tue Aug 13 14:26:09 2013 UTC (11 years, 1 month ago) by niro
File size: 16388 byte(s)
Tue Aug 13 14:26:09 2013 UTC (11 years, 1 month ago) by niro
File size: 16388 byte(s)
3.10.6-magellan-r1
1 | niro | 2253 | diff --git a/MAINTAINERS b/MAINTAINERS |
2 | index ad7e322..48c7480 100644 | ||
3 | --- a/MAINTAINERS | ||
4 | +++ b/MAINTAINERS | ||
5 | @@ -7667,6 +7667,7 @@ STABLE BRANCH | ||
6 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
7 | L: stable@vger.kernel.org | ||
8 | S: Supported | ||
9 | +F: Documentation/stable_kernel_rules.txt | ||
10 | |||
11 | STAGING SUBSYSTEM | ||
12 | M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | ||
13 | diff --git a/Makefile b/Makefile | ||
14 | index e5e3ba0..b75cc30 100644 | ||
15 | --- a/Makefile | ||
16 | +++ b/Makefile | ||
17 | @@ -1,6 +1,6 @@ | ||
18 | VERSION = 3 | ||
19 | PATCHLEVEL = 10 | ||
20 | -SUBLEVEL = 0 | ||
21 | +SUBLEVEL = 1 | ||
22 | EXTRAVERSION = | ||
23 | NAME = Unicycling Gorilla | ||
24 | |||
25 | diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c | ||
26 | index 260a919..5402c94 100644 | ||
27 | --- a/arch/x86/kvm/vmx.c | ||
28 | +++ b/arch/x86/kvm/vmx.c | ||
29 | @@ -3399,15 +3399,22 @@ static void vmx_get_segment(struct kvm_vcpu *vcpu, | ||
30 | var->limit = vmx_read_guest_seg_limit(vmx, seg); | ||
31 | var->selector = vmx_read_guest_seg_selector(vmx, seg); | ||
32 | ar = vmx_read_guest_seg_ar(vmx, seg); | ||
33 | + var->unusable = (ar >> 16) & 1; | ||
34 | var->type = ar & 15; | ||
35 | var->s = (ar >> 4) & 1; | ||
36 | var->dpl = (ar >> 5) & 3; | ||
37 | - var->present = (ar >> 7) & 1; | ||
38 | + /* | ||
39 | + * Some userspaces do not preserve unusable property. Since usable | ||
40 | + * segment has to be present according to VMX spec we can use present | ||
41 | + * property to amend userspace bug by making unusable segment always | ||
42 | + * nonpresent. vmx_segment_access_rights() already marks nonpresent | ||
43 | + * segment as unusable. | ||
44 | + */ | ||
45 | + var->present = !var->unusable; | ||
46 | var->avl = (ar >> 12) & 1; | ||
47 | var->l = (ar >> 13) & 1; | ||
48 | var->db = (ar >> 14) & 1; | ||
49 | var->g = (ar >> 15) & 1; | ||
50 | - var->unusable = (ar >> 16) & 1; | ||
51 | } | ||
52 | |||
53 | static u64 vmx_get_segment_base(struct kvm_vcpu *vcpu, int seg) | ||
54 | diff --git a/block/genhd.c b/block/genhd.c | ||
55 | index 20625ee..cdeb527 100644 | ||
56 | --- a/block/genhd.c | ||
57 | +++ b/block/genhd.c | ||
58 | @@ -512,7 +512,7 @@ static void register_disk(struct gendisk *disk) | ||
59 | |||
60 | ddev->parent = disk->driverfs_dev; | ||
61 | |||
62 | - dev_set_name(ddev, disk->disk_name); | ||
63 | + dev_set_name(ddev, "%s", disk->disk_name); | ||
64 | |||
65 | /* delay uevents, until we scanned partition table */ | ||
66 | dev_set_uevent_suppress(ddev, 1); | ||
67 | diff --git a/crypto/algapi.c b/crypto/algapi.c | ||
68 | index 6149a6e..7a1ae87 100644 | ||
69 | --- a/crypto/algapi.c | ||
70 | +++ b/crypto/algapi.c | ||
71 | @@ -495,7 +495,8 @@ static struct crypto_template *__crypto_lookup_template(const char *name) | ||
72 | |||
73 | struct crypto_template *crypto_lookup_template(const char *name) | ||
74 | { | ||
75 | - return try_then_request_module(__crypto_lookup_template(name), name); | ||
76 | + return try_then_request_module(__crypto_lookup_template(name), "%s", | ||
77 | + name); | ||
78 | } | ||
79 | EXPORT_SYMBOL_GPL(crypto_lookup_template); | ||
80 | |||
81 | diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c | ||
82 | index 037288e..46b35f7 100644 | ||
83 | --- a/drivers/block/nbd.c | ||
84 | +++ b/drivers/block/nbd.c | ||
85 | @@ -714,7 +714,8 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd, | ||
86 | else | ||
87 | blk_queue_flush(nbd->disk->queue, 0); | ||
88 | |||
89 | - thread = kthread_create(nbd_thread, nbd, nbd->disk->disk_name); | ||
90 | + thread = kthread_create(nbd_thread, nbd, "%s", | ||
91 | + nbd->disk->disk_name); | ||
92 | if (IS_ERR(thread)) { | ||
93 | mutex_lock(&nbd->tx_lock); | ||
94 | return PTR_ERR(thread); | ||
95 | diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c | ||
96 | index d620b44..8a3aff7 100644 | ||
97 | --- a/drivers/cdrom/cdrom.c | ||
98 | +++ b/drivers/cdrom/cdrom.c | ||
99 | @@ -2882,7 +2882,7 @@ static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi, | ||
100 | if (lba < 0) | ||
101 | return -EINVAL; | ||
102 | |||
103 | - cgc->buffer = kmalloc(blocksize, GFP_KERNEL); | ||
104 | + cgc->buffer = kzalloc(blocksize, GFP_KERNEL); | ||
105 | if (cgc->buffer == NULL) | ||
106 | return -ENOMEM; | ||
107 | |||
108 | diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c | ||
109 | index fb65dec..591b6fb 100644 | ||
110 | --- a/drivers/cpufreq/cpufreq_stats.c | ||
111 | +++ b/drivers/cpufreq/cpufreq_stats.c | ||
112 | @@ -349,6 +349,7 @@ static int __cpuinit cpufreq_stat_cpu_callback(struct notifier_block *nfb, | ||
113 | |||
114 | switch (action) { | ||
115 | case CPU_ONLINE: | ||
116 | + case CPU_ONLINE_FROZEN: | ||
117 | cpufreq_update_policy(cpu); | ||
118 | break; | ||
119 | case CPU_DOWN_PREPARE: | ||
120 | diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c | ||
121 | index fefc39f..98de1dd 100644 | ||
122 | --- a/drivers/power/charger-manager.c | ||
123 | +++ b/drivers/power/charger-manager.c | ||
124 | @@ -450,7 +450,7 @@ static void uevent_notify(struct charger_manager *cm, const char *event) | ||
125 | strncpy(env_str, event, UEVENT_BUF_SIZE); | ||
126 | kobject_uevent(&cm->dev->kobj, KOBJ_CHANGE); | ||
127 | |||
128 | - dev_info(cm->dev, event); | ||
129 | + dev_info(cm->dev, "%s", event); | ||
130 | } | ||
131 | |||
132 | /** | ||
133 | diff --git a/drivers/scsi/osd/osd_uld.c b/drivers/scsi/osd/osd_uld.c | ||
134 | index 0fab6b5..9d86947 100644 | ||
135 | --- a/drivers/scsi/osd/osd_uld.c | ||
136 | +++ b/drivers/scsi/osd/osd_uld.c | ||
137 | @@ -485,7 +485,7 @@ static int osd_probe(struct device *dev) | ||
138 | oud->class_dev.class = &osd_uld_class; | ||
139 | oud->class_dev.parent = dev; | ||
140 | oud->class_dev.release = __remove; | ||
141 | - error = dev_set_name(&oud->class_dev, disk->disk_name); | ||
142 | + error = dev_set_name(&oud->class_dev, "%s", disk->disk_name); | ||
143 | if (error) { | ||
144 | OSD_ERR("dev_set_name failed => %d\n", error); | ||
145 | goto err_put_cdev; | ||
146 | diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c | ||
147 | index c1c5552..6f6a1b4 100644 | ||
148 | --- a/drivers/scsi/sd.c | ||
149 | +++ b/drivers/scsi/sd.c | ||
150 | @@ -142,7 +142,7 @@ sd_store_cache_type(struct device *dev, struct device_attribute *attr, | ||
151 | char *buffer_data; | ||
152 | struct scsi_mode_data data; | ||
153 | struct scsi_sense_hdr sshdr; | ||
154 | - const char *temp = "temporary "; | ||
155 | + static const char temp[] = "temporary "; | ||
156 | int len; | ||
157 | |||
158 | if (sdp->type != TYPE_DISK) | ||
159 | diff --git a/drivers/tty/serial/8250/8250_pci.c b/drivers/tty/serial/8250/8250_pci.c | ||
160 | index 26e3a97..c52948b 100644 | ||
161 | --- a/drivers/tty/serial/8250/8250_pci.c | ||
162 | +++ b/drivers/tty/serial/8250/8250_pci.c | ||
163 | @@ -4797,10 +4797,6 @@ static struct pci_device_id serial_pci_tbl[] = { | ||
164 | PCI_VENDOR_ID_IBM, 0x0299, | ||
165 | 0, 0, pbn_b0_bt_2_115200 }, | ||
166 | |||
167 | - { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835, | ||
168 | - 0x1000, 0x0012, | ||
169 | - 0, 0, pbn_b0_bt_2_115200 }, | ||
170 | - | ||
171 | { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9901, | ||
172 | 0xA000, 0x1000, | ||
173 | 0, 0, pbn_b0_1_115200 }, | ||
174 | diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c | ||
175 | index 6464029..4476682 100644 | ||
176 | --- a/drivers/tty/tty_io.c | ||
177 | +++ b/drivers/tty/tty_io.c | ||
178 | @@ -1618,6 +1618,8 @@ static void release_tty(struct tty_struct *tty, int idx) | ||
179 | tty_free_termios(tty); | ||
180 | tty_driver_remove_tty(tty->driver, tty); | ||
181 | tty->port->itty = NULL; | ||
182 | + if (tty->link) | ||
183 | + tty->link->port->itty = NULL; | ||
184 | cancel_work_sync(&tty->port->buf.work); | ||
185 | |||
186 | if (tty->link) | ||
187 | diff --git a/fs/ceph/xattr.c b/fs/ceph/xattr.c | ||
188 | index 9b6b2b6..be661d8 100644 | ||
189 | --- a/fs/ceph/xattr.c | ||
190 | +++ b/fs/ceph/xattr.c | ||
191 | @@ -675,17 +675,18 @@ ssize_t ceph_getxattr(struct dentry *dentry, const char *name, void *value, | ||
192 | if (!ceph_is_valid_xattr(name)) | ||
193 | return -ENODATA; | ||
194 | |||
195 | - spin_lock(&ci->i_ceph_lock); | ||
196 | - dout("getxattr %p ver=%lld index_ver=%lld\n", inode, | ||
197 | - ci->i_xattrs.version, ci->i_xattrs.index_version); | ||
198 | |||
199 | /* let's see if a virtual xattr was requested */ | ||
200 | vxattr = ceph_match_vxattr(inode, name); | ||
201 | if (vxattr && !(vxattr->exists_cb && !vxattr->exists_cb(ci))) { | ||
202 | err = vxattr->getxattr_cb(ci, value, size); | ||
203 | - goto out; | ||
204 | + return err; | ||
205 | } | ||
206 | |||
207 | + spin_lock(&ci->i_ceph_lock); | ||
208 | + dout("getxattr %p ver=%lld index_ver=%lld\n", inode, | ||
209 | + ci->i_xattrs.version, ci->i_xattrs.index_version); | ||
210 | + | ||
211 | if (__ceph_caps_issued_mask(ci, CEPH_CAP_XATTR_SHARED, 1) && | ||
212 | (ci->i_xattrs.index_version >= ci->i_xattrs.version)) { | ||
213 | goto get_xattr; | ||
214 | diff --git a/fs/hpfs/map.c b/fs/hpfs/map.c | ||
215 | index 4acb19d..803d3da 100644 | ||
216 | --- a/fs/hpfs/map.c | ||
217 | +++ b/fs/hpfs/map.c | ||
218 | @@ -17,7 +17,8 @@ __le32 *hpfs_map_bitmap(struct super_block *s, unsigned bmp_block, | ||
219 | struct quad_buffer_head *qbh, char *id) | ||
220 | { | ||
221 | secno sec; | ||
222 | - if (hpfs_sb(s)->sb_chk) if (bmp_block * 16384 > hpfs_sb(s)->sb_fs_size) { | ||
223 | + unsigned n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14; | ||
224 | + if (hpfs_sb(s)->sb_chk) if (bmp_block >= n_bands) { | ||
225 | hpfs_error(s, "hpfs_map_bitmap called with bad parameter: %08x at %s", bmp_block, id); | ||
226 | return NULL; | ||
227 | } | ||
228 | diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c | ||
229 | index a0617e7..962e90c 100644 | ||
230 | --- a/fs/hpfs/super.c | ||
231 | +++ b/fs/hpfs/super.c | ||
232 | @@ -558,7 +558,13 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | ||
233 | sbi->sb_cp_table = NULL; | ||
234 | sbi->sb_c_bitmap = -1; | ||
235 | sbi->sb_max_fwd_alloc = 0xffffff; | ||
236 | - | ||
237 | + | ||
238 | + if (sbi->sb_fs_size >= 0x80000000) { | ||
239 | + hpfs_error(s, "invalid size in superblock: %08x", | ||
240 | + (unsigned)sbi->sb_fs_size); | ||
241 | + goto bail4; | ||
242 | + } | ||
243 | + | ||
244 | /* Load bitmap directory */ | ||
245 | if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, le32_to_cpu(superblock->bitmaps)))) | ||
246 | goto bail4; | ||
247 | diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c | ||
248 | index 1fab140..2c37442 100644 | ||
249 | --- a/fs/nfs/nfs4state.c | ||
250 | +++ b/fs/nfs/nfs4state.c | ||
251 | @@ -228,19 +228,8 @@ static int nfs41_setup_state_renewal(struct nfs_client *clp) | ||
252 | return status; | ||
253 | } | ||
254 | |||
255 | -/* | ||
256 | - * Back channel returns NFS4ERR_DELAY for new requests when | ||
257 | - * NFS4_SESSION_DRAINING is set so there is no work to be done when draining | ||
258 | - * is ended. | ||
259 | - */ | ||
260 | -static void nfs4_end_drain_session(struct nfs_client *clp) | ||
261 | +static void nfs4_end_drain_slot_table(struct nfs4_slot_table *tbl) | ||
262 | { | ||
263 | - struct nfs4_session *ses = clp->cl_session; | ||
264 | - struct nfs4_slot_table *tbl; | ||
265 | - | ||
266 | - if (ses == NULL) | ||
267 | - return; | ||
268 | - tbl = &ses->fc_slot_table; | ||
269 | if (test_and_clear_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state)) { | ||
270 | spin_lock(&tbl->slot_tbl_lock); | ||
271 | nfs41_wake_slot_table(tbl); | ||
272 | @@ -248,6 +237,16 @@ static void nfs4_end_drain_session(struct nfs_client *clp) | ||
273 | } | ||
274 | } | ||
275 | |||
276 | +static void nfs4_end_drain_session(struct nfs_client *clp) | ||
277 | +{ | ||
278 | + struct nfs4_session *ses = clp->cl_session; | ||
279 | + | ||
280 | + if (ses != NULL) { | ||
281 | + nfs4_end_drain_slot_table(&ses->bc_slot_table); | ||
282 | + nfs4_end_drain_slot_table(&ses->fc_slot_table); | ||
283 | + } | ||
284 | +} | ||
285 | + | ||
286 | /* | ||
287 | * Signal state manager thread if session fore channel is drained | ||
288 | */ | ||
289 | diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c | ||
290 | index 6cd86e0..582321a 100644 | ||
291 | --- a/fs/nfsd/nfs4xdr.c | ||
292 | +++ b/fs/nfsd/nfs4xdr.c | ||
293 | @@ -162,8 +162,8 @@ static __be32 *read_buf(struct nfsd4_compoundargs *argp, u32 nbytes) | ||
294 | */ | ||
295 | memcpy(p, argp->p, avail); | ||
296 | /* step to next page */ | ||
297 | - argp->p = page_address(argp->pagelist[0]); | ||
298 | argp->pagelist++; | ||
299 | + argp->p = page_address(argp->pagelist[0]); | ||
300 | if (argp->pagelen < PAGE_SIZE) { | ||
301 | argp->end = argp->p + (argp->pagelen>>2); | ||
302 | argp->pagelen = 0; | ||
303 | diff --git a/include/linux/ceph/decode.h b/include/linux/ceph/decode.h | ||
304 | index 379f715..0442c3d 100644 | ||
305 | --- a/include/linux/ceph/decode.h | ||
306 | +++ b/include/linux/ceph/decode.h | ||
307 | @@ -160,11 +160,6 @@ static inline void ceph_decode_timespec(struct timespec *ts, | ||
308 | static inline void ceph_encode_timespec(struct ceph_timespec *tv, | ||
309 | const struct timespec *ts) | ||
310 | { | ||
311 | - BUG_ON(ts->tv_sec < 0); | ||
312 | - BUG_ON(ts->tv_sec > (__kernel_time_t)U32_MAX); | ||
313 | - BUG_ON(ts->tv_nsec < 0); | ||
314 | - BUG_ON(ts->tv_nsec > (long)U32_MAX); | ||
315 | - | ||
316 | tv->tv_sec = cpu_to_le32((u32)ts->tv_sec); | ||
317 | tv->tv_nsec = cpu_to_le32((u32)ts->tv_nsec); | ||
318 | } | ||
319 | diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h | ||
320 | index 6b4890f..feaf0c7 100644 | ||
321 | --- a/include/linux/hugetlb.h | ||
322 | +++ b/include/linux/hugetlb.h | ||
323 | @@ -358,6 +358,17 @@ static inline int hstate_index(struct hstate *h) | ||
324 | return h - hstates; | ||
325 | } | ||
326 | |||
327 | +pgoff_t __basepage_index(struct page *page); | ||
328 | + | ||
329 | +/* Return page->index in PAGE_SIZE units */ | ||
330 | +static inline pgoff_t basepage_index(struct page *page) | ||
331 | +{ | ||
332 | + if (!PageCompound(page)) | ||
333 | + return page->index; | ||
334 | + | ||
335 | + return __basepage_index(page); | ||
336 | +} | ||
337 | + | ||
338 | #else /* CONFIG_HUGETLB_PAGE */ | ||
339 | struct hstate {}; | ||
340 | #define alloc_huge_page_node(h, nid) NULL | ||
341 | @@ -378,6 +389,11 @@ static inline unsigned int pages_per_huge_page(struct hstate *h) | ||
342 | } | ||
343 | #define hstate_index_to_shift(index) 0 | ||
344 | #define hstate_index(h) 0 | ||
345 | + | ||
346 | +static inline pgoff_t basepage_index(struct page *page) | ||
347 | +{ | ||
348 | + return page->index; | ||
349 | +} | ||
350 | #endif /* CONFIG_HUGETLB_PAGE */ | ||
351 | |||
352 | #endif /* _LINUX_HUGETLB_H */ | ||
353 | diff --git a/kernel/futex.c b/kernel/futex.c | ||
354 | index b26dcfc..49dacfb 100644 | ||
355 | --- a/kernel/futex.c | ||
356 | +++ b/kernel/futex.c | ||
357 | @@ -61,6 +61,7 @@ | ||
358 | #include <linux/nsproxy.h> | ||
359 | #include <linux/ptrace.h> | ||
360 | #include <linux/sched/rt.h> | ||
361 | +#include <linux/hugetlb.h> | ||
362 | |||
363 | #include <asm/futex.h> | ||
364 | |||
365 | @@ -365,7 +366,7 @@ again: | ||
366 | } else { | ||
367 | key->both.offset |= FUT_OFF_INODE; /* inode-based key */ | ||
368 | key->shared.inode = page_head->mapping->host; | ||
369 | - key->shared.pgoff = page_head->index; | ||
370 | + key->shared.pgoff = basepage_index(page); | ||
371 | } | ||
372 | |||
373 | get_futex_key_refs(key); | ||
374 | diff --git a/kernel/module.c b/kernel/module.c | ||
375 | index cab4bce..fa53db8 100644 | ||
376 | --- a/kernel/module.c | ||
377 | +++ b/kernel/module.c | ||
378 | @@ -2927,7 +2927,6 @@ static struct module *layout_and_allocate(struct load_info *info, int flags) | ||
379 | { | ||
380 | /* Module within temporary copy. */ | ||
381 | struct module *mod; | ||
382 | - Elf_Shdr *pcpusec; | ||
383 | int err; | ||
384 | |||
385 | mod = setup_load_info(info, flags); | ||
386 | @@ -2942,17 +2941,10 @@ static struct module *layout_and_allocate(struct load_info *info, int flags) | ||
387 | err = module_frob_arch_sections(info->hdr, info->sechdrs, | ||
388 | info->secstrings, mod); | ||
389 | if (err < 0) | ||
390 | - goto out; | ||
391 | + return ERR_PTR(err); | ||
392 | |||
393 | - pcpusec = &info->sechdrs[info->index.pcpu]; | ||
394 | - if (pcpusec->sh_size) { | ||
395 | - /* We have a special allocation for this section. */ | ||
396 | - err = percpu_modalloc(mod, | ||
397 | - pcpusec->sh_size, pcpusec->sh_addralign); | ||
398 | - if (err) | ||
399 | - goto out; | ||
400 | - pcpusec->sh_flags &= ~(unsigned long)SHF_ALLOC; | ||
401 | - } | ||
402 | + /* We will do a special allocation for per-cpu sections later. */ | ||
403 | + info->sechdrs[info->index.pcpu].sh_flags &= ~(unsigned long)SHF_ALLOC; | ||
404 | |||
405 | /* Determine total sizes, and put offsets in sh_entsize. For now | ||
406 | this is done generically; there doesn't appear to be any | ||
407 | @@ -2963,17 +2955,22 @@ static struct module *layout_and_allocate(struct load_info *info, int flags) | ||
408 | /* Allocate and move to the final place */ | ||
409 | err = move_module(mod, info); | ||
410 | if (err) | ||
411 | - goto free_percpu; | ||
412 | + return ERR_PTR(err); | ||
413 | |||
414 | /* Module has been copied to its final place now: return it. */ | ||
415 | mod = (void *)info->sechdrs[info->index.mod].sh_addr; | ||
416 | kmemleak_load_module(mod, info); | ||
417 | return mod; | ||
418 | +} | ||
419 | |||
420 | -free_percpu: | ||
421 | - percpu_modfree(mod); | ||
422 | -out: | ||
423 | - return ERR_PTR(err); | ||
424 | +static int alloc_module_percpu(struct module *mod, struct load_info *info) | ||
425 | +{ | ||
426 | + Elf_Shdr *pcpusec = &info->sechdrs[info->index.pcpu]; | ||
427 | + if (!pcpusec->sh_size) | ||
428 | + return 0; | ||
429 | + | ||
430 | + /* We have a special allocation for this section. */ | ||
431 | + return percpu_modalloc(mod, pcpusec->sh_size, pcpusec->sh_addralign); | ||
432 | } | ||
433 | |||
434 | /* mod is no longer valid after this! */ | ||
435 | @@ -3237,6 +3234,11 @@ static int load_module(struct load_info *info, const char __user *uargs, | ||
436 | } | ||
437 | #endif | ||
438 | |||
439 | + /* To avoid stressing percpu allocator, do this once we're unique. */ | ||
440 | + err = alloc_module_percpu(mod, info); | ||
441 | + if (err) | ||
442 | + goto unlink_mod; | ||
443 | + | ||
444 | /* Now module is in final location, initialize linked lists, etc. */ | ||
445 | err = module_unload_init(mod); | ||
446 | if (err) | ||
447 | diff --git a/mm/hugetlb.c b/mm/hugetlb.c | ||
448 | index e2bfbf7..5cf99bf 100644 | ||
449 | --- a/mm/hugetlb.c | ||
450 | +++ b/mm/hugetlb.c | ||
451 | @@ -690,6 +690,23 @@ int PageHuge(struct page *page) | ||
452 | } | ||
453 | EXPORT_SYMBOL_GPL(PageHuge); | ||
454 | |||
455 | +pgoff_t __basepage_index(struct page *page) | ||
456 | +{ | ||
457 | + struct page *page_head = compound_head(page); | ||
458 | + pgoff_t index = page_index(page_head); | ||
459 | + unsigned long compound_idx; | ||
460 | + | ||
461 | + if (!PageHuge(page_head)) | ||
462 | + return page_index(page); | ||
463 | + | ||
464 | + if (compound_order(page_head) >= MAX_ORDER) | ||
465 | + compound_idx = page_to_pfn(page) - page_to_pfn(page_head); | ||
466 | + else | ||
467 | + compound_idx = page - page_head; | ||
468 | + | ||
469 | + return (index << compound_order(page_head)) + compound_idx; | ||
470 | +} | ||
471 | + | ||
472 | static struct page *alloc_fresh_huge_page_node(struct hstate *h, int nid) | ||
473 | { | ||
474 | struct page *page; | ||
475 | diff --git a/mm/memcontrol.c b/mm/memcontrol.c | ||
476 | index 1947218..fd79df5 100644 | ||
477 | --- a/mm/memcontrol.c | ||
478 | +++ b/mm/memcontrol.c | ||
479 | @@ -6303,8 +6303,6 @@ mem_cgroup_css_online(struct cgroup *cont) | ||
480 | * call __mem_cgroup_free, so return directly | ||
481 | */ | ||
482 | mem_cgroup_put(memcg); | ||
483 | - if (parent->use_hierarchy) | ||
484 | - mem_cgroup_put(parent); | ||
485 | } | ||
486 | return error; | ||
487 | } | ||
488 | diff --git a/net/ceph/auth_none.c b/net/ceph/auth_none.c | ||
489 | index 925ca58..8c93fa8 100644 | ||
490 | --- a/net/ceph/auth_none.c | ||
491 | +++ b/net/ceph/auth_none.c | ||
492 | @@ -39,6 +39,11 @@ static int should_authenticate(struct ceph_auth_client *ac) | ||
493 | return xi->starting; | ||
494 | } | ||
495 | |||
496 | +static int build_request(struct ceph_auth_client *ac, void *buf, void *end) | ||
497 | +{ | ||
498 | + return 0; | ||
499 | +} | ||
500 | + | ||
501 | /* | ||
502 | * the generic auth code decode the global_id, and we carry no actual | ||
503 | * authenticate state, so nothing happens here. | ||
504 | @@ -106,6 +111,7 @@ static const struct ceph_auth_client_ops ceph_auth_none_ops = { | ||
505 | .destroy = destroy, | ||
506 | .is_authenticated = is_authenticated, | ||
507 | .should_authenticate = should_authenticate, | ||
508 | + .build_request = build_request, | ||
509 | .handle_reply = handle_reply, | ||
510 | .create_authorizer = ceph_auth_none_create_authorizer, | ||
511 | .destroy_authorizer = ceph_auth_none_destroy_authorizer, |