nfs/filelayout: pin lseg until dsaddr has been set
Subsystems (2)
PATCH 1/1 nfs/filelayout: pin lseg until dsaddr has been set
We're occasionally seeing the following oops with the filelayout driver:
[ 1967.645207] BUG: unable to handle kernel NULL pointer dereference at 0000000000000030 [ 1967.646010] IP: [<ffffffffc06d6aea>] nfs4_put_deviceid_node+0xa/0x90 [nfsv4] [ 1967.646010] PGD c08bc067 PUD 915d3067 PMD 0 [ 1967.753036] Oops: 0000 [#1] SMP [ 1967.753036] Modules linked in: nfs_layout_nfsv41_files ext4 mbcache jbd2 loop rpcsec_gss_krb5 nfsv4 dns_resolver nfs fscache amd64_edac_mod ipmi_ssif edac_mce_amd edac_core kvm_amd sg kvm ipmi_si ipmi_devintf irqbypass pcspkr k8temp ipmi_msghandler i2c_piix4 shpchp nfsd auth_rpcgss nfs_acl lockd grace sunrpc ip_tables xfs libcrc32c sd_mod crc_t10dif crct10dif_generic crct10dif_common amdkfd amd_iommu_v2 radeon i2c_algo_bit drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops mptsas ttm scsi_transport_sas mptscsih drm mptbase serio_raw i2c_core bnx2 dm_mirror dm_region_hash dm_log dm_mod [ 1967.790031] CPU: 2 PID: 1370 Comm: ls Not tainted 3.10.0-709.el7.test.bz1463784.x86_64 #1 [ 1967.790031] Hardware name: IBM BladeCenter LS21 -[7971AC1]-/Server Blade, BIOS -[BAE155AUS-1.10]- 06/03/2009 [ 1967.790031] task: ffff8800c42a3f40 ti: ffff8800c4064000 task.ti: ffff8800c4064000 [ 1967.790031] RIP: 0010:[<ffffffffc06d6aea>] [<ffffffffc06d6aea>] nfs4_put_deviceid_node+0xa/0x90 [nfsv4] [ 1967.790031] RSP: 0000:ffff8800c4067978 EFLAGS: 00010246 [ 1967.790031] RAX: ffffffffc062f000 RBX: ffff8801d468a540 RCX: dead000000000200 [ 1967.790031] RDX: ffff8800c40679f8 RSI: ffff8800c4067a0c RDI: 0000000000000000 [ 1967.790031] RBP: ffff8800c4067980 R08: ffff8801d468a540 R09: 0000000000000000 [ 1967.790031] R10: 0000000000000000 R11: ffffffffffffffff R12: ffff8801d468a540 [ 1967.790031] R13: ffff8800c40679f8 R14: ffff8801d5645300 R15: ffff880126f15ff0 [ 1967.790031] FS: 00007f11053c9800(0000) GS:ffff88012bd00000(0000) knlGS:0000000000000000 [ 1967.790031] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b [ 1967.790031] CR2: 0000000000000030 CR3: 0000000094b55000 CR4: 00000000000007e0 [ 1967.790031] Stack: [ 1967.790031] ffff8801d468a540 ffff8800c4067990 ffffffffc062d2fe ffff8800c40679b0 [ 1967.790031] ffffffffc062b5b4 ffff8800c40679f8 ffff8801d468a540 ffff8800c40679d8 [ 1967.790031] ffffffffc06d39af ffff8800c40679f8 ffff880126f16078 0000000000000001 [ 1967.790031] Call Trace: [ 1967.790031] [<ffffffffc062d2fe>] nfs4_fl_put_deviceid+0xe/0x10 [nfs_layout_nfsv41_files] [ 1967.790031] [<ffffffffc062b5b4>] filelayout_free_lseg+0x24/0x90 [nfs_layout_nfsv41_files] [ 1967.790031] [<ffffffffc06d39af>] pnfs_free_lseg_list+0x5f/0x80 [nfsv4] [ 1967.790031] [<ffffffffc06d5a67>] _pnfs_return_layout+0x157/0x270 [nfsv4] [ 1967.790031] [<ffffffffc06c17dd>] nfs4_evict_inode+0x4d/0x70 [nfsv4] [ 1967.790031] [<ffffffff8121de19>] evict+0xa9/0x180 [ 1967.790031] [<ffffffff8121e729>] iput+0xf9/0x190 [ 1967.790031] [<ffffffffc0652cea>] nfs_dentry_iput+0x3a/0x50 [nfs] [ 1967.790031] [<ffffffff8121ab4f>] shrink_dentry_list+0x20f/0x490 [ 1967.790031] [<ffffffff8121b018>] d_invalidate+0xd8/0x150 [ 1967.790031] [<ffffffffc065446b>] nfs_readdir_page_filler+0x40b/0x600 [nfs] [ 1967.790031] [<ffffffffc0654bbd>] nfs_readdir_xdr_to_array+0x20d/0x3b0 [nfs] [ 1967.790031] [<ffffffff811f3482>] ? __mem_cgroup_commit_charge+0xe2/0x2f0 [ 1967.790031] [<ffffffff81183208>] ? __add_to_page_cache_locked+0x48/0x170 [ 1967.790031] [<ffffffffc0654d60>] ? nfs_readdir_xdr_to_array+0x3b0/0x3b0 [nfs] [ 1967.790031] [<ffffffffc0654d82>] nfs_readdir_filler+0x22/0x90 [nfs] [ 1967.790031] [<ffffffff8118351f>] do_read_cache_page+0x7f/0x190 [ 1967.790031] [<ffffffff81215d30>] ? fillonedir+0xe0/0xe0 [ 1967.790031] [<ffffffff8118366c>] read_cache_page+0x1c/0x30 [ 1967.790031] [<ffffffffc0654f9b>] nfs_readdir+0x1ab/0x6b0 [nfs] [ 1967.790031] [<ffffffffc06bd1c0>] ? nfs4_xdr_dec_layoutget+0x270/0x270 [nfsv4] [ 1967.790031] [<ffffffff81215d30>] ? fillonedir+0xe0/0xe0 [ 1967.790031] [<ffffffff81215c20>] vfs_readdir+0xb0/0xe0 [ 1967.790031] [<ffffffff81216045>] SyS_getdents+0x95/0x120 [ 1967.790031] [<ffffffff816b9449>] system_call_fastpath+0x16/0x1b [ 1967.790031] Code: 90 31 d2 48 89 d0 5d c3 85 f6 74 f5 8d 4e 01 89 f0 f0 0f b1 0f 39 f0 74 e2 89 c6 eb eb 0f 1f 40 00 66 66 66 66 90 55 48 89 e5 53 <48> 8b 47 30 48 89 fb a8 04 74 3b 8b 57 60 83 fa 02 74 19 8d 4a [ 1967.790031] RIP [<ffffffffc06d6aea>] nfs4_put_deviceid_node+0xa/0x90 [nfsv4] [ 1967.790031] RSP <ffff8800c4067978> [ 1967.790031] CR2: 0000000000000030
Since a filelayout segment is initially inserted with a NULL dsaddr, it looks like there's a window where filelayout_free_lseg() (e.g. via nfs4_evict_inode() called by another process) can be called which will trigger an oops in nfs4_put_deviceid_node() when it tries to access the nfs4_deviceid_node->flags. Take an extra reference on the layout segment to prevent that, and check for a NULL dsaddr in filelayout_free_lseg().
--- fs/nfs/filelayout/filelayout.c | 18 +++++++++++++++++- fs/nfs/pnfs.c | 6 ++++-- fs/nfs/pnfs.h | 4 ++++ 3 files changed, 25 insertions(+), 3 deletions(-)
fs/nfs/filelayout/filelayout.c +17 -1
@@ -579,6 +579,9 @@ filelayout_check_deviceid(struct pnfs_layout_hdr *lo,*/ if (cmpxchg (&fl->dsaddr,NULL , dsaddr) !=NULL ) goto out_put; +else +/* Matched by pnfs_get_lseg in filelayout_add_lseg */ +pnfs_put_lseg (&fl->generic_hdr); out:return status; out_put:
@@ -645,6 +648,17 @@ static void _filelayout_free_lseg(struct nfs4_filelayout_segment *fl)kfree (fl); } +static void +filelayout_add_lseg (struct pnfs_layout_hdr *lo, +struct pnfs_layout_segment *lseg, +struct list_head *free_me) +{ +/* Matched by pnfs_put_lseg in filelayout_check_deviceid */ +pnfs_get_lseg (lseg); +pnfs_generic_layout_insert_lseg (lo, lseg, pnfs_lseg_range_is_after, + pnfs_lseg_no_merge, free_me); +} + static int filelayout_decode_layout(struct pnfs_layout_hdr *flo, struct nfs4_filelayout_segment *fl,
@@ -745,7 +759,8 @@ filelayout_free_lseg(struct pnfs_layout_segment *lseg)struct nfs4_filelayout_segment *fl =FILELAYOUT_LSEG (lseg);dprintk ("--> %s\n" , __func__); -nfs4_fl_put_deviceid (fl->dsaddr); +if (fl->dsaddr !=NULL ) +nfs4_fl_put_deviceid (fl->dsaddr);/* This assumes a single RW lseg */ if (lseg->pls_range.iomode ==IOMODE_RW ) {struct nfs4_filelayout *flo;
@@ -1169,6 +1184,7 @@ static struct pnfs_layoutdriver_type filelayout_type = { .free_layout_hdr = filelayout_free_layout_hdr, .alloc_lseg = filelayout_alloc_lseg, .free_lseg = filelayout_free_lseg, + .add_lseg = filelayout_add_lseg, .pg_read_ops = &filelayout_pg_read_ops, .pg_write_ops = &filelayout_pg_write_ops, .get_ds_info = &filelayout_get_ds_info,
fs/nfs/pnfs.c +4 -2
@@ -1366,19 +1366,21 @@ pnfs_lseg_range_cmp(const struct pnfs_layout_range *l1,return (int )(l1->iomode ==IOMODE_READ ) - (int )(l2->iomode ==IOMODE_READ ); } -static bool +bool pnfs_lseg_range_is_after (const struct pnfs_layout_range *l1,const struct pnfs_layout_range *l2) {return pnfs_lseg_range_cmp (l1, l2) >0 ; } +EXPORT_SYMBOL_GPL (pnfs_lseg_range_is_after); -static bool +bool pnfs_lseg_no_merge (struct pnfs_layout_segment *lseg,struct pnfs_layout_segment *old) {return false; } +EXPORT_SYMBOL_GPL (pnfs_lseg_no_merge); void pnfs_generic_layout_insert_lseg(struct pnfs_layout_hdr *lo,
fs/nfs/pnfs.h +4 -0
@@ -295,6 +295,10 @@ void pnfs_layoutreturn_free_lsegs(struct pnfs_layout_hdr *lo,const struct pnfs_layout_range *range, const nfs4_stateid *stateid); +bool pnfs_lseg_range_is_after (const struct pnfs_layout_range *l1, +const struct pnfs_layout_range *l2); +bool pnfs_lseg_no_merge (struct pnfs_layout_segment *lseg, +struct pnfs_layout_segment *old); void pnfs_generic_layout_insert_lseg(struct pnfs_layout_hdr *lo, struct pnfs_layout_segment *lseg, bool (*is_after)(const struct pnfs_layout_range *lseg_range,
Signature · 1 line
2.9.5
T24gRnJpLCAyMDE3LTA5LTIyIGF0IDE2OjE1IC0wNDAwLCBTY290dCBNYXloZXcgd3JvdGU6DQo+ IFdlJ3JlIG9jY2FzaW9uYWxseSBzZWVpbmcgdGhlIGZvbGxvd2luZyBvb3BzIHdpdGggdGhlIGZp bGVsYXlvdXQNCj4gZHJpdmVyOg0KPiANCj4gWyAxOTY3LjY0NTIwN10gQlVHOiB1bmFibGUgdG8g aGFuZGxlIGtlcm5lbCBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UNCj4gYXQgMDAwMDAwMDAwMDAw MDAzMA0KPiBbIDE5NjcuNjQ2MDEwXSBJUDogWzxmZmZmZmZmZmMwNmQ2YWVhPl0NCj4gbmZzNF9w dXRfZGV2aWNlaWRfbm9kZSsweGEvMHg5MCBbbmZzdjRdDQo+IFsgMTk2Ny42NDYwMTBdIFBHRCBj MDhiYzA2NyBQVUQgOTE1ZDMwNjcgUE1EIDANCj4gWyAxOTY3Ljc1MzAzNl0gT29wczogMDAwMCBb IzFdIFNNUA0KPiBbIDE5NjcuNzUzMDM2XSBNb2R1bGVzIGxpbmtlZCBpbjogbmZzX2xheW91dF9u ZnN2NDFfZmlsZXMgZXh0NA0KPiBtYmNhY2hlIGpiZDIgbG9vcCBycGNzZWNfZ3NzX2tyYjUgbmZz djQgZG5zX3Jlc29sdmVyIG5mcyBmc2NhY2hlDQo+IGFtZDY0X2VkYWNfbW9kIGlwbWlfc3NpZiBl ZGFjX21jZV9hbWQgZWRhY19jb3JlIGt2bV9hbWQgc2cga3ZtDQo+IGlwbWlfc2kgaXBtaV9kZXZp bnRmIGlycWJ5cGFzcyBwY3Nwa3Igazh0ZW1wIGlwbWlfbXNnaGFuZGxlcg0KPiBpMmNfcGlpeDQg c2hwY2hwIG5mc2QgYXV0aF9ycGNnc3MgbmZzX2FjbCBsb2NrZCBncmFjZSBzdW5ycGMNCj4gaXBf dGFibGVzIHhmcyBsaWJjcmMzMmMgc2RfbW9kIGNyY190MTBkaWYgY3JjdDEwZGlmX2dlbmVyaWMN Cj4gY3JjdDEwZGlmX2NvbW1vbiBhbWRrZmQgYW1kX2lvbW11X3YyIHJhZGVvbiBpMmNfYWxnb19i aXQNCj4gZHJtX2ttc19oZWxwZXIgc3lzY29weWFyZWEgc3lzZmlsbHJlY3Qgc3lzaW1nYmx0IGZi X3N5c19mb3BzIG1wdHNhcw0KPiB0dG0gc2NzaV90cmFuc3BvcnRfc2FzIG1wdHNjc2loIGRybSBt cHRiYXNlIHNlcmlvX3JhdyBpMmNfY29yZSBibngyDQo+IGRtX21pcnJvciBkbV9yZWdpb25faGFz aCBkbV9sb2cgZG1fbW9kDQo+IFsgMTk2Ny43OTAwMzFdIENQVTogMiBQSUQ6IDEzNzAgQ29tbTog bHMgTm90IHRhaW50ZWQgMy4xMC4wLQ0KPiA3MDkuZWw3LnRlc3QuYnoxNDYzNzg0Lng4Nl82NCAj MQ0KPiBbIDE5NjcuNzkwMDMxXSBIYXJkd2FyZSBuYW1lOiBJQk0gQmxhZGVDZW50ZXIgTFMyMSAt Wzc5NzFBQzFdLS9TZXJ2ZXIgDQo+IEJsYWRlLCBCSU9TIC1bQkFFMTU1QVVTLTEuMTBdLSAwNi8w My8yMDA5DQo+IFsgMTk2Ny43OTAwMzFdIHRhc2s6IGZmZmY4ODAwYzQyYTNmNDAgdGk6IGZmZmY4 ODAwYzQwNjQwMDAgdGFzay50aToNCj4gZmZmZjg4MDBjNDA2NDAwMA0KPiBbIDE5NjcuNzkwMDMx XSBSSVA6IDAwMTA6WzxmZmZmZmZmZmMwNmQ2YWVhPl0gIFs8ZmZmZmZmZmZjMDZkNmFlYT5dDQo+ IG5mczRfcHV0X2RldmljZWlkX25vZGUrMHhhLzB4OTAgW25mc3Y0XQ0KPiBbIDE5NjcuNzkwMDMx XSBSU1A6IDAwMDA6ZmZmZjg4MDBjNDA2Nzk3OCAgRUZMQUdTOiAwMDAxMDI0Ng0KPiBbIDE5Njcu NzkwMDMxXSBSQVg6IGZmZmZmZmZmYzA2MmYwMDAgUkJYOiBmZmZmODgwMWQ0NjhhNTQwIFJDWDoN Cj4gZGVhZDAwMDAwMDAwMDIwMA0KPiBbIDE5NjcuNzkwMDMxXSBSRFg6IGZmZmY4ODAwYzQwNjc5 ZjggUlNJOiBmZmZmODgwMGM0MDY3YTBjIFJESToNCj4gMDAwMDAwMDAwMDAwMDAwMA0KPiBbIDE5 NjcuNzkwMDMxXSBSQlA6IGZmZmY4ODAwYzQwNjc5ODAgUjA4OiBmZmZmODgwMWQ0NjhhNTQwIFIw OToNCj4gMDAwMDAwMDAwMDAwMDAwMA0KPiBbIDE5NjcuNzkwMDMxXSBSMTA6IDAwMDAwMDAwMDAw MDAwMDAgUjExOiBmZmZmZmZmZmZmZmZmZmZmIFIxMjoNCj4gZmZmZjg4MDFkNDY4YTU0MA0KPiBb IDE5NjcuNzkwMDMxXSBSMTM6IGZmZmY4ODAwYzQwNjc5ZjggUjE0OiBmZmZmODgwMWQ1NjQ1MzAw IFIxNToNCj4gZmZmZjg4MDEyNmYxNWZmMA0KPiBbIDE5NjcuNzkwMDMxXSBGUzogIDAwMDA3ZjEx MDUzYzk4MDAoMDAwMCkgR1M6ZmZmZjg4MDEyYmQwMDAwMCgwMDAwKQ0KPiBrbmxHUzowMDAwMDAw MDAwMDAwMDAwDQo+IFsgMTk2Ny43OTAwMzFdIENTOiAgMDAxMCBEUzogMDAwMCBFUzogMDAwMCBD UjA6IDAwMDAwMDAwODAwNTAwM2INCj4gWyAxOTY3Ljc5MDAzMV0gQ1IyOiAwMDAwMDAwMDAwMDAw MDMwIENSMzogMDAwMDAwMDA5NGI1NTAwMCBDUjQ6DQo+IDAwMDAwMDAwMDAwMDA3ZTANCj4gWyAx OTY3Ljc5MDAzMV0gU3RhY2s6DQo+IFsgMTk2Ny43OTAwMzFdICBmZmZmODgwMWQ0NjhhNTQwIGZm ZmY4ODAwYzQwNjc5OTAgZmZmZmZmZmZjMDYyZDJmZQ0KPiBmZmZmODgwMGM0MDY3OWIwDQo+IFsg MTk2Ny43OTAwMzFdICBmZmZmZmZmZmMwNjJiNWI0IGZmZmY4ODAwYzQwNjc5ZjggZmZmZjg4MDFk NDY4YTU0MA0KPiBmZmZmODgwMGM0MDY3OWQ4DQo+IFsgMTk2Ny43OTAwMzFdICBmZmZmZmZmZmMw NmQzOWFmIGZmZmY4ODAwYzQwNjc5ZjggZmZmZjg4MDEyNmYxNjA3OA0KPiAwMDAwMDAwMDAwMDAw MDAxDQo+IFsgMTk2Ny43OTAwMzFdIENhbGwgVHJhY2U6DQo+IFsgMTk2Ny43OTAwMzFdICBbPGZm ZmZmZmZmYzA2MmQyZmU+XSBuZnM0X2ZsX3B1dF9kZXZpY2VpZCsweGUvMHgxMA0KPiBbbmZzX2xh eW91dF9uZnN2NDFfZmlsZXNdDQo+IFsgMTk2Ny43OTAwMzFdICBbPGZmZmZmZmZmYzA2MmI1YjQ+ XSBmaWxlbGF5b3V0X2ZyZWVfbHNlZysweDI0LzB4OTANCj4gW25mc19sYXlvdXRfbmZzdjQxX2Zp bGVzXQ0KPiBbIDE5NjcuNzkwMDMxXSAgWzxmZmZmZmZmZmMwNmQzOWFmPl0gcG5mc19mcmVlX2xz ZWdfbGlzdCsweDVmLzB4ODANCj4gW25mc3Y0XQ0KPiBbIDE5NjcuNzkwMDMxXSAgWzxmZmZmZmZm ZmMwNmQ1YTY3Pl0gX3BuZnNfcmV0dXJuX2xheW91dCsweDE1Ny8weDI3MA0KPiBbbmZzdjRdDQo+ IFsgMTk2Ny43OTAwMzFdICBbPGZmZmZmZmZmYzA2YzE3ZGQ+XSBuZnM0X2V2aWN0X2lub2RlKzB4 NGQvMHg3MA0KPiBbbmZzdjRdDQo+IFsgMTk2Ny43OTAwMzFdICBbPGZmZmZmZmZmODEyMWRlMTk+ XSBldmljdCsweGE5LzB4MTgwDQo+IFsgMTk2Ny43OTAwMzFdICBbPGZmZmZmZmZmODEyMWU3Mjk+ XSBpcHV0KzB4ZjkvMHgxOTANCj4gWyAxOTY3Ljc5MDAzMV0gIFs8ZmZmZmZmZmZjMDY1MmNlYT5d IG5mc19kZW50cnlfaXB1dCsweDNhLzB4NTAgW25mc10NCj4gWyAxOTY3Ljc5MDAzMV0gIFs8ZmZm ZmZmZmY4MTIxYWI0Zj5dIHNocmlua19kZW50cnlfbGlzdCsweDIwZi8weDQ5MA0KPiBbIDE5Njcu NzkwMDMxXSAgWzxmZmZmZmZmZjgxMjFiMDE4Pl0gZF9pbnZhbGlkYXRlKzB4ZDgvMHgxNTANCj4g WyAxOTY3Ljc5MDAzMV0gIFs8ZmZmZmZmZmZjMDY1NDQ2Yj5dDQo+IG5mc19yZWFkZGlyX3BhZ2Vf ZmlsbGVyKzB4NDBiLzB4NjAwIFtuZnNdDQo+IFsgMTk2Ny43OTAwMzFdICBbPGZmZmZmZmZmYzA2 NTRiYmQ+XQ0KPiBuZnNfcmVhZGRpcl94ZHJfdG9fYXJyYXkrMHgyMGQvMHgzYjAgW25mc10NCj4g WyAxOTY3Ljc5MDAzMV0gIFs8ZmZmZmZmZmY4MTFmMzQ4Mj5dID8NCj4gX19tZW1fY2dyb3VwX2Nv bW1pdF9jaGFyZ2UrMHhlMi8weDJmMA0KPiBbIDE5NjcuNzkwMDMxXSAgWzxmZmZmZmZmZjgxMTgz MjA4Pl0gPw0KPiBfX2FkZF90b19wYWdlX2NhY2hlX2xvY2tlZCsweDQ4LzB4MTcwDQo+IFsgMTk2 Ny43OTAwMzFdICBbPGZmZmZmZmZmYzA2NTRkNjA+XSA/DQo+IG5mc19yZWFkZGlyX3hkcl90b19h cnJheSsweDNiMC8weDNiMCBbbmZzXQ0KPiBbIDE5NjcuNzkwMDMxXSAgWzxmZmZmZmZmZmMwNjU0 ZDgyPl0gbmZzX3JlYWRkaXJfZmlsbGVyKzB4MjIvMHg5MA0KPiBbbmZzXQ0KPiBbIDE5NjcuNzkw MDMxXSAgWzxmZmZmZmZmZjgxMTgzNTFmPl0gZG9fcmVhZF9jYWNoZV9wYWdlKzB4N2YvMHgxOTAN Cj4gWyAxOTY3Ljc5MDAzMV0gIFs8ZmZmZmZmZmY4MTIxNWQzMD5dID8gZmlsbG9uZWRpcisweGUw LzB4ZTANCj4gWyAxOTY3Ljc5MDAzMV0gIFs8ZmZmZmZmZmY4MTE4MzY2Yz5dIHJlYWRfY2FjaGVf cGFnZSsweDFjLzB4MzANCj4gWyAxOTY3Ljc5MDAzMV0gIFs8ZmZmZmZmZmZjMDY1NGY5Yj5dIG5m c19yZWFkZGlyKzB4MWFiLzB4NmIwIFtuZnNdDQo+IFsgMTk2Ny43OTAwMzFdICBbPGZmZmZmZmZm YzA2YmQxYzA+XSA/DQo+IG5mczRfeGRyX2RlY19sYXlvdXRnZXQrMHgyNzAvMHgyNzAgW25mc3Y0 XQ0KPiBbIDE5NjcuNzkwMDMxXSAgWzxmZmZmZmZmZjgxMjE1ZDMwPl0gPyBmaWxsb25lZGlyKzB4 ZTAvMHhlMA0KPiBbIDE5NjcuNzkwMDMxXSAgWzxmZmZmZmZmZjgxMjE1YzIwPl0gdmZzX3JlYWRk aXIrMHhiMC8weGUwDQo+IFsgMTk2Ny43OTAwMzFdICBbPGZmZmZmZmZmODEyMTYwNDU+XSBTeVNf Z2V0ZGVudHMrMHg5NS8weDEyMA0KPiBbIDE5NjcuNzkwMDMxXSAgWzxmZmZmZmZmZjgxNmI5NDQ5 Pl0gc3lzdGVtX2NhbGxfZmFzdHBhdGgrMHgxNi8weDFiDQo+IFsgMTk2Ny43OTAwMzFdIENvZGU6 IDkwIDMxIGQyIDQ4IDg5IGQwIDVkIGMzIDg1IGY2IDc0IGY1IDhkIDRlIDAxIDg5DQo+IGYwIGYw IDBmIGIxIDBmIDM5IGYwIDc0IGUyIDg5IGM2IGViIGViIDBmIDFmIDQwIDAwIDY2IDY2IDY2IDY2 IDkwIDU1DQo+IDQ4IDg5IGU1IDUzIDw0OD4gOGIgNDcgMzAgNDggODkgZmIgYTggMDQgNzQgM2Ig OGIgNTcgNjAgODMgZmEgMDIgNzQNCj4gMTkgOGQgNGENCj4gWyAxOTY3Ljc5MDAzMV0gUklQICBb PGZmZmZmZmZmYzA2ZDZhZWE+XQ0KPiBuZnM0X3B1dF9kZXZpY2VpZF9ub2RlKzB4YS8weDkwIFtu ZnN2NF0NCj4gWyAxOTY3Ljc5MDAzMV0gIFJTUCA8ZmZmZjg4MDBjNDA2Nzk3OD4NCj4gWyAxOTY3 Ljc5MDAzMV0gQ1IyOiAwMDAwMDAwMDAwMDAwMDMwDQo+IA0KPiBTaW5jZSBhIGZpbGVsYXlvdXQg c2VnbWVudCBpcyBpbml0aWFsbHkgaW5zZXJ0ZWQgd2l0aCBhIE5VTEwgZHNhZGRyLA0KPiBpdA0K PiBsb29rcyBsaWtlIHRoZXJlJ3MgYSB3aW5kb3cgd2hlcmUgZmlsZWxheW91dF9mcmVlX2xzZWco KSAoZS5nLiB2aWENCj4gbmZzNF9ldmljdF9pbm9kZSgpIGNhbGxlZCBieSBhbm90aGVyIHByb2Nl c3MpIGNhbiBiZSBjYWxsZWQgd2hpY2gNCj4gd2lsbA0KPiB0cmlnZ2VyIGFuIG9vcHMgaW4gbmZz NF9wdXRfZGV2aWNlaWRfbm9kZSgpIHdoZW4gaXQgdHJpZXMgdG8gYWNjZXNzDQo+IHRoZQ0KPiBu ZnM0X2RldmljZWlkX25vZGUtPmZsYWdzLiAgVGFrZSBhbiBleHRyYSByZWZlcmVuY2Ugb24gdGhl IGxheW91dA0KPiBzZWdtZW50IHRvIHByZXZlbnQgdGhhdCwgYW5kIGNoZWNrIGZvciBhIE5VTEwg ZHNhZGRyIGluDQo+IGZpbGVsYXlvdXRfZnJlZV9sc2VnKCkuDQo+IA0KPiANCg0KV2h5IGlzbid0 IGl0IHN1ZmZpY2llbnQganVzdCB0byBhZGQgYSBjaGVjayBmb3IgYSBOVUxMIHBvaW50ZXIgaW4N Cm5mczRfZmxfcHV0X2RldmljZWlkKCk/IElmIHlvdSdyZSBpbiBmaWxlbGF5b3V0X2ZyZWVfbHNl ZygpIHRoZW4gbm9ib2R5DQogaG9sZHMgYSByZWZlcmVuY2UgdG8gdGhlIGxheW91dCBzZWdtZW50 LCBhbmQgc28gaWYgZmwtPmRzYWRkciBpcyBOVUxMLA0KdGhlbiBpdCB3aWxsIHN0YXkgdGhhdCB3 YXkuDQoNCi0tIA0KVHJvbmQgTXlrbGVidXN0DQpMaW51eCBORlMgY2xpZW50IG1haW50YWluZXIs IFByaW1hcnlEYXRhDQp0cm9uZC5teWtsZWJ1c3RAcHJpbWFyeWRhdGEuY29tDQo=