All of lore.kernel.org
 help / color / mirror / Atom feed
* Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-03  3:08 Pavel Ivanov
  2011-09-03  3:59   ` Hin-Tak Leung
  0 siblings, 1 reply; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-03  3:08 UTC (permalink / raw)
  To: linux-fsdevel; +Cc: linux-kernel

Hi,

With kernel 3.1.0-rc4 any attempt to connect iPod to USB leads to
kernel oops. I'd say that stacktrace of the oops is pretty much random
and not related to HFS. But I was able to get useful info from it when
I recompiled with CONFIG_SLUB_DEBUG_ON=y. In this case I don't get
oops but the following instead:

[   81.508807] hfs: filesystem size too large.
[   81.559295] =============================================================================
[   81.656965] BUG kmalloc-4096: Invalid object pointer 0xffff880136160400
[   81.735947] -----------------------------------------------------------------------------
[   81.735948]
[   81.851359] INFO: Slab 0xffffea0004d85800 objects=7 used=7 fp=0x
      (null) flags=0x2000000000004081
[   81.965628] Pid: 2086, comm: ipod-set-info Not tainted 3.1.0-rc4+ #2
[   81.965629] Call Trace:
[   81.965636]  [<ffffffff8119359f>] slab_err+0xaf/0xd0
[   81.965640]  [<ffffffff8119381f>] ? slab_pad_check+0xaf/0x1a0
[   81.965644]  [<ffffffff8119719f>] free_debug_processing+0x1ef/0x310
[   81.965647]  [<ffffffff811974ba>] __slab_free+0x1fa/0x490
[   81.965653]  [<ffffffffa0516c4d>] ? hfsplus_fill_super+0x2ed/0x610 [hfsplus]
[   81.965656]  [<ffffffff81197a3c>] kfree+0x12c/0x150
[   81.965660]  [<ffffffffa0516c4d>] hfsplus_fill_super+0x2ed/0x610 [hfsplus]
[   81.965665]  [<ffffffff81438771>] ? ioctl_internal_command.clone.4+0x61/0x1b0
[   81.965671]  [<ffffffff8161fe9e>] ? _raw_spin_unlock+0xe/0x40
[   81.965675]  [<ffffffff81195eb8>] ? deactivate_slab+0x578/0x750
[   81.965679]  [<ffffffff811af3cb>] ? sget+0xab/0x480
[   81.965683]  [<ffffffff8133f0c9>] ? put_dec+0x59/0x60
[   81.965685]  [<ffffffff813407d1>] ? number.clone.2+0x311/0x350
[   81.965690]  [<ffffffff8116bd7b>] ? pcpu_alloc_area+0x10b/0x2c0
[   81.965693]  [<ffffffff81341b81>] ? vsnprintf+0x471/0x610
[   81.965696]  [<ffffffff8116c639>] ? pcpu_alloc+0x399/0x9e0
[   81.965699]  [<ffffffff81341dc4>] ? snprintf+0x34/0x40
[   81.965702]  [<ffffffff8133ebc6>] ? strlcpy+0x46/0x60
[   81.965707]  [<ffffffff8115bfb2>] ? register_shrinker+0x52/0x60
[   81.965710]  [<ffffffff811afa26>] mount_bdev+0x1c6/0x210
[   81.965714]  [<ffffffffa0516960>] ? hfsplus_iget+0x240/0x240 [hfsplus]
[   81.965718]  [<ffffffffa05160a5>] hfsplus_mount+0x15/0x20 [hfsplus]
[   81.965720]  [<ffffffff811b0547>] mount_fs+0x47/0x1c0
[   81.965723]  [<ffffffff8116cc90>] ? __alloc_percpu+0x10/0x20
[   81.965727]  [<ffffffff811ca383>] vfs_kern_mount+0x63/0xd0
[   81.965731]  [<ffffffff811cb4d4>] do_kern_mount+0x54/0x110
[   81.965734]  [<ffffffff811cd022>] do_mount+0x502/0x7e0
[   81.965736]  [<ffffffff8116738b>] ? strndup_user+0x5b/0x80
[   81.965739]  [<ffffffff811cd710>] sys_mount+0x90/0xe0
[   81.965744]  [<ffffffff81627402>] system_call_fastpath+0x16/0x1b
[   81.965746] FIX kmalloc-4096: Object at 0xffff880136160400 not freed

Following by 2 other bugs with the same stack trace.

(BTW, before oops first message "hfs: filesystem size too large"
always appears twice.)


Another question: is hfsplus supposed to work at all? I see it's
marked as "Orphaned" in MAINTAINERS and on attempt to connect iPod
with kernel 2.6.38.11 (standard kernel in Ubuntu 11.04) I still don't
get it working. Although without oops I get the following messages:

[   65.479360] usb 2-3: new high speed USB device using ehci_hcd and address 4
[   65.686470] usbcore: registered new interface driver uas
[   65.706455] Initializing USB Mass Storage driver...
[   65.706901] scsi4 : usb-storage 2-3:1.0
[   65.707251] usbcore: registered new interface driver usb-storage
[   65.707254] USB Mass Storage support registered.
[   66.702320] scsi 4:0:0:0: Direct-Access     Apple    iPod
  1.62 PQ: 0 ANSI: 0
[   66.704537] sd 4:0:0:0: Attached scsi generic sg2 type 0
[   66.809047] sd 4:0:0:0: [sdb] 1946049 4096-byte logical blocks:
(7.97 GB/7.42 GiB)
[   66.809930] sd 4:0:0:0: [sdb] Write Protect is off
[   66.809935] sd 4:0:0:0: [sdb] Mode Sense: 68 00 00 08
[   66.809938] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[   66.885037] sd 4:0:0:0: [sdb] 1946049 4096-byte logical blocks:
(7.97 GB/7.42 GiB)
[   66.885933] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[   66.979400]  sdb: [mac] sdb1 sdb2
[   66.981940] sd 4:0:0:0: [sdb] 1946049 4096-byte logical blocks:
(7.97 GB/7.42 GiB)
[   66.982834] sd 4:0:0:0: [sdb] Assuming drive cache: write through
[   67.055808] sd 4:0:0:0: [sdb] Attached SCSI removable disk
[   67.299357] sd 4:0:0:0: [sdb] Bad block number requested
[   67.362982] hfs: unable to find HFS+ superblock
[   67.499457] sd 4:0:0:0: [sdb] Bad block number requested
[   67.563085] hfs: unable to find HFS+ superblock


Thank you,
Pavel

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-03  3:08 Kernel 3.1.0-rc4 oops when connecting iPod Pavel Ivanov
@ 2011-09-03  3:59   ` Hin-Tak Leung
  0 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-03  3:59 UTC (permalink / raw)
  To: linux-fsdevel, Pavel Ivanov; +Cc: linux-kernel

--- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> Hi,
> 
> With kernel 3.1.0-rc4 any attempt to connect iPod to USB
> leads to
> kernel oops. I'd say that stacktrace of the oops is pretty
> much random
> and not related to HFS. But I was able to get useful info
> from it when
> I recompiled with CONFIG_SLUB_DEBUG_ON=y. In this case I
> don't get
> oops but the following instead:

There are a few hfsplus related changes to do protection against invalid data like this, but may be there are more. It would be useful to have the output from your 
objdump -l -d hfsplus.ko | grep  -A 1000 '<hfsplus_fill_super>'
(the -l gives line numbers against the kernel tree, so would be useful if you run this against the ko there...)

> 
> [   81.508807] hfs: filesystem size too
> large.
> [   81.559295]
> =============================================================================
> [   81.656965] BUG kmalloc-4096: Invalid
> object pointer 0xffff880136160400
> [   81.735947]
> -----------------------------------------------------------------------------
> [   81.735948]
> [   81.851359] INFO: Slab 0xffffea0004d85800
> objects=7 used=7 fp=0x
>       (null) flags=0x2000000000004081
> [   81.965628] Pid: 2086, comm:
> ipod-set-info Not tainted 3.1.0-rc4+ #2
> [   81.965629] Call Trace:
> [   81.965636] 
> [<ffffffff8119359f>] slab_err+0xaf/0xd0
> [   81.965640] 
> [<ffffffff8119381f>] ? slab_pad_check+0xaf/0x1a0
> [   81.965644] 
> [<ffffffff8119719f>]
> free_debug_processing+0x1ef/0x310
> [   81.965647] 
> [<ffffffff811974ba>] __slab_free+0x1fa/0x490
> [   81.965653] 
> [<ffffffffa0516c4d>] ? hfsplus_fill_super+0x2ed/0x610
> [hfsplus]
> [   81.965656] 
> [<ffffffff81197a3c>] kfree+0x12c/0x150
> [   81.965660] 
> [<ffffffffa0516c4d>] hfsplus_fill_super+0x2ed/0x610
> [hfsplus]
> [   81.965665] 
> [<ffffffff81438771>] ?
> ioctl_internal_command.clone.4+0x61/0x1b0
> [   81.965671] 
> [<ffffffff8161fe9e>] ? _raw_spin_unlock+0xe/0x40
> [   81.965675] 
> [<ffffffff81195eb8>] ? deactivate_slab+0x578/0x750
> [   81.965679] 
> [<ffffffff811af3cb>] ? sget+0xab/0x480
> [   81.965683] 
> [<ffffffff8133f0c9>] ? put_dec+0x59/0x60
> [   81.965685] 
> [<ffffffff813407d1>] ? number.clone.2+0x311/0x350
> [   81.965690] 
> [<ffffffff8116bd7b>] ? pcpu_alloc_area+0x10b/0x2c0
> [   81.965693] 
> [<ffffffff81341b81>] ? vsnprintf+0x471/0x610
> [   81.965696] 
> [<ffffffff8116c639>] ? pcpu_alloc+0x399/0x9e0
> [   81.965699] 
> [<ffffffff81341dc4>] ? snprintf+0x34/0x40
> [   81.965702] 
> [<ffffffff8133ebc6>] ? strlcpy+0x46/0x60
> [   81.965707] 
> [<ffffffff8115bfb2>] ? register_shrinker+0x52/0x60
> [   81.965710] 
> [<ffffffff811afa26>] mount_bdev+0x1c6/0x210
> [   81.965714] 
> [<ffffffffa0516960>] ? hfsplus_iget+0x240/0x240
> [hfsplus]
> [   81.965718] 
> [<ffffffffa05160a5>] hfsplus_mount+0x15/0x20
> [hfsplus]
> [   81.965720] 
> [<ffffffff811b0547>] mount_fs+0x47/0x1c0
> [   81.965723] 
> [<ffffffff8116cc90>] ? __alloc_percpu+0x10/0x20
> [   81.965727] 
> [<ffffffff811ca383>] vfs_kern_mount+0x63/0xd0
> [   81.965731] 
> [<ffffffff811cb4d4>] do_kern_mount+0x54/0x110
> [   81.965734] 
> [<ffffffff811cd022>] do_mount+0x502/0x7e0
> [   81.965736] 
> [<ffffffff8116738b>] ? strndup_user+0x5b/0x80
> [   81.965739] 
> [<ffffffff811cd710>] sys_mount+0x90/0xe0
> [   81.965744] 
> [<ffffffff81627402>] system_call_fastpath+0x16/0x1b
> [   81.965746] FIX kmalloc-4096: Object at
> 0xffff880136160400 not freed
> 
> Following by 2 other bugs with the same stack trace.
> 
> (BTW, before oops first message "hfs: filesystem size too
> large"
> always appears twice.)
> 
> 
> Another question: is hfsplus supposed to work at all? I see
> it's
> marked as "Orphaned" in MAINTAINERS and on attempt to
> connect iPod
> with kernel 2.6.38.11 (standard kernel in Ubuntu 11.04) I
> still don't
> get it working. Although without oops I get the following
> messages:
> 
> [   65.479360] usb 2-3: new high speed USB
> device using ehci_hcd and address 4
> [   65.686470] usbcore: registered new
> interface driver uas
> [   65.706455] Initializing USB Mass Storage
> driver...
> [   65.706901] scsi4 : usb-storage 2-3:1.0
> [   65.707251] usbcore: registered new
> interface driver usb-storage
> [   65.707254] USB Mass Storage support
> registered.
> [   66.702320] scsi 4:0:0:0:
> Direct-Access     Apple   
> iPod
>   1.62 PQ: 0 ANSI: 0
> [   66.704537] sd 4:0:0:0: Attached scsi
> generic sg2 type 0
> [   66.809047] sd 4:0:0:0: [sdb] 1946049
> 4096-byte logical blocks:
> (7.97 GB/7.42 GiB)
> [   66.809930] sd 4:0:0:0: [sdb] Write
> Protect is off
> [   66.809935] sd 4:0:0:0: [sdb] Mode Sense:
> 68 00 00 08
> [   66.809938] sd 4:0:0:0: [sdb] Assuming
> drive cache: write through
> [   66.885037] sd 4:0:0:0: [sdb] 1946049
> 4096-byte logical blocks:
> (7.97 GB/7.42 GiB)
> [   66.885933] sd 4:0:0:0: [sdb] Assuming
> drive cache: write through
> [   66.979400]  sdb: [mac] sdb1 sdb2
> [   66.981940] sd 4:0:0:0: [sdb] 1946049
> 4096-byte logical blocks:
> (7.97 GB/7.42 GiB)
> [   66.982834] sd 4:0:0:0: [sdb] Assuming
> drive cache: write through
> [   67.055808] sd 4:0:0:0: [sdb] Attached
> SCSI removable disk
> [   67.299357] sd 4:0:0:0: [sdb] Bad block
> number requested
> [   67.362982] hfs: unable to find HFS+
> superblock
> [   67.499457] sd 4:0:0:0: [sdb] Bad block
> number requested
> [   67.563085] hfs: unable to find HFS+
> superblock
> 
> 
> Thank you,
> Pavel
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-03  3:59   ` Hin-Tak Leung
  0 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-03  3:59 UTC (permalink / raw)
  To: linux-fsdevel, Pavel Ivanov; +Cc: linux-kernel

--- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> Hi,
> 
> With kernel 3.1.0-rc4 any attempt to connect iPod to USB
> leads to
> kernel oops. I'd say that stacktrace of the oops is pretty
> much random
> and not related to HFS. But I was able to get useful info
> from it when
> I recompiled with CONFIG_SLUB_DEBUG_ON=y. In this case I
> don't get
> oops but the following instead:

There are a few hfsplus related changes to do protection against invalid data like this, but may be there are more. It would be useful to have the output from your 
objdump -l -d hfsplus.ko | grep  -A 1000 '<hfsplus_fill_super>'
(the -l gives line numbers against the kernel tree, so would be useful if you run this against the ko there...)

> 
> [   81.508807] hfs: filesystem size too
> large.
> [   81.559295]
> =============================================================================
> [   81.656965] BUG kmalloc-4096: Invalid
> object pointer 0xffff880136160400
> [   81.735947]
> -----------------------------------------------------------------------------
> [   81.735948]
> [   81.851359] INFO: Slab 0xffffea0004d85800
> objects=7 used=7 fp=0x
>       (null) flags=0x2000000000004081
> [   81.965628] Pid: 2086, comm:
> ipod-set-info Not tainted 3.1.0-rc4+ #2
> [   81.965629] Call Trace:
> [   81.965636] 
> [<ffffffff8119359f>] slab_err+0xaf/0xd0
> [   81.965640] 
> [<ffffffff8119381f>] ? slab_pad_check+0xaf/0x1a0
> [   81.965644] 
> [<ffffffff8119719f>]
> free_debug_processing+0x1ef/0x310
> [   81.965647] 
> [<ffffffff811974ba>] __slab_free+0x1fa/0x490
> [   81.965653] 
> [<ffffffffa0516c4d>] ? hfsplus_fill_super+0x2ed/0x610
> [hfsplus]
> [   81.965656] 
> [<ffffffff81197a3c>] kfree+0x12c/0x150
> [   81.965660] 
> [<ffffffffa0516c4d>] hfsplus_fill_super+0x2ed/0x610
> [hfsplus]
> [   81.965665] 
> [<ffffffff81438771>] ?
> ioctl_internal_command.clone.4+0x61/0x1b0
> [   81.965671] 
> [<ffffffff8161fe9e>] ? _raw_spin_unlock+0xe/0x40
> [   81.965675] 
> [<ffffffff81195eb8>] ? deactivate_slab+0x578/0x750
> [   81.965679] 
> [<ffffffff811af3cb>] ? sget+0xab/0x480
> [   81.965683] 
> [<ffffffff8133f0c9>] ? put_dec+0x59/0x60
> [   81.965685] 
> [<ffffffff813407d1>] ? number.clone.2+0x311/0x350
> [   81.965690] 
> [<ffffffff8116bd7b>] ? pcpu_alloc_area+0x10b/0x2c0
> [   81.965693] 
> [<ffffffff81341b81>] ? vsnprintf+0x471/0x610
> [   81.965696] 
> [<ffffffff8116c639>] ? pcpu_alloc+0x399/0x9e0
> [   81.965699] 
> [<ffffffff81341dc4>] ? snprintf+0x34/0x40
> [   81.965702] 
> [<ffffffff8133ebc6>] ? strlcpy+0x46/0x60
> [   81.965707] 
> [<ffffffff8115bfb2>] ? register_shrinker+0x52/0x60
> [   81.965710] 
> [<ffffffff811afa26>] mount_bdev+0x1c6/0x210
> [   81.965714] 
> [<ffffffffa0516960>] ? hfsplus_iget+0x240/0x240
> [hfsplus]
> [   81.965718] 
> [<ffffffffa05160a5>] hfsplus_mount+0x15/0x20
> [hfsplus]
> [   81.965720] 
> [<ffffffff811b0547>] mount_fs+0x47/0x1c0
> [   81.965723] 
> [<ffffffff8116cc90>] ? __alloc_percpu+0x10/0x20
> [   81.965727] 
> [<ffffffff811ca383>] vfs_kern_mount+0x63/0xd0
> [   81.965731] 
> [<ffffffff811cb4d4>] do_kern_mount+0x54/0x110
> [   81.965734] 
> [<ffffffff811cd022>] do_mount+0x502/0x7e0
> [   81.965736] 
> [<ffffffff8116738b>] ? strndup_user+0x5b/0x80
> [   81.965739] 
> [<ffffffff811cd710>] sys_mount+0x90/0xe0
> [   81.965744] 
> [<ffffffff81627402>] system_call_fastpath+0x16/0x1b
> [   81.965746] FIX kmalloc-4096: Object at
> 0xffff880136160400 not freed
> 
> Following by 2 other bugs with the same stack trace.
> 
> (BTW, before oops first message "hfs: filesystem size too
> large"
> always appears twice.)
> 
> 
> Another question: is hfsplus supposed to work at all? I see
> it's
> marked as "Orphaned" in MAINTAINERS and on attempt to
> connect iPod
> with kernel 2.6.38.11 (standard kernel in Ubuntu 11.04) I
> still don't
> get it working. Although without oops I get the following
> messages:
> 
> [   65.479360] usb 2-3: new high speed USB
> device using ehci_hcd and address 4
> [   65.686470] usbcore: registered new
> interface driver uas
> [   65.706455] Initializing USB Mass Storage
> driver...
> [   65.706901] scsi4 : usb-storage 2-3:1.0
> [   65.707251] usbcore: registered new
> interface driver usb-storage
> [   65.707254] USB Mass Storage support
> registered.
> [   66.702320] scsi 4:0:0:0:
> Direct-Access     Apple   
> iPod
>   1.62 PQ: 0 ANSI: 0
> [   66.704537] sd 4:0:0:0: Attached scsi
> generic sg2 type 0
> [   66.809047] sd 4:0:0:0: [sdb] 1946049
> 4096-byte logical blocks:
> (7.97 GB/7.42 GiB)
> [   66.809930] sd 4:0:0:0: [sdb] Write
> Protect is off
> [   66.809935] sd 4:0:0:0: [sdb] Mode Sense:
> 68 00 00 08
> [   66.809938] sd 4:0:0:0: [sdb] Assuming
> drive cache: write through
> [   66.885037] sd 4:0:0:0: [sdb] 1946049
> 4096-byte logical blocks:
> (7.97 GB/7.42 GiB)
> [   66.885933] sd 4:0:0:0: [sdb] Assuming
> drive cache: write through
> [   66.979400]  sdb: [mac] sdb1 sdb2
> [   66.981940] sd 4:0:0:0: [sdb] 1946049
> 4096-byte logical blocks:
> (7.97 GB/7.42 GiB)
> [   66.982834] sd 4:0:0:0: [sdb] Assuming
> drive cache: write through
> [   67.055808] sd 4:0:0:0: [sdb] Attached
> SCSI removable disk
> [   67.299357] sd 4:0:0:0: [sdb] Bad block
> number requested
> [   67.362982] hfs: unable to find HFS+
> superblock
> [   67.499457] sd 4:0:0:0: [sdb] Bad block
> number requested
> [   67.563085] hfs: unable to find HFS+
> superblock
> 
> 
> Thank you,
> Pavel
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-03  3:59   ` Hin-Tak Leung
  (?)
@ 2011-09-03  4:37   ` Pavel Ivanov
  2011-09-03  6:57     ` Hin-Tak Leung
  -1 siblings, 1 reply; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-03  4:37 UTC (permalink / raw)
  To: Hin-Tak Leung; +Cc: linux-fsdevel, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 832 bytes --]

On Fri, Sep 2, 2011 at 11:59 PM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
>> With kernel 3.1.0-rc4 any attempt to connect iPod to USB
>> leads to
>> kernel oops. I'd say that stacktrace of the oops is pretty
>> much random
>> and not related to HFS. But I was able to get useful info
>> from it when
>> I recompiled with CONFIG_SLUB_DEBUG_ON=y. In this case I
>> don't get
>> oops but the following instead:
>
> There are a few hfsplus related changes to do protection against invalid data like this, but may be there are more. It would be useful to have the output from your
> objdump -l -d hfsplus.ko | grep  -A 1000 '<hfsplus_fill_super>'
> (the -l gives line numbers against the kernel tree, so would be useful if you run this against the ko there...)

Output of this command is in attachment.


Pavel

[-- Attachment #2: hfsplus.dump --]
[-- Type: application/octet-stream, Size: 53483 bytes --]

0000000000000960 <hfsplus_fill_super>:
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:339
     960:	55                   	push   %rbp
     961:	48 89 e5             	mov    %rsp,%rbp
     964:	41 57                	push   %r15
     966:	41 56                	push   %r14
     968:	41 55                	push   %r13
     96a:	41 54                	push   %r12
     96c:	53                   	push   %rbx
     96d:	48 81 ec 78 02 00 00 	sub    $0x278,%rsp
     974:	e8 00 00 00 00       	callq  979 <hfsplus_fill_super+0x19>
     979:	49 89 fc             	mov    %rdi,%r12
     97c:	65 48 8b 04 25 28 00 	mov    %gs:0x28,%rax
     983:	00 00 
     985:	48 89 45 c8          	mov    %rax,-0x38(%rbp)
     989:	31 c0                	xor    %eax,%eax
kmalloc_slab():
/home/pivanof/def_workspace/linux/include/linux/slub_def.h:210
     98b:	48 8b 3d 00 00 00 00 	mov    0x0(%rip),%rdi        # 992 <hfsplus_fill_super+0x32>
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:339
     992:	49 89 f7             	mov    %rsi,%r15
     995:	41 89 d5             	mov    %edx,%r13d
kmalloc():
/home/pivanof/def_workspace/linux/include/linux/slub_def.h:270
     998:	48 85 ff             	test   %rdi,%rdi
     99b:	0f 84 bf 02 00 00    	je     c60 <hfsplus_fill_super+0x300>
/home/pivanof/def_workspace/linux/include/linux/slub_def.h:273
     9a1:	ba 00 01 00 00       	mov    $0x100,%edx
     9a6:	be d0 80 00 00       	mov    $0x80d0,%esi
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:349
     9ab:	41 be ea ff ff ff    	mov    $0xffffffea,%r14d
kmalloc():
/home/pivanof/def_workspace/linux/include/linux/slub_def.h:273
     9b1:	e8 00 00 00 00       	callq  9b6 <hfsplus_fill_super+0x56>
     9b6:	48 89 c3             	mov    %rax,%rbx
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:351
     9b9:	48 85 c0             	test   %rax,%rax
     9bc:	0f 84 b6 00 00 00    	je     a78 <hfsplus_fill_super+0x118>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:355
     9c2:	48 8d bb 88 00 00 00 	lea    0x88(%rbx),%rdi
     9c9:	48 c7 c2 00 00 00 00 	mov    $0x0,%rdx
     9d0:	48 c7 c6 00 00 00 00 	mov    $0x0,%rsi
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:354
     9d7:	49 89 9c 24 b0 02 00 	mov    %rbx,0x2b0(%r12)
     9de:	00 
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:355
     9df:	e8 00 00 00 00       	callq  9e4 <hfsplus_fill_super+0x84>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:356
     9e4:	48 c7 c6 00 00 00 00 	mov    $0x0,%rsi
     9eb:	48 8d 93 b8 00 00 00 	lea    0xb8(%rbx),%rdx
     9f2:	48 89 95 68 fd ff ff 	mov    %rdx,-0x298(%rbp)
     9f9:	48 c7 c2 00 00 00 00 	mov    $0x0,%rdx
     a00:	48 8b bd 68 fd ff ff 	mov    -0x298(%rbp),%rdi
     a07:	e8 00 00 00 00       	callq  a0c <hfsplus_fill_super+0xac>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:357
     a0c:	48 89 df             	mov    %rbx,%rdi
     a0f:	e8 00 00 00 00       	callq  a14 <hfsplus_fill_super+0xb4>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:360
     a14:	48 89 de             	mov    %rbx,%rsi
     a17:	4c 89 ff             	mov    %r15,%rdi
     a1a:	e8 00 00 00 00       	callq  a1f <hfsplus_fill_super+0xbf>
     a1f:	85 c0                	test   %eax,%eax
     a21:	0f 84 52 04 00 00    	je     e79 <hfsplus_fill_super+0x519>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:366
     a27:	4c 8b 7b 48          	mov    0x48(%rbx),%r15
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:367
     a2b:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     a32:	e8 00 00 00 00       	callq  a37 <hfsplus_fill_super+0xd7>
     a37:	48 89 43 48          	mov    %rax,0x48(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:368
     a3b:	48 85 c0             	test   %rax,%rax
     a3e:	0f 84 4f 04 00 00    	je     e93 <hfsplus_fill_super+0x533>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:374
     a44:	4c 89 e7             	mov    %r12,%rdi
     a47:	e8 00 00 00 00       	callq  a4c <hfsplus_fill_super+0xec>
     a4c:	85 c0                	test   %eax,%eax
     a4e:	74 50                	je     aa0 <hfsplus_fill_super+0x140>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:375
     a50:	45 85 ed             	test   %r13d,%r13d
     a53:	0f 84 ae 04 00 00    	je     f07 <hfsplus_fill_super+0x5a7>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:359
     a59:	41 be ea ff ff ff    	mov    $0xffffffea,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:531
     a5f:	48 8b 7b 48          	mov    0x48(%rbx),%rdi
     a63:	e8 00 00 00 00       	callq  a68 <hfsplus_fill_super+0x108>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:532
     a68:	4c 89 ff             	mov    %r15,%rdi
     a6b:	e8 00 00 00 00       	callq  a70 <hfsplus_fill_super+0x110>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:533
     a70:	48 89 df             	mov    %rbx,%rdi
     a73:	e8 00 00 00 00       	callq  a78 <hfsplus_fill_super+0x118>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:536
     a78:	44 89 f0             	mov    %r14d,%eax
     a7b:	48 8b 55 c8          	mov    -0x38(%rbp),%rdx
     a7f:	65 48 33 14 25 28 00 	xor    %gs:0x28,%rdx
     a86:	00 00 
     a88:	0f 85 e6 03 00 00    	jne    e74 <hfsplus_fill_super+0x514>
     a8e:	48 81 c4 78 02 00 00 	add    $0x278,%rsp
     a95:	5b                   	pop    %rbx
     a96:	41 5c                	pop    %r12
     a98:	41 5d                	pop    %r13
     a9a:	41 5e                	pop    %r14
     a9c:	41 5f                	pop    %r15
     a9e:	c9                   	leaveq 
     a9f:	c3                   	retq   
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:379
     aa0:	4c 8b 6b 08          	mov    0x8(%rbx),%r13
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:382
     aa4:	49 c7 44 24 58 2b 48 	movq   $0x482b,0x58(%r12)
     aab:	00 00 
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:383
     aad:	41 0f b7 45 02       	movzwl 0x2(%r13),%eax
__fswab16():
/home/pivanof/def_workspace/linux/include/linux/swab.h:51
     ab2:	66 c1 c0 08          	rol    $0x8,%ax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:383
     ab6:	0f b7 c0             	movzwl %ax,%eax
     ab9:	83 f8 03             	cmp    $0x3,%eax
     abc:	0f 8e ca 02 00 00    	jle    d8c <hfsplus_fill_super+0x42c>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:384
     ac2:	83 f8 05             	cmp    $0x5,%eax
     ac5:	0f 8f c1 02 00 00    	jg     d8c <hfsplus_fill_super+0x42c>
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     acb:	41 8b 75 2c          	mov    0x2c(%r13),%esi
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:394
     acf:	8b 4b 70             	mov    0x70(%rbx),%ecx
__fswab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     ad2:	0f ce                	bswap  %esi
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:388
     ad4:	89 73 74             	mov    %esi,0x74(%rbx)
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     ad7:	41 8b 45 30          	mov    0x30(%r13),%eax
     adb:	0f c8                	bswap  %eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:389
     add:	89 83 80 00 00 00    	mov    %eax,0x80(%rbx)
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     ae3:	41 8b 45 40          	mov    0x40(%r13),%eax
     ae7:	0f c8                	bswap  %eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:390
     ae9:	89 83 a8 00 00 00    	mov    %eax,0xa8(%rbx)
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     aef:	41 8b 45 20          	mov    0x20(%r13),%eax
     af3:	0f c8                	bswap  %eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:391
     af5:	89 83 ac 00 00 00    	mov    %eax,0xac(%rbx)
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     afb:	41 8b 45 24          	mov    0x24(%r13),%eax
     aff:	0f c8                	bswap  %eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:392
     b01:	89 83 b0 00 00 00    	mov    %eax,0xb0(%rbx)
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     b07:	41 8b 45 3c          	mov    0x3c(%r13),%eax
     b0b:	0f c8                	bswap  %eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:394
     b0d:	d3 e8                	shr    %cl,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:393
     b0f:	89 43 78             	mov    %eax,0x78(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:395
     b12:	85 c0                	test   %eax,%eax
     b14:	0f 84 56 01 00 00    	je     c70 <hfsplus_fill_super+0x310>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:398
     b1a:	41 8b 45 38          	mov    0x38(%r13),%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:400
     b1e:	ba 01 00 00 00       	mov    $0x1,%edx
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:402
     b23:	89 f6                	mov    %esi,%esi
     b25:	89 cf                	mov    %ecx,%edi
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     b27:	0f c8                	bswap  %eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:398
     b29:	d3 e8                	shr    %cl,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:400
     b2b:	85 c0                	test   %eax,%eax
     b2d:	0f 45 d0             	cmovne %eax,%edx
     b30:	89 53 7c             	mov    %edx,0x7c(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:402
     b33:	e8 00 00 00 00       	callq  b38 <hfsplus_fill_super+0x1d8>
     b38:	41 89 c6             	mov    %eax,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:404
     b3b:	85 c0                	test   %eax,%eax
     b3d:	0f 85 0d 04 00 00    	jne    f50 <hfsplus_fill_super+0x5f0>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:410
     b43:	49 c7 44 24 30 00 00 	movq   $0x0,0x30(%r12)
     b4a:	00 00 
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:411
     b4c:	49 b8 ff ff ff ff ff 	movabs $0x7fffffffffffffff,%r8
     b53:	ff ff 7f 
     b56:	4d 89 44 24 20       	mov    %r8,0x20(%r12)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:413
     b5b:	41 f6 45 06 01       	testb  $0x1,0x6(%r13)
     b60:	0f 84 71 03 00 00    	je     ed7 <hfsplus_fill_super+0x577>
test_and_clear_bit():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/bitops.h:250
     b66:	f0 0f ba b3 f8 00 00 	lock btrl $0x2,0xf8(%rbx)
     b6d:	00 02 
     b6f:	19 c0                	sbb    %eax,%eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:419
     b71:	85 c0                	test   %eax,%eax
     b73:	0f 84 07 01 00 00    	je     c80 <hfsplus_fill_super+0x320>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:436
     b79:	be 03 00 00 00       	mov    $0x3,%esi
     b7e:	4c 89 e7             	mov    %r12,%rdi
     b81:	e8 00 00 00 00       	callq  b86 <hfsplus_fill_super+0x226>
     b86:	48 89 43 20          	mov    %rax,0x20(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:437
     b8a:	48 85 c0             	test   %rax,%rax
     b8d:	0f 84 5d 03 00 00    	je     ef0 <hfsplus_fill_super+0x590>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:441
     b93:	be 04 00 00 00       	mov    $0x4,%esi
     b98:	4c 89 e7             	mov    %r12,%rdi
     b9b:	e8 00 00 00 00       	callq  ba0 <hfsplus_fill_super+0x240>
     ba0:	48 89 43 28          	mov    %rax,0x28(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:442
     ba4:	48 85 c0             	test   %rax,%rax
     ba7:	0f 84 73 03 00 00    	je     f20 <hfsplus_fill_super+0x5c0>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:447
     bad:	be 06 00 00 00       	mov    $0x6,%esi
     bb2:	4c 89 e7             	mov    %r12,%rdi
     bb5:	e8 00 00 00 00       	callq  bba <hfsplus_fill_super+0x25a>
     bba:	49 89 c6             	mov    %rax,%r14
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:448
     bbd:	48 3d 00 f0 ff ff    	cmp    $0xfffffffffffff000,%rax
     bc3:	0f 87 e1 02 00 00    	ja     eaa <hfsplus_fill_super+0x54a>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:453
     bc9:	48 89 43 38          	mov    %rax,0x38(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:456
     bcd:	be 02 00 00 00       	mov    $0x2,%esi
     bd2:	4c 89 e7             	mov    %r12,%rdi
     bd5:	e8 00 00 00 00       	callq  bda <hfsplus_fill_super+0x27a>
     bda:	48 89 85 60 fd ff ff 	mov    %rax,-0x2a0(%rbp)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:457
     be1:	48 3d 00 f0 ff ff    	cmp    $0xfffffffffffff000,%rax
     be7:	0f 87 d0 02 00 00    	ja     ebd <hfsplus_fill_super+0x55d>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:463
     bed:	c7 85 b4 fd ff ff 1d 	movl   $0x1d,-0x24c(%rbp)
     bf4:	00 00 00 
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:464
     bf7:	48 c7 85 b8 fd ff ff 	movq   $0x0,-0x248(%rbp)
     bfe:	00 00 00 00 
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:465
     c02:	48 8b 7b 28          	mov    0x28(%rbx),%rdi
     c06:	48 8d b5 70 fd ff ff 	lea    -0x290(%rbp),%rsi
     c0d:	e8 00 00 00 00       	callq  c12 <hfsplus_fill_super+0x2b2>
     c12:	41 89 c6             	mov    %eax,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:466
     c15:	85 c0                	test   %eax,%eax
     c17:	0f 84 a3 00 00 00    	je     cc0 <hfsplus_fill_super+0x360>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:520
     c1d:	48 8b bd 60 fd ff ff 	mov    -0x2a0(%rbp),%rdi
     c24:	e8 00 00 00 00       	callq  c29 <hfsplus_fill_super+0x2c9>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:522
     c29:	48 8b 7b 38          	mov    0x38(%rbx),%rdi
     c2d:	e8 00 00 00 00       	callq  c32 <hfsplus_fill_super+0x2d2>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:524
     c32:	48 8b 7b 28          	mov    0x28(%rbx),%rdi
     c36:	e8 00 00 00 00       	callq  c3b <hfsplus_fill_super+0x2db>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:526
     c3b:	48 8b 7b 20          	mov    0x20(%rbx),%rdi
     c3f:	e8 00 00 00 00       	callq  c44 <hfsplus_fill_super+0x2e4>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:528
     c44:	48 8b 7b 08          	mov    0x8(%rbx),%rdi
     c48:	e8 00 00 00 00       	callq  c4d <hfsplus_fill_super+0x2ed>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:529
     c4d:	48 8b 7b 18          	mov    0x18(%rbx),%rdi
     c51:	e8 00 00 00 00       	callq  c56 <hfsplus_fill_super+0x2f6>
     c56:	e9 04 fe ff ff       	jmpq   a5f <hfsplus_fill_super+0xff>
     c5b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)
kmalloc():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:350
     c60:	bb 10 00 00 00       	mov    $0x10,%ebx
     c65:	e9 58 fd ff ff       	jmpq   9c2 <hfsplus_fill_super+0x62>
     c6a:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:396
     c70:	c7 43 78 01 00 00 00 	movl   $0x1,0x78(%rbx)
     c77:	e9 9e fe ff ff       	jmpq   b1a <hfsplus_fill_super+0x1ba>
     c7c:	0f 1f 40 00          	nopl   0x0(%rax)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:421
     c80:	41 8b 45 04          	mov    0x4(%r13),%eax
     c84:	a9 00 00 80 00       	test   $0x800000,%eax
     c89:	0f 85 a8 02 00 00    	jne    f37 <hfsplus_fill_super+0x5d7>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:424
     c8f:	a9 00 00 20 00       	test   $0x200000,%eax
     c94:	0f 84 df fe ff ff    	je     b79 <hfsplus_fill_super+0x219>
     c9a:	41 f6 44 24 50 01    	testb  $0x1,0x50(%r12)
     ca0:	0f 85 d3 fe ff ff    	jne    b79 <hfsplus_fill_super+0x219>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:426
     ca6:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     cad:	31 c0                	xor    %eax,%eax
     caf:	e8 00 00 00 00       	callq  cb4 <hfsplus_fill_super+0x354>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:430
     cb4:	49 83 4c 24 50 01    	orq    $0x1,0x50(%r12)
     cba:	e9 ba fe ff ff       	jmpq   b79 <hfsplus_fill_super+0x219>
     cbf:	90                   	nop
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:468
     cc0:	48 8d 8d b0 fd ff ff 	lea    -0x250(%rbp),%rcx
     cc7:	ba 02 00 00 00       	mov    $0x2,%edx
     ccc:	48 8b b5 70 fd ff ff 	mov    -0x290(%rbp),%rsi
     cd3:	4c 89 e7             	mov    %r12,%rdi
     cd6:	e8 00 00 00 00       	callq  cdb <hfsplus_fill_super+0x37b>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:469
     cdb:	ba 08 02 00 00       	mov    $0x208,%edx
     ce0:	48 8d b5 c0 fd ff ff 	lea    -0x240(%rbp),%rsi
     ce7:	48 8d bd 70 fd ff ff 	lea    -0x290(%rbp),%rdi
     cee:	e8 00 00 00 00       	callq  cf3 <hfsplus_fill_super+0x393>
     cf3:	85 c0                	test   %eax,%eax
     cf5:	75 49                	jne    d40 <hfsplus_fill_super+0x3e0>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:470
     cf7:	48 8d bd 70 fd ff ff 	lea    -0x290(%rbp),%rdi
     cfe:	e8 00 00 00 00       	callq  d03 <hfsplus_fill_super+0x3a3>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:471
     d03:	66 81 bd c0 fd ff ff 	cmpw   $0x100,-0x240(%rbp)
     d0a:	00 01 
     d0c:	0f 85 0b ff ff ff    	jne    c1d <hfsplus_fill_super+0x2bd>
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     d12:	8b 85 c8 fd ff ff    	mov    -0x238(%rbp),%eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:473
     d18:	4c 89 e7             	mov    %r12,%rdi
__fswab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     d1b:	0f c8                	bswap  %eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:473
     d1d:	89 c6                	mov    %eax,%esi
     d1f:	e8 00 00 00 00       	callq  d24 <hfsplus_fill_super+0x3c4>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:474
     d24:	48 3d 00 f0 ff ff    	cmp    $0xfffffffffffff000,%rax
     d2a:	0f 87 33 02 00 00    	ja     f63 <hfsplus_fill_super+0x603>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:478
     d30:	48 89 43 40          	mov    %rax,0x40(%rbx)
     d34:	eb 16                	jmp    d4c <hfsplus_fill_super+0x3ec>
     d36:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)
     d3d:	00 00 00 
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:480
     d40:	48 8d bd 70 fd ff ff 	lea    -0x290(%rbp),%rdi
     d47:	e8 00 00 00 00       	callq  d4c <hfsplus_fill_super+0x3ec>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:482
     d4c:	41 f6 44 24 50 01    	testb  $0x1,0x50(%r12)
     d52:	74 54                	je     da8 <hfsplus_fill_super+0x448>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:506
     d54:	49 c7 84 24 f0 02 00 	movq   $0x0,0x2f0(%r12)
     d5b:	00 00 00 00 00 
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:507
     d60:	48 8b bd 60 fd ff ff 	mov    -0x2a0(%rbp),%rdi
     d67:	e8 00 00 00 00       	callq  d6c <hfsplus_fill_super+0x40c>
     d6c:	49 89 44 24 60       	mov    %rax,0x60(%r12)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:508
     d71:	48 85 c0             	test   %rax,%rax
     d74:	0f 84 e6 00 00 00    	je     e60 <hfsplus_fill_super+0x500>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:513
     d7a:	48 8b 7b 48          	mov    0x48(%rbx),%rdi
     d7e:	e8 00 00 00 00       	callq  d83 <hfsplus_fill_super+0x423>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:514
     d83:	4c 89 7b 48          	mov    %r15,0x48(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:515
     d87:	e9 ec fc ff ff       	jmpq   a78 <hfsplus_fill_super+0x118>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:385
     d8c:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     d93:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:359
     d95:	41 be ea ff ff ff    	mov    $0xffffffea,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:385
     d9b:	e8 00 00 00 00       	callq  da0 <hfsplus_fill_super+0x440>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:386
     da0:	e9 9f fe ff ff       	jmpq   c44 <hfsplus_fill_super+0x2e4>
     da5:	0f 1f 00             	nopl   (%rax)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:487
     da8:	41 c7 45 08 48 2b 4c 	movl   $0x784c2b48,0x8(%r13)
     daf:	78 
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:488
     db0:	e8 00 00 00 00       	callq  db5 <hfsplus_fill_super+0x455>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:492
     db5:	be 01 00 00 00       	mov    $0x1,%esi
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:488
     dba:	05 80 b0 25 7c       	add    $0x7c25b080,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:492
     dbf:	4c 89 e7             	mov    %r12,%rdi
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     dc2:	0f c8                	bswap  %eax
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:488
     dc4:	41 89 45 14          	mov    %eax,0x14(%r13)
be32_add_cpu():
/home/pivanof/def_workspace/linux/include/linux/byteorder/generic.h:165
     dc8:	41 8b 45 44          	mov    0x44(%r13),%eax
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     dcc:	0f c8                	bswap  %eax
be32_add_cpu():
/home/pivanof/def_workspace/linux/include/linux/byteorder/generic.h:165
     dce:	ff c0                	inc    %eax
__arch_swab32():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/swab.h:21
     dd0:	0f c8                	bswap  %eax
be32_add_cpu():
/home/pivanof/def_workspace/linux/include/linux/byteorder/generic.h:165
     dd2:	41 89 45 44          	mov    %eax,0x44(%r13)
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:490
     dd6:	41 8b 45 04          	mov    0x4(%r13),%eax
     dda:	25 ff ff fe ff       	and    $0xfffeffff,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:491
     ddf:	0d 00 00 08 00       	or     $0x80000,%eax
     de4:	41 89 45 04          	mov    %eax,0x4(%r13)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:492
     de8:	e8 00 00 00 00       	callq  ded <hfsplus_fill_super+0x48d>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:494
     ded:	48 83 7b 40 00       	cmpq   $0x0,0x40(%rbx)
     df2:	0f 85 5c ff ff ff    	jne    d54 <hfsplus_fill_super+0x3f4>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:495
     df8:	48 8b bd 68 fd ff ff 	mov    -0x298(%rbp),%rdi
     dff:	e8 00 00 00 00       	callq  e04 <hfsplus_fill_super+0x4a4>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:496
     e04:	4c 89 e7             	mov    %r12,%rdi
     e07:	be 00 40 00 00       	mov    $0x4000,%esi
     e0c:	e8 00 00 00 00       	callq  e11 <hfsplus_fill_super+0x4b1>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:497
     e11:	48 8d 95 b0 fd ff ff 	lea    -0x250(%rbp),%rdx
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:496
     e18:	48 89 43 40          	mov    %rax,0x40(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:497
     e1c:	48 89 c1             	mov    %rax,%rcx
     e1f:	48 8b b5 60 fd ff ff 	mov    -0x2a0(%rbp),%rsi
     e26:	48 8b 78 40          	mov    0x40(%rax),%rdi
     e2a:	e8 00 00 00 00       	callq  e2f <hfsplus_fill_super+0x4cf>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:499
     e2f:	48 8b bd 68 fd ff ff 	mov    -0x298(%rbp),%rdi
     e36:	e8 00 00 00 00       	callq  e3b <hfsplus_fill_super+0x4db>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:501
     e3b:	48 8b 7b 40          	mov    0x40(%rbx),%rdi
HFSPLUS_I():
/home/pivanof/def_workspace/linux/fs/hfsplus/hfsplus_fs.h:229
     e3f:	48 8d 87 00 ff ff ff 	lea    -0x100(%rdi),%rax
set_bit():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/bitops.h:63
     e46:	f0 80 88 d0 00 00 00 	lock orb $0x2,0xd0(%rax)
     e4d:	02 
mark_inode_dirty():
/home/pivanof/def_workspace/linux/include/linux/fs.h:1740
     e4e:	be 07 00 00 00       	mov    $0x7,%esi
     e53:	e8 00 00 00 00       	callq  e58 <hfsplus_fill_super+0x4f8>
     e58:	e9 f7 fe ff ff       	jmpq   d54 <hfsplus_fill_super+0x3f4>
     e5d:	0f 1f 00             	nopl   (%rax)
hfsplus_fill_super():
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:518
     e60:	48 8b 7b 40          	mov    0x40(%rbx),%rdi
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:509
     e64:	41 be f4 ff ff ff    	mov    $0xfffffff4,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:518
     e6a:	e8 00 00 00 00       	callq  e6f <hfsplus_fill_super+0x50f>
     e6f:	e9 a9 fd ff ff       	jmpq   c1d <hfsplus_fill_super+0x2bd>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:536
     e74:	e8 00 00 00 00       	callq  e79 <hfsplus_fill_super+0x519>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:361
     e79:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:359
     e80:	41 be ea ff ff ff    	mov    $0xffffffea,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:361
     e86:	e8 00 00 00 00       	callq  e8b <hfsplus_fill_super+0x52b>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:346
     e8b:	45 31 ff             	xor    %r15d,%r15d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:362
     e8e:	e9 cc fb ff ff       	jmpq   a5f <hfsplus_fill_super+0xff>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:369
     e93:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:359
     e9a:	41 be ea ff ff ff    	mov    $0xffffffea,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:369
     ea0:	e8 00 00 00 00       	callq  ea5 <hfsplus_fill_super+0x545>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:370
     ea5:	e9 b5 fb ff ff       	jmpq   a5f <hfsplus_fill_super+0xff>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:449
     eaa:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     eb1:	31 c0                	xor    %eax,%eax
     eb3:	e8 00 00 00 00       	callq  eb8 <hfsplus_fill_super+0x558>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:451
     eb8:	e9 75 fd ff ff       	jmpq   c32 <hfsplus_fill_super+0x2d2>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:458
     ebd:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     ec4:	31 c0                	xor    %eax,%eax
     ec6:	e8 00 00 00 00       	callq  ecb <hfsplus_fill_super+0x56b>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:459
     ecb:	44 8b b5 60 fd ff ff 	mov    -0x2a0(%rbp),%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:460
     ed2:	e9 52 fd ff ff       	jmpq   c29 <hfsplus_fill_super+0x2c9>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:414
     ed7:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     ede:	31 c0                	xor    %eax,%eax
     ee0:	e8 00 00 00 00       	callq  ee5 <hfsplus_fill_super+0x585>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:418
     ee5:	49 83 4c 24 50 01    	orq    $0x1,0x50(%r12)
     eeb:	e9 89 fc ff ff       	jmpq   b79 <hfsplus_fill_super+0x219>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:438
     ef0:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:433
     ef7:	41 be ea ff ff ff    	mov    $0xffffffea,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:438
     efd:	e8 00 00 00 00       	callq  f02 <hfsplus_fill_super+0x5a2>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:439
     f02:	e9 3d fd ff ff       	jmpq   c44 <hfsplus_fill_super+0x2e4>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:376
     f07:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     f0e:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:359
     f10:	41 be ea ff ff ff    	mov    $0xffffffea,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:376
     f16:	e8 00 00 00 00       	callq  f1b <hfsplus_fill_super+0x5bb>
     f1b:	e9 3f fb ff ff       	jmpq   a5f <hfsplus_fill_super+0xff>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:443
     f20:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:433
     f27:	41 be ea ff ff ff    	mov    $0xffffffea,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:443
     f2d:	e8 00 00 00 00       	callq  f32 <hfsplus_fill_super+0x5d2>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:444
     f32:	e9 04 fd ff ff       	jmpq   c3b <hfsplus_fill_super+0x2db>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:422
     f37:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     f3e:	31 c0                	xor    %eax,%eax
     f40:	e8 00 00 00 00       	callq  f45 <hfsplus_fill_super+0x5e5>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:423
     f45:	49 83 4c 24 50 01    	orq    $0x1,0x50(%r12)
     f4b:	e9 29 fc ff ff       	jmpq   b79 <hfsplus_fill_super+0x219>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:405
     f50:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
     f57:	31 c0                	xor    %eax,%eax
     f59:	e8 00 00 00 00       	callq  f5e <hfsplus_fill_super+0x5fe>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:406
     f5e:	e9 e1 fc ff ff       	jmpq   c44 <hfsplus_fill_super+0x2e4>
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:475
     f63:	41 89 c6             	mov    %eax,%r14d
/home/pivanof/def_workspace/linux/fs/hfsplus/super.c:476
     f66:	e9 b2 fc ff ff       	jmpq   c1d <hfsplus_fill_super+0x2bd>
     f6b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)

0000000000000f70 <hfsplus_fill_defaults>:
hfsplus_fill_defaults():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:49
     f70:	55                   	push   %rbp
     f71:	48 89 e5             	mov    %rsp,%rbp
     f74:	53                   	push   %rbx
     f75:	48 83 ec 08          	sub    $0x8,%rsp
     f79:	e8 00 00 00 00       	callq  f7e <hfsplus_fill_defaults+0xe>
     f7e:	48 89 fb             	mov    %rdi,%rbx
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:50
     f81:	48 85 ff             	test   %rdi,%rdi
     f84:	74 5d                	je     fe3 <hfsplus_fill_defaults+0x73>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:53
     f86:	c7 87 d8 00 00 00 3f 	movl   $0x3f3f3f3f,0xd8(%rdi)
     f8d:	3f 3f 3f 
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:54
     f90:	c7 87 dc 00 00 00 3f 	movl   $0x3f3f3f3f,0xdc(%rdi)
     f97:	3f 3f 3f 
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:55
     f9a:	e8 00 00 00 00       	callq  f9f <hfsplus_fill_defaults+0x2f>
     f9f:	66 89 83 e0 00 00 00 	mov    %ax,0xe0(%rbx)
get_current():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/current.h:14
     fa6:	65 48 8b 04 25 00 00 	mov    %gs:0x0,%rax
     fad:	00 00 
hfsplus_fill_defaults():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:56
     faf:	48 8b 90 58 04 00 00 	mov    0x458(%rax),%rdx
     fb6:	8b 52 04             	mov    0x4(%rdx),%edx
     fb9:	89 93 e4 00 00 00    	mov    %edx,0xe4(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:57
     fbf:	48 8b 80 58 04 00 00 	mov    0x458(%rax),%rax
     fc6:	8b 40 08             	mov    0x8(%rax),%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:58
     fc9:	c7 83 ec 00 00 00 ff 	movl   $0xffffffff,0xec(%rbx)
     fd0:	ff ff ff 
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:57
     fd3:	89 83 e8 00 00 00    	mov    %eax,0xe8(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:59
     fd9:	c7 83 f0 00 00 00 ff 	movl   $0xffffffff,0xf0(%rbx)
     fe0:	ff ff ff 
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:60
     fe3:	48 83 c4 08          	add    $0x8,%rsp
     fe7:	5b                   	pop    %rbx
     fe8:	c9                   	leaveq 
     fe9:	c3                   	retq   
     fea:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)

0000000000000ff0 <hfsplus_parse_options_remount>:
hfsplus_parse_options_remount():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:72
     ff0:	55                   	push   %rbp
     ff1:	48 89 e5             	mov    %rsp,%rbp
     ff4:	53                   	push   %rbx
     ff5:	48 83 ec 48          	sub    $0x48,%rsp
     ff9:	e8 00 00 00 00       	callq  ffe <hfsplus_parse_options_remount+0xe>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:78
     ffe:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:72
    1000:	48 89 7d b8          	mov    %rdi,-0x48(%rbp)
    1004:	48 89 f3             	mov    %rsi,%rbx
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:77
    1007:	48 85 ff             	test   %rdi,%rdi
    100a:	74 46                	je     1052 <hfsplus_parse_options_remount+0x62>
    100c:	0f 1f 40 00          	nopl   0x0(%rax)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:80
    1010:	48 c7 c6 00 00 00 00 	mov    $0x0,%rsi
    1017:	48 8d 7d b8          	lea    -0x48(%rbp),%rdi
    101b:	e8 00 00 00 00       	callq  1020 <hfsplus_parse_options_remount+0x30>
    1020:	48 85 c0             	test   %rax,%rax
    1023:	74 2b                	je     1050 <hfsplus_parse_options_remount+0x60>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:81
    1025:	80 38 00             	cmpb   $0x0,(%rax)
    1028:	74 e6                	je     1010 <hfsplus_parse_options_remount+0x20>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:84
    102a:	48 8d 55 c0          	lea    -0x40(%rbp),%rdx
    102e:	48 c7 c6 00 00 00 00 	mov    $0x0,%rsi
    1035:	48 89 c7             	mov    %rax,%rdi
    1038:	e8 00 00 00 00       	callq  103d <hfsplus_parse_options_remount+0x4d>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:85
    103d:	83 f8 0c             	cmp    $0xc,%eax
    1040:	75 ce                	jne    1010 <hfsplus_parse_options_remount+0x20>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:87
    1042:	c7 03 01 00 00 00    	movl   $0x1,(%rbx)
    1048:	eb c6                	jmp    1010 <hfsplus_parse_options_remount+0x20>
    104a:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:94
    1050:	b0 01                	mov    $0x1,%al
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:95
    1052:	48 83 c4 48          	add    $0x48,%rsp
    1056:	5b                   	pop    %rbx
    1057:	c9                   	leaveq 
    1058:	c3                   	retq   
    1059:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)

0000000000001060 <hfsplus_parse_options>:
hfsplus_parse_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:100
    1060:	55                   	push   %rbp
    1061:	48 89 e5             	mov    %rsp,%rbp
    1064:	41 56                	push   %r14
    1066:	41 55                	push   %r13
    1068:	41 54                	push   %r12
    106a:	53                   	push   %rbx
    106b:	48 83 ec 50          	sub    $0x50,%rsp
    106f:	e8 00 00 00 00       	callq  1074 <hfsplus_parse_options+0x14>
    1074:	48 89 7d 98          	mov    %rdi,-0x68(%rbp)
    1078:	48 89 f3             	mov    %rsi,%rbx
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:154
    107b:	4c 8d ae f0 00 00 00 	lea    0xf0(%rsi),%r13
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:148
    1082:	4c 8d a6 ec 00 00 00 	lea    0xec(%rsi),%r12
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:105
    1089:	48 85 ff             	test   %rdi,%rdi
    108c:	74 5a                	je     10e8 <hfsplus_parse_options+0x88>
    108e:	66 90                	xchg   %ax,%ax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:108
    1090:	48 c7 c6 00 00 00 00 	mov    $0x0,%rsi
    1097:	48 8d 7d 98          	lea    -0x68(%rbp),%rdi
    109b:	e8 00 00 00 00       	callq  10a0 <hfsplus_parse_options+0x40>
    10a0:	48 85 c0             	test   %rax,%rax
    10a3:	74 43                	je     10e8 <hfsplus_parse_options+0x88>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:109
    10a5:	80 38 00             	cmpb   $0x0,(%rax)
    10a8:	74 e6                	je     1090 <hfsplus_parse_options+0x30>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:112
    10aa:	48 8d 55 a0          	lea    -0x60(%rbp),%rdx
    10ae:	48 c7 c6 00 00 00 00 	mov    $0x0,%rsi
    10b5:	48 89 c7             	mov    %rax,%rdi
    10b8:	e8 00 00 00 00       	callq  10bd <hfsplus_parse_options+0x5d>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:113
    10bd:	83 f8 0c             	cmp    $0xc,%eax
    10c0:	76 16                	jbe    10d8 <hfsplus_parse_options+0x78>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:192
    10c2:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:207
    10c5:	48 83 c4 50          	add    $0x50,%rsp
    10c9:	44 89 e0             	mov    %r12d,%eax
    10cc:	5b                   	pop    %rbx
    10cd:	41 5c                	pop    %r12
    10cf:	41 5d                	pop    %r13
    10d1:	41 5e                	pop    %r14
    10d3:	c9                   	leaveq 
    10d4:	c3                   	retq   
    10d5:	0f 1f 00             	nopl   (%rax)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:113
    10d8:	89 c0                	mov    %eax,%eax
    10da:	ff 24 c5 00 00 00 00 	jmpq   *0x0(,%rax,8)
    10e1:	0f 1f 80 00 00 00 00 	nopl   0x0(%rax)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:206
    10e8:	41 bc 01 00 00 00    	mov    $0x1,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:197
    10ee:	48 83 7b 48 00       	cmpq   $0x0,0x48(%rbx)
    10f3:	75 d0                	jne    10c5 <hfsplus_parse_options+0x65>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:199
    10f5:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    10fc:	e8 00 00 00 00       	callq  1101 <hfsplus_parse_options+0xa1>
    1101:	48 89 43 48          	mov    %rax,0x48(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:200
    1105:	48 85 c0             	test   %rax,%rax
    1108:	75 bb                	jne    10c5 <hfsplus_parse_options+0x65>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:201
    110a:	e8 00 00 00 00       	callq  110f <hfsplus_parse_options+0xaf>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:117
    110f:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:201
    1112:	48 89 43 48          	mov    %rax,0x48(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:117
    1116:	48 85 c0             	test   %rax,%rax
    1119:	41 0f 95 c4          	setne  %r12b
    111d:	eb a6                	jmp    10c5 <hfsplus_parse_options+0x65>
    111f:	90                   	nop
set_bit():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/bitops.h:63
    1120:	f0 80 8b f8 00 00 00 	lock orb $0x20,0xf8(%rbx)
    1127:	20 
    1128:	e9 63 ff ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    112d:	0f 1f 00             	nopl   (%rax)
clear_bit():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/bitops.h:101
    1130:	f0 80 a3 f8 00 00 00 	lock andb $0xdf,0xf8(%rbx)
    1137:	df 
    1138:	e9 53 ff ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    113d:	0f 1f 00             	nopl   (%rax)
    1140:	f0 80 a3 f8 00 00 00 	lock andb $0xfd,0xf8(%rbx)
    1147:	fd 
    1148:	0f 1f 84 00 00 00 00 	nopl   0x0(%rax,%rax,1)
    114f:	00 
    1150:	e9 3b ff ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    1155:	0f 1f 00             	nopl   (%rax)
set_bit():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/bitops.h:63
    1158:	f0 80 8b f8 00 00 00 	lock orb $0x2,0xf8(%rbx)
    115f:	02 
    1160:	e9 2b ff ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    1165:	0f 1f 00             	nopl   (%rax)
hfsplus_parse_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:160
    1168:	48 83 7b 48 00       	cmpq   $0x0,0x48(%rbx)
    116d:	0f 1f 00             	nopl   (%rax)
    1170:	0f 85 13 02 00 00    	jne    1389 <hfsplus_parse_options+0x329>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:164
    1176:	48 8d 7d a0          	lea    -0x60(%rbp),%rdi
    117a:	e8 00 00 00 00       	callq  117f <hfsplus_parse_options+0x11f>
    117f:	49 89 c6             	mov    %rax,%r14
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:165
    1182:	48 85 c0             	test   %rax,%rax
    1185:	0f 84 7a 01 00 00    	je     1305 <hfsplus_parse_options+0x2a5>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:166
    118b:	48 89 c7             	mov    %rax,%rdi
    118e:	e8 00 00 00 00       	callq  1193 <hfsplus_parse_options+0x133>
    1193:	48 89 43 48          	mov    %rax,0x48(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:167
    1197:	48 85 c0             	test   %rax,%rax
    119a:	0f 84 ca 01 00 00    	je     136a <hfsplus_parse_options+0x30a>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:174
    11a0:	4c 89 f7             	mov    %r14,%rdi
    11a3:	e8 00 00 00 00       	callq  11a8 <hfsplus_parse_options+0x148>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:175
    11a8:	e9 e3 fe ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    11ad:	0f 1f 00             	nopl   (%rax)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:154
    11b0:	4c 89 ee             	mov    %r13,%rsi
    11b3:	48 8d 7d a0          	lea    -0x60(%rbp),%rdi
    11b7:	e8 00 00 00 00       	callq  11bc <hfsplus_parse_options+0x15c>
    11bc:	85 c0                	test   %eax,%eax
    11be:	0f 84 cc fe ff ff    	je     1090 <hfsplus_parse_options+0x30>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:155
    11c4:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    11cb:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:156
    11cd:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:155
    11d0:	e8 00 00 00 00       	callq  11d5 <hfsplus_parse_options+0x175>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:156
    11d5:	e9 eb fe ff ff       	jmpq   10c5 <hfsplus_parse_options+0x65>
    11da:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:148
    11e0:	4c 89 e6             	mov    %r12,%rsi
    11e3:	48 8d 7d a0          	lea    -0x60(%rbp),%rdi
    11e7:	e8 00 00 00 00       	callq  11ec <hfsplus_parse_options+0x18c>
    11ec:	85 c0                	test   %eax,%eax
    11ee:	0f 84 9c fe ff ff    	je     1090 <hfsplus_parse_options+0x30>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:149
    11f4:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    11fb:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:150
    11fd:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:149
    1200:	e8 00 00 00 00       	callq  1205 <hfsplus_parse_options+0x1a5>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:150
    1205:	e9 bb fe ff ff       	jmpq   10c5 <hfsplus_parse_options+0x65>
    120a:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:141
    1210:	48 8d 75 dc          	lea    -0x24(%rbp),%rsi
    1214:	48 8d 7d a0          	lea    -0x60(%rbp),%rdi
    1218:	e8 00 00 00 00       	callq  121d <hfsplus_parse_options+0x1bd>
    121d:	85 c0                	test   %eax,%eax
    121f:	0f 85 03 01 00 00    	jne    1328 <hfsplus_parse_options+0x2c8>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:145
    1225:	8b 45 dc             	mov    -0x24(%rbp),%eax
    1228:	89 83 e8 00 00 00    	mov    %eax,0xe8(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:146
    122e:	e9 5d fe ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    1233:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:134
    1238:	48 8d 75 dc          	lea    -0x24(%rbp),%rsi
    123c:	48 8d 7d a0          	lea    -0x60(%rbp),%rdi
    1240:	e8 00 00 00 00       	callq  1245 <hfsplus_parse_options+0x1e5>
    1245:	85 c0                	test   %eax,%eax
    1247:	0f 85 f1 00 00 00    	jne    133e <hfsplus_parse_options+0x2de>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:138
    124d:	8b 45 dc             	mov    -0x24(%rbp),%eax
    1250:	89 83 e4 00 00 00    	mov    %eax,0xe4(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:139
    1256:	e9 35 fe ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    125b:	0f 1f 44 00 00       	nopl   0x0(%rax,%rax,1)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:127
    1260:	48 8d 75 dc          	lea    -0x24(%rbp),%rsi
    1264:	48 8d 7d a0          	lea    -0x60(%rbp),%rdi
    1268:	e8 00 00 00 00       	callq  126d <hfsplus_parse_options+0x20d>
    126d:	85 c0                	test   %eax,%eax
    126f:	0f 85 df 00 00 00    	jne    1354 <hfsplus_parse_options+0x2f4>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:131
    1275:	8b 45 dc             	mov    -0x24(%rbp),%eax
    1278:	66 89 83 e0 00 00 00 	mov    %ax,0xe0(%rbx)
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:132
    127f:	e9 0c fe ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    1284:	0f 1f 40 00          	nopl   0x0(%rax)
match_fourchar():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:65
    1288:	48 8b 55 a0          	mov    -0x60(%rbp),%rdx
    128c:	48 8b 45 a8          	mov    -0x58(%rbp),%rax
    1290:	48 29 d0             	sub    %rdx,%rax
    1293:	48 83 f8 04          	cmp    $0x4,%rax
    1297:	0f 84 7e 00 00 00    	je     131b <hfsplus_parse_options+0x2bb>
hfsplus_parse_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:123
    129d:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:122
    12a0:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    12a7:	31 c0                	xor    %eax,%eax
    12a9:	e8 00 00 00 00       	callq  12ae <hfsplus_parse_options+0x24e>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:207
    12ae:	48 83 c4 50          	add    $0x50,%rsp
    12b2:	44 89 e0             	mov    %r12d,%eax
    12b5:	5b                   	pop    %rbx
    12b6:	41 5c                	pop    %r12
    12b8:	41 5d                	pop    %r13
    12ba:	41 5e                	pop    %r14
    12bc:	c9                   	leaveq 
    12bd:	c3                   	retq   
    12be:	66 90                	xchg   %ax,%ax
match_fourchar():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:65
    12c0:	48 8b 55 a0          	mov    -0x60(%rbp),%rdx
    12c4:	48 8b 45 a8          	mov    -0x58(%rbp),%rax
    12c8:	48 29 d0             	sub    %rdx,%rax
    12cb:	48 83 f8 04          	cmp    $0x4,%rax
    12cf:	74 3d                	je     130e <hfsplus_parse_options+0x2ae>
hfsplus_parse_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:117
    12d1:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:116
    12d4:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    12db:	31 c0                	xor    %eax,%eax
    12dd:	e8 00 00 00 00       	callq  12e2 <hfsplus_parse_options+0x282>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:207
    12e2:	48 83 c4 50          	add    $0x50,%rsp
    12e6:	44 89 e0             	mov    %r12d,%eax
    12e9:	5b                   	pop    %rbx
    12ea:	41 5c                	pop    %r12
    12ec:	41 5d                	pop    %r13
    12ee:	41 5e                	pop    %r14
    12f0:	c9                   	leaveq 
    12f1:	c3                   	retq   
    12f2:	66 0f 1f 44 00 00    	nopw   0x0(%rax,%rax,1)
set_bit():
/home/pivanof/def_workspace/linux/arch/x86/include/asm/bitops.h:63
    12f8:	f0 80 8b f8 00 00 00 	lock orb $0x4,0xf8(%rbx)
    12ff:	04 
    1300:	e9 8b fd ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
hfsplus_parse_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:165
    1305:	48 8b 43 48          	mov    0x48(%rbx),%rax
    1309:	e9 89 fe ff ff       	jmpq   1197 <hfsplus_parse_options+0x137>
match_fourchar():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:67
    130e:	8b 02                	mov    (%rdx),%eax
    1310:	89 83 d8 00 00 00    	mov    %eax,0xd8(%rbx)
    1316:	e9 75 fd ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
    131b:	8b 02                	mov    (%rdx),%eax
    131d:	89 83 dc 00 00 00    	mov    %eax,0xdc(%rbx)
    1323:	e9 68 fd ff ff       	jmpq   1090 <hfsplus_parse_options+0x30>
hfsplus_parse_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:142
    1328:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    132f:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:143
    1331:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:142
    1334:	e8 00 00 00 00       	callq  1339 <hfsplus_parse_options+0x2d9>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:143
    1339:	e9 87 fd ff ff       	jmpq   10c5 <hfsplus_parse_options+0x65>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:135
    133e:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    1345:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:136
    1347:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:135
    134a:	e8 00 00 00 00       	callq  134f <hfsplus_parse_options+0x2ef>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:136
    134f:	e9 71 fd ff ff       	jmpq   10c5 <hfsplus_parse_options+0x65>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:128
    1354:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    135b:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:129
    135d:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:128
    1360:	e8 00 00 00 00       	callq  1365 <hfsplus_parse_options+0x305>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:129
    1365:	e9 5b fd ff ff       	jmpq   10c5 <hfsplus_parse_options+0x65>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:168
    136a:	4c 89 f6             	mov    %r14,%rsi
    136d:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:172
    1374:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:168
    1377:	e8 00 00 00 00       	callq  137c <hfsplus_parse_options+0x31c>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:171
    137c:	4c 89 f7             	mov    %r14,%rdi
    137f:	e8 00 00 00 00       	callq  1384 <hfsplus_parse_options+0x324>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:172
    1384:	e9 3c fd ff ff       	jmpq   10c5 <hfsplus_parse_options+0x65>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:161
    1389:	48 c7 c7 00 00 00 00 	mov    $0x0,%rdi
    1390:	31 c0                	xor    %eax,%eax
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:162
    1392:	45 31 e4             	xor    %r12d,%r12d
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:161
    1395:	e8 00 00 00 00       	callq  139a <hfsplus_parse_options+0x33a>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:162
    139a:	e9 26 fd ff ff       	jmpq   10c5 <hfsplus_parse_options+0x65>
    139f:	90                   	nop

00000000000013a0 <hfsplus_show_options>:
hfsplus_show_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:210
    13a0:	55                   	push   %rbp
    13a1:	48 89 e5             	mov    %rsp,%rbp
    13a4:	41 54                	push   %r12
    13a6:	53                   	push   %rbx
    13a7:	e8 00 00 00 00       	callq  13ac <hfsplus_show_options+0xc>
HFSPLUS_SB():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:230
    13ac:	48 8b 46 28          	mov    0x28(%rsi),%rax
hfsplus_show_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:210
    13b0:	49 89 fc             	mov    %rdi,%r12
HFSPLUS_SB():
/home/pivanof/def_workspace/linux/fs/hfsplus/hfsplus_fs.h:169
    13b3:	48 8b 98 b0 02 00 00 	mov    0x2b0(%rax),%rbx
hfsplus_show_options():
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:213
    13ba:	81 bb d8 00 00 00 3f 	cmpl   $0x3f3f3f3f,0xd8(%rbx)
    13c1:	3f 3f 3f 
    13c4:	74 15                	je     13db <hfsplus_show_options+0x3b>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:214
    13c6:	48 8d 93 d8 00 00 00 	lea    0xd8(%rbx),%rdx
    13cd:	48 c7 c6 00 00 00 00 	mov    $0x0,%rsi
    13d4:	31 c0                	xor    %eax,%eax
    13d6:	e8 00 00 00 00       	callq  13db <hfsplus_show_options+0x3b>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:215
    13db:	81 bb dc 00 00 00 3f 	cmpl   $0x3f3f3f3f,0xdc(%rbx)
    13e2:	3f 3f 3f 
    13e5:	74 18                	je     13ff <hfsplus_show_options+0x5f>
/home/pivanof/def_workspace/linux/fs/hfsplus/options.c:216
    13e7:	48 8d 93 dc 00 00 00 	lea    0xdc(%rbx),%rdx
    13ee:	48 c7 c6 00 00 00 00 	mov    $0x0,%rsi
    13f5:	4c 89 e7             	mov    %r12,%rdi
    13f8:	31 c0                	xor    %eax,%eax

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-03  4:37   ` Pavel Ivanov
@ 2011-09-03  6:57     ` Hin-Tak Leung
  2011-09-03 20:52         ` Pavel Ivanov
  0 siblings, 1 reply; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-03  6:57 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-fsdevel, linux-kernel

--- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> On Fri, Sep 2, 2011 at 11:59 PM,
> Hin-Tak Leung <hintak_leung@yahoo.co.uk>
> wrote:
> >> With kernel 3.1.0-rc4 any attempt to connect iPod
> to USB
> >> leads to
> >> kernel oops. I'd say that stacktrace of the oops
> is pretty
> >> much random
> >> and not related to HFS. But I was able to get
> useful info
> >> from it when
> >> I recompiled with CONFIG_SLUB_DEBUG_ON=y. In this
> case I
> >> don't get
> >> oops but the following instead:
> >
> > There are a few hfsplus related changes to do
> protection against invalid data like this, but may be there
> are more. It would be useful to have the output from your
> > objdump -l -d hfsplus.ko | grep  -A 1000
> '<hfsplus_fill_super>'
> > (the -l gives line numbers against the kernel tree, so
> would be useful if you run this against the ko there...)
> 
> Output of this command is in attachment.

That's interesting. You said "hfs: filesystem size too large." always appears twice (with kernel 3.1-rc4) before it oops. And in your 2.6.38.11 kernel, you had "hfs: unable to find HFS+ superblock" twice.

The oops place is the "kfree(sbi->s_backup_vhdr)" in line 529 in fs/hfsplus/super.c:

527: out_free_vhdr:
528:        kfree(sbi->s_vhdr);
529:        kfree(sbi->s_backup_vhdr);

It would appear the s_backup_vhdr is somehow garbage but that was not caught in the 3.1-rc4 version of hfsplus_read_wrapper() ; it was caught by the 2.6.38.11 version of hfsplus_read_wrapper(). hfsplus_read_wrapper() was changed in the 2.6.39/3.0 time frame by this:

    commit 52399b171dfaea02b6944cd6feba49b624147126
    Author: Christoph Hellwig <hch@tuxera.com>
    Date:   Tue Nov 23 14:37:47 2010 +0100
    
        hfsplus: use raw bio access for the volume headers

That's code I don't quite understand (I worked on the hfsplus journal code recently, supposedly mentoring for that GSoC project).

If you are happy enough to do a bit of experimenting, can you try putting a 
"if(sbi->s_backup_vhdr)" before line 529?

Also it is curious why it wasn't caught in wrapper.c arond 229 to 236 ending with:
"if (sbi->s_backup_vhdr->signature != sbi->s_vhdr->signature)"


The file system too large comes from line 402 in super.c:
-----------------------
        err = generic_check_addressable(sbi->alloc_blksz_shift,
                                        sbi->total_blocks);
        if (err) {
                printk(KERN_ERR "hfs: filesystem size too large.\n");
                goto out_free_vhdr;

-----------------------
So it might be interesting to see what is too large... try changing that to:

printk(KERN_ERR "hfs: filesystem size too large blksz_shift=%d, total_blocks=%d\n", sbi->alloc_blksz_shift, sbi->total_blocks);

?

It is a 42GB image - if it were smaller I would suggest dd'ing that and upload it somewhere to check...




^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-03  6:57     ` Hin-Tak Leung
@ 2011-09-03 20:52         ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-03 20:52 UTC (permalink / raw)
  To: Hin-Tak Leung; +Cc: linux-fsdevel, linux-kernel

Hin-Tak,

"if(sbi->s_backup_vhdr)" as you suggested didn't help. But I made
another change. I made fs/hfsplus/super.c to look like this near the
line 529:

out_free_vhdr:
	printk(KERN_ERR "hfs: sbi->s_vhdr = %p, sbi->s_backup_vhdr = %p\n",
sbi->s_vhdr, sbi->s_backup_vhdr);
	kfree(sbi->s_vhdr);
	kfree(sbi->s_backup_vhdr);

And here's what I see after connecting an iPod:

[   92.549197] hfs: filesystem size too large blksz_shift=14,
total_blocks=486494
[   92.635714] hfs: sbi->s_vhdr = ffff88013703a690, sbi->s_backup_vhdr
= ffff88013703e268
[   92.730543] =============================================================================
[   92.828425] BUG kmalloc-4096: Invalid object pointer 0xffff88013703a690
...
[   93.213890] =============================================================================
[   93.311834] BUG kmalloc-4096: Invalid object pointer 0xffff88013703e268
...
[   93.868618] hfs: filesystem size too large blksz_shift=14,
total_blocks=486494
[   93.955327] hfs: sbi->s_vhdr = ffff8801343c37d8, sbi->s_backup_vhdr
= ffff8801343c5120
[   94.050133] =============================================================================
[   94.148026] BUG kmalloc-4096: Invalid object pointer 0xffff8801343c37d8
...
[   94.533895] =============================================================================
[   94.631746] BUG kmalloc-4096: Invalid object pointer 0xffff8801343c5120


So these 2 pointers are exactly what causing the trouble.


Pavel


On Sat, Sep 3, 2011 at 2:57 AM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
> --- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:
>
>> On Fri, Sep 2, 2011 at 11:59 PM,
>> Hin-Tak Leung <hintak_leung@yahoo.co.uk>
>> wrote:
>> >> With kernel 3.1.0-rc4 any attempt to connect iPod
>> to USB
>> >> leads to
>> >> kernel oops. I'd say that stacktrace of the oops
>> is pretty
>> >> much random
>> >> and not related to HFS. But I was able to get
>> useful info
>> >> from it when
>> >> I recompiled with CONFIG_SLUB_DEBUG_ON=y. In this
>> case I
>> >> don't get
>> >> oops but the following instead:
>> >
>> > There are a few hfsplus related changes to do
>> protection against invalid data like this, but may be there
>> are more. It would be useful to have the output from your
>> > objdump -l -d hfsplus.ko | grep  -A 1000
>> '<hfsplus_fill_super>'
>> > (the -l gives line numbers against the kernel tree, so
>> would be useful if you run this against the ko there...)
>>
>> Output of this command is in attachment.
>
> That's interesting. You said "hfs: filesystem size too large." always appears twice (with kernel 3.1-rc4) before it oops. And in your 2.6.38.11 kernel, you had "hfs: unable to find HFS+ superblock" twice.
>
> The oops place is the "kfree(sbi->s_backup_vhdr)" in line 529 in fs/hfsplus/super.c:
>
> 527: out_free_vhdr:
> 528:        kfree(sbi->s_vhdr);
> 529:        kfree(sbi->s_backup_vhdr);
>
> It would appear the s_backup_vhdr is somehow garbage but that was not caught in the 3.1-rc4 version of hfsplus_read_wrapper() ; it was caught by the 2.6.38.11 version of hfsplus_read_wrapper(). hfsplus_read_wrapper() was changed in the 2.6.39/3.0 time frame by this:
>
>    commit 52399b171dfaea02b6944cd6feba49b624147126
>    Author: Christoph Hellwig <hch@tuxera.com>
>    Date:   Tue Nov 23 14:37:47 2010 +0100
>
>        hfsplus: use raw bio access for the volume headers
>
> That's code I don't quite understand (I worked on the hfsplus journal code recently, supposedly mentoring for that GSoC project).
>
> If you are happy enough to do a bit of experimenting, can you try putting a
> "if(sbi->s_backup_vhdr)" before line 529?
>
> Also it is curious why it wasn't caught in wrapper.c arond 229 to 236 ending with:
> "if (sbi->s_backup_vhdr->signature != sbi->s_vhdr->signature)"
>
>
> The file system too large comes from line 402 in super.c:
> -----------------------
>        err = generic_check_addressable(sbi->alloc_blksz_shift,
>                                        sbi->total_blocks);
>        if (err) {
>                printk(KERN_ERR "hfs: filesystem size too large.\n");
>                goto out_free_vhdr;
>
> -----------------------
> So it might be interesting to see what is too large... try changing that to:
>
> printk(KERN_ERR "hfs: filesystem size too large blksz_shift=%d, total_blocks=%d\n", sbi->alloc_blksz_shift, sbi->total_blocks);
>
> ?
>
> It is a 42GB image - if it were smaller I would suggest dd'ing that and upload it somewhere to check...
>
>
>
>

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-03 20:52         ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-03 20:52 UTC (permalink / raw)
  To: Hin-Tak Leung; +Cc: linux-fsdevel, linux-kernel

Hin-Tak,

"if(sbi->s_backup_vhdr)" as you suggested didn't help. But I made
another change. I made fs/hfsplus/super.c to look like this near the
line 529:

out_free_vhdr:
	printk(KERN_ERR "hfs: sbi->s_vhdr = %p, sbi->s_backup_vhdr = %p\n",
sbi->s_vhdr, sbi->s_backup_vhdr);
	kfree(sbi->s_vhdr);
	kfree(sbi->s_backup_vhdr);

And here's what I see after connecting an iPod:

[   92.549197] hfs: filesystem size too large blksz_shift=14,
total_blocks=486494
[   92.635714] hfs: sbi->s_vhdr = ffff88013703a690, sbi->s_backup_vhdr
= ffff88013703e268
[   92.730543] =============================================================================
[   92.828425] BUG kmalloc-4096: Invalid object pointer 0xffff88013703a690
...
[   93.213890] =============================================================================
[   93.311834] BUG kmalloc-4096: Invalid object pointer 0xffff88013703e268
...
[   93.868618] hfs: filesystem size too large blksz_shift=14,
total_blocks=486494
[   93.955327] hfs: sbi->s_vhdr = ffff8801343c37d8, sbi->s_backup_vhdr
= ffff8801343c5120
[   94.050133] =============================================================================
[   94.148026] BUG kmalloc-4096: Invalid object pointer 0xffff8801343c37d8
...
[   94.533895] =============================================================================
[   94.631746] BUG kmalloc-4096: Invalid object pointer 0xffff8801343c5120


So these 2 pointers are exactly what causing the trouble.


Pavel


On Sat, Sep 3, 2011 at 2:57 AM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
> --- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:
>
>> On Fri, Sep 2, 2011 at 11:59 PM,
>> Hin-Tak Leung <hintak_leung@yahoo.co.uk>
>> wrote:
>> >> With kernel 3.1.0-rc4 any attempt to connect iPod
>> to USB
>> >> leads to
>> >> kernel oops. I'd say that stacktrace of the oops
>> is pretty
>> >> much random
>> >> and not related to HFS. But I was able to get
>> useful info
>> >> from it when
>> >> I recompiled with CONFIG_SLUB_DEBUG_ON=y. In this
>> case I
>> >> don't get
>> >> oops but the following instead:
>> >
>> > There are a few hfsplus related changes to do
>> protection against invalid data like this, but may be there
>> are more. It would be useful to have the output from your
>> > objdump -l -d hfsplus.ko | grep  -A 1000
>> '<hfsplus_fill_super>'
>> > (the -l gives line numbers against the kernel tree, so
>> would be useful if you run this against the ko there...)
>>
>> Output of this command is in attachment.
>
> That's interesting. You said "hfs: filesystem size too large." always appears twice (with kernel 3.1-rc4) before it oops. And in your 2.6.38.11 kernel, you had "hfs: unable to find HFS+ superblock" twice.
>
> The oops place is the "kfree(sbi->s_backup_vhdr)" in line 529 in fs/hfsplus/super.c:
>
> 527: out_free_vhdr:
> 528:        kfree(sbi->s_vhdr);
> 529:        kfree(sbi->s_backup_vhdr);
>
> It would appear the s_backup_vhdr is somehow garbage but that was not caught in the 3.1-rc4 version of hfsplus_read_wrapper() ; it was caught by the 2.6.38.11 version of hfsplus_read_wrapper(). hfsplus_read_wrapper() was changed in the 2.6.39/3.0 time frame by this:
>
>    commit 52399b171dfaea02b6944cd6feba49b624147126
>    Author: Christoph Hellwig <hch@tuxera.com>
>    Date:   Tue Nov 23 14:37:47 2010 +0100
>
>        hfsplus: use raw bio access for the volume headers
>
> That's code I don't quite understand (I worked on the hfsplus journal code recently, supposedly mentoring for that GSoC project).
>
> If you are happy enough to do a bit of experimenting, can you try putting a
> "if(sbi->s_backup_vhdr)" before line 529?
>
> Also it is curious why it wasn't caught in wrapper.c arond 229 to 236 ending with:
> "if (sbi->s_backup_vhdr->signature != sbi->s_vhdr->signature)"
>
>
> The file system too large comes from line 402 in super.c:
> -----------------------
>        err = generic_check_addressable(sbi->alloc_blksz_shift,
>                                        sbi->total_blocks);
>        if (err) {
>                printk(KERN_ERR "hfs: filesystem size too large.\n");
>                goto out_free_vhdr;
>
> -----------------------
> So it might be interesting to see what is too large... try changing that to:
>
> printk(KERN_ERR "hfs: filesystem size too large blksz_shift=%d, total_blocks=%d\n", sbi->alloc_blksz_shift, sbi->total_blocks);
>
> ?
>
> It is a 42GB image - if it were smaller I would suggest dd'ing that and upload it somewhere to check...
>
>
>
>
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-03 20:52         ` Pavel Ivanov
@ 2011-09-03 23:35           ` Hin-Tak Leung
  -1 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-03 23:35 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-fsdevel, linux-kernel

--- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> Hin-Tak,
> 
> "if(sbi->s_backup_vhdr)" as you suggested didn't help.
> But I made
> another change. I made fs/hfsplus/super.c to look like this
> near the
> line 529:
> 
> out_free_vhdr:
>     printk(KERN_ERR "hfs: sbi->s_vhdr =
> %p, sbi->s_backup_vhdr = %p\n",
> sbi->s_vhdr, sbi->s_backup_vhdr);
>     kfree(sbi->s_vhdr);
>     kfree(sbi->s_backup_vhdr);
> 
> And here's what I see after connecting an iPod:
> 
> [   92.549197] hfs: filesystem size too
> large blksz_shift=14,
> total_blocks=486494
> [   92.635714] hfs: sbi->s_vhdr =
> ffff88013703a690, sbi->s_backup_vhdr
> = ffff88013703e268
> [   92.730543]
> =============================================================================
> [   92.828425] BUG kmalloc-4096: Invalid
> object pointer 0xffff88013703a690
> ...
> [   93.213890]
> =============================================================================
> [   93.311834] BUG kmalloc-4096: Invalid
> object pointer 0xffff88013703e268
> ...
> [   93.868618] hfs: filesystem size too
> large blksz_shift=14,
> total_blocks=486494
> [   93.955327] hfs: sbi->s_vhdr =
> ffff8801343c37d8, sbi->s_backup_vhdr
> = ffff8801343c5120
> [   94.050133]
> =============================================================================
> [   94.148026] BUG kmalloc-4096: Invalid
> object pointer 0xffff8801343c37d8
> ...
> [   94.533895]
> =============================================================================
> [   94.631746] BUG kmalloc-4096: Invalid
> object pointer 0xffff8801343c5120
> 
> 
> So these 2 pointers are exactly what causing the trouble.

This is interesting... so it would appear that hfsplus_read_wrapper() isn't working correctly, but enough of correct information to pass checks. I just re-read your e-mail and your device has a logical block size of 4096 bytes, whereas most of the hfsplus code uses a block size of 512... you will need to look into hfsplus_submit_bio(), which is in the same file wrapper.c. 

It is going to be difficult to do anything without the actual device and 8GB is too large to be send around. Assuming it is mostly music/media and there isn't too much stuff which is too confident/private, can I ask you to send me say, the first few MB of the disk? I guess something like this:

dd if=/dev/sdb  of=diskfile-sdb  ibs=4096 count=512
dd if=/dev/sdb1 of=diskfile-sdb1 ibs=4096 count=512
dd if=/dev/sdb2 of=diskfile-sdb2 ibs=4096 count=512

should copy the first 2MB of the disk itself and the two partitions. I hope that's enough to have a look around. Be really careful with dd though - it could do some serious damage if not carefully used.  

> On Sat, Sep 3, 2011 at 2:57 AM, Hin-Tak Leung <hintak_leung@yahoo.co.uk>
> wrote:
> > --- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com>
> wrote:
> >
> >> On Fri, Sep 2, 2011 at 11:59 PM,
> >> Hin-Tak Leung <hintak_leung@yahoo.co.uk>
> >> wrote:
> >> >> With kernel 3.1.0-rc4 any attempt to
> connect iPod
> >> to USB
> >> >> leads to
> >> >> kernel oops. I'd say that stacktrace of
> the oops
> >> is pretty
> >> >> much random
> >> >> and not related to HFS. But I was able to
> get
> >> useful info
> >> >> from it when
> >> >> I recompiled with CONFIG_SLUB_DEBUG_ON=y.
> In this
> >> case I
> >> >> don't get
> >> >> oops but the following instead:
> >> >
> >> > There are a few hfsplus related changes to
> do
> >> protection against invalid data like this, but may
> be there
> >> are more. It would be useful to have the output
> from your
> >> > objdump -l -d hfsplus.ko | grep  -A 1000
> >> '<hfsplus_fill_super>'
> >> > (the -l gives line numbers against the kernel
> tree, so
> >> would be useful if you run this against the ko
> there...)
> >>
> >> Output of this command is in attachment.
> >
> > That's interesting. You said "hfs: filesystem size too
> large." always appears twice (with kernel 3.1-rc4) before it
> oops. And in your 2.6.38.11 kernel, you had "hfs: unable to
> find HFS+ superblock" twice.
> >
> > The oops place is the "kfree(sbi->s_backup_vhdr)"
> in line 529 in fs/hfsplus/super.c:
> >
> > 527: out_free_vhdr:
> > 528:        kfree(sbi->s_vhdr);
> > 529:        kfree(sbi->s_backup_vhdr);
> >
> > It would appear the s_backup_vhdr is somehow garbage
> but that was not caught in the 3.1-rc4 version of
> hfsplus_read_wrapper() ; it was caught by the 2.6.38.11
> version of hfsplus_read_wrapper(). hfsplus_read_wrapper()
> was changed in the 2.6.39/3.0 time frame by this:
> >
> >    commit 52399b171dfaea02b6944cd6feba49b624147126
> >    Author: Christoph Hellwig <hch@tuxera.com>
> >    Date:   Tue Nov 23 14:37:47 2010 +0100
> >
> >        hfsplus: use raw bio access for the volume
> headers
> >
> > That's code I don't quite understand (I worked on the
> hfsplus journal code recently, supposedly mentoring for that
> GSoC project).
> >
> > If you are happy enough to do a bit of experimenting,
> can you try putting a
> > "if(sbi->s_backup_vhdr)" before line 529?
> >
> > Also it is curious why it wasn't caught in wrapper.c
> arond 229 to 236 ending with:
> > "if (sbi->s_backup_vhdr->signature !=
> sbi->s_vhdr->signature)"
> >
> >
> > The file system too large comes from line 402 in
> super.c:
> > -----------------------
> >        err =
> generic_check_addressable(sbi->alloc_blksz_shift,
> >                                    
>    sbi->total_blocks);
> >        if (err) {
> >                printk(KERN_ERR "hfs:
> filesystem size too large.\n");
> >                goto out_free_vhdr;
> >
> > -----------------------
> > So it might be interesting to see what is too large...
> try changing that to:
> >
> > printk(KERN_ERR "hfs: filesystem size too large
> blksz_shift=%d, total_blocks=%d\n",
> sbi->alloc_blksz_shift, sbi->total_blocks);
> >
> > ?
> >
> > It is a 42GB image - if it were smaller I would
> suggest dd'ing that and upload it somewhere to check...
> >
> >
> >
> >
> 

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-03 23:35           ` Hin-Tak Leung
  0 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-03 23:35 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-fsdevel, linux-kernel

--- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> Hin-Tak,
> 
> "if(sbi->s_backup_vhdr)" as you suggested didn't help.
> But I made
> another change. I made fs/hfsplus/super.c to look like this
> near the
> line 529:
> 
> out_free_vhdr:
>     printk(KERN_ERR "hfs: sbi->s_vhdr =
> %p, sbi->s_backup_vhdr = %p\n",
> sbi->s_vhdr, sbi->s_backup_vhdr);
>     kfree(sbi->s_vhdr);
>     kfree(sbi->s_backup_vhdr);
> 
> And here's what I see after connecting an iPod:
> 
> [   92.549197] hfs: filesystem size too
> large blksz_shift=14,
> total_blocks=486494
> [   92.635714] hfs: sbi->s_vhdr =
> ffff88013703a690, sbi->s_backup_vhdr
> = ffff88013703e268
> [   92.730543]
> =============================================================================
> [   92.828425] BUG kmalloc-4096: Invalid
> object pointer 0xffff88013703a690
> ...
> [   93.213890]
> =============================================================================
> [   93.311834] BUG kmalloc-4096: Invalid
> object pointer 0xffff88013703e268
> ...
> [   93.868618] hfs: filesystem size too
> large blksz_shift=14,
> total_blocks=486494
> [   93.955327] hfs: sbi->s_vhdr =
> ffff8801343c37d8, sbi->s_backup_vhdr
> = ffff8801343c5120
> [   94.050133]
> =============================================================================
> [   94.148026] BUG kmalloc-4096: Invalid
> object pointer 0xffff8801343c37d8
> ...
> [   94.533895]
> =============================================================================
> [   94.631746] BUG kmalloc-4096: Invalid
> object pointer 0xffff8801343c5120
> 
> 
> So these 2 pointers are exactly what causing the trouble.

This is interesting... so it would appear that hfsplus_read_wrapper() isn't working correctly, but enough of correct information to pass checks. I just re-read your e-mail and your device has a logical block size of 4096 bytes, whereas most of the hfsplus code uses a block size of 512... you will need to look into hfsplus_submit_bio(), which is in the same file wrapper.c. 

It is going to be difficult to do anything without the actual device and 8GB is too large to be send around. Assuming it is mostly music/media and there isn't too much stuff which is too confident/private, can I ask you to send me say, the first few MB of the disk? I guess something like this:

dd if=/dev/sdb  of=diskfile-sdb  ibs=4096 count=512
dd if=/dev/sdb1 of=diskfile-sdb1 ibs=4096 count=512
dd if=/dev/sdb2 of=diskfile-sdb2 ibs=4096 count=512

should copy the first 2MB of the disk itself and the two partitions. I hope that's enough to have a look around. Be really careful with dd though - it could do some serious damage if not carefully used.  

> On Sat, Sep 3, 2011 at 2:57 AM, Hin-Tak Leung <hintak_leung@yahoo.co.uk>
> wrote:
> > --- On Sat, 3/9/11, Pavel Ivanov <paivanof@gmail.com>
> wrote:
> >
> >> On Fri, Sep 2, 2011 at 11:59 PM,
> >> Hin-Tak Leung <hintak_leung@yahoo.co.uk>
> >> wrote:
> >> >> With kernel 3.1.0-rc4 any attempt to
> connect iPod
> >> to USB
> >> >> leads to
> >> >> kernel oops. I'd say that stacktrace of
> the oops
> >> is pretty
> >> >> much random
> >> >> and not related to HFS. But I was able to
> get
> >> useful info
> >> >> from it when
> >> >> I recompiled with CONFIG_SLUB_DEBUG_ON=y.
> In this
> >> case I
> >> >> don't get
> >> >> oops but the following instead:
> >> >
> >> > There are a few hfsplus related changes to
> do
> >> protection against invalid data like this, but may
> be there
> >> are more. It would be useful to have the output
> from your
> >> > objdump -l -d hfsplus.ko | grep  -A 1000
> >> '<hfsplus_fill_super>'
> >> > (the -l gives line numbers against the kernel
> tree, so
> >> would be useful if you run this against the ko
> there...)
> >>
> >> Output of this command is in attachment.
> >
> > That's interesting. You said "hfs: filesystem size too
> large." always appears twice (with kernel 3.1-rc4) before it
> oops. And in your 2.6.38.11 kernel, you had "hfs: unable to
> find HFS+ superblock" twice.
> >
> > The oops place is the "kfree(sbi->s_backup_vhdr)"
> in line 529 in fs/hfsplus/super.c:
> >
> > 527: out_free_vhdr:
> > 528:        kfree(sbi->s_vhdr);
> > 529:        kfree(sbi->s_backup_vhdr);
> >
> > It would appear the s_backup_vhdr is somehow garbage
> but that was not caught in the 3.1-rc4 version of
> hfsplus_read_wrapper() ; it was caught by the 2.6.38.11
> version of hfsplus_read_wrapper(). hfsplus_read_wrapper()
> was changed in the 2.6.39/3.0 time frame by this:
> >
> >    commit 52399b171dfaea02b6944cd6feba49b624147126
> >    Author: Christoph Hellwig <hch@tuxera.com>
> >    Date:   Tue Nov 23 14:37:47 2010 +0100
> >
> >        hfsplus: use raw bio access for the volume
> headers
> >
> > That's code I don't quite understand (I worked on the
> hfsplus journal code recently, supposedly mentoring for that
> GSoC project).
> >
> > If you are happy enough to do a bit of experimenting,
> can you try putting a
> > "if(sbi->s_backup_vhdr)" before line 529?
> >
> > Also it is curious why it wasn't caught in wrapper.c
> arond 229 to 236 ending with:
> > "if (sbi->s_backup_vhdr->signature !=
> sbi->s_vhdr->signature)"
> >
> >
> > The file system too large comes from line 402 in
> super.c:
> > -----------------------
> >        err =
> generic_check_addressable(sbi->alloc_blksz_shift,
> >                                    
>    sbi->total_blocks);
> >        if (err) {
> >                printk(KERN_ERR "hfs:
> filesystem size too large.\n");
> >                goto out_free_vhdr;
> >
> > -----------------------
> > So it might be interesting to see what is too large...
> try changing that to:
> >
> > printk(KERN_ERR "hfs: filesystem size too large
> blksz_shift=%d, total_blocks=%d\n",
> sbi->alloc_blksz_shift, sbi->total_blocks);
> >
> > ?
> >
> > It is a 42GB image - if it were smaller I would
> suggest dd'ing that and upload it somewhere to check...
> >
> >
> >
> >
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-03 23:35           ` Hin-Tak Leung
@ 2011-09-03 23:59             ` Pavel Ivanov
  -1 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-03 23:59 UTC (permalink / raw)
  To: Hin-Tak Leung; +Cc: linux-fsdevel, linux-kernel

On Sat, Sep 3, 2011 at 7:35 PM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
>> "if(sbi->s_backup_vhdr)" as you suggested didn't help.
>> But I made
>> another change. I made fs/hfsplus/super.c to look like this
>> near the
>> line 529:
>>
>> out_free_vhdr:
>>     printk(KERN_ERR "hfs: sbi->s_vhdr =
>> %p, sbi->s_backup_vhdr = %p\n",
>> sbi->s_vhdr, sbi->s_backup_vhdr);
>>     kfree(sbi->s_vhdr);
>>     kfree(sbi->s_backup_vhdr);
>>
>> And here's what I see after connecting an iPod:
>>
>> [   92.549197] hfs: filesystem size too
>> large blksz_shift=14,
>> total_blocks=486494
>> [   92.635714] hfs: sbi->s_vhdr =
>> ffff88013703a690, sbi->s_backup_vhdr
>> = ffff88013703e268
>> [   92.730543]
>> =============================================================================
>> [   92.828425] BUG kmalloc-4096: Invalid
>> object pointer 0xffff88013703a690
>> ...
>> [   93.213890]
>> =============================================================================
>> [   93.311834] BUG kmalloc-4096: Invalid
>> object pointer 0xffff88013703e268
>> ...
>> [   93.868618] hfs: filesystem size too
>> large blksz_shift=14,
>> total_blocks=486494
>> [   93.955327] hfs: sbi->s_vhdr =
>> ffff8801343c37d8, sbi->s_backup_vhdr
>> = ffff8801343c5120
>> [   94.050133]
>> =============================================================================
>> [   94.148026] BUG kmalloc-4096: Invalid
>> object pointer 0xffff8801343c37d8
>> ...
>> [   94.533895]
>> =============================================================================
>> [   94.631746] BUG kmalloc-4096: Invalid
>> object pointer 0xffff8801343c5120
>>
>>
>> So these 2 pointers are exactly what causing the trouble.
>
> This is interesting... so it would appear that hfsplus_read_wrapper() isn't working correctly, but enough of correct information to pass checks. I just re-read your e-mail and your device has a logical block size of 4096 bytes, whereas most of the hfsplus code uses a block size of 512... you will need to look into hfsplus_submit_bio(), which is in the same file wrapper.c.

I've looked into the code myself a little and here's what I see.
hfsplus_read_wrapper() calls to hfsplus_submit_bio() twice to fill
sbi->s_vhdr and sbi->s_backup_vhdr. And according to parameters they
are filled with pointers into sbi->s_vhdr_buf and
sbi->s_backup_vhdr_buf respectively. It's done with the following code
at fs/hfsplus/wrapper.c:79:

	if (!(rw & WRITE) && data)
		*data = (u8 *)buf + offset;

So s_vhdr and s_backup_vhdr shouldn't be freed, s_vhdr_buf and
s_backup_vhdr_buf should be freed instead. And indeed changing in
hfsplus_fill_super()

	kfree(sbi->s_vhdr);
	kfree(sbi->s_backup_vhdr);

to

	kfree(sbi->s_vhdr_buf);
	kfree(sbi->s_backup_vhdr_buf);

fixes BUG reports from SLUB.

Now, the problem with "too large" error is trickier. According to this message

>> [   92.549197] hfs: filesystem size too large blksz_shift=14, total_blocks=486494

HFS thinks that my iPod has block size of 16 KiB. But
generic_check_addressable() decides that everything with blocks larger
than PAGE_CACHE_SHIFT (i.e. 4 KiB on my system) cannot be addressable
and thus filesystem cannot be mounted. I guess it wasn't supposed to
be that way. Is hfsplus_read_wrapper() wrong in determining block size
or all iPods where this was tested actually had block size 4 KiB or
less?

> It is going to be difficult to do anything without the actual device and 8GB is too large to be send around. Assuming it is mostly music/media and there isn't too much stuff which is too confident/private, can I ask you to send me say, the first few MB of the disk?

I'll send it in a separate email bypassing lists.


Pavel

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-03 23:59             ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-03 23:59 UTC (permalink / raw)
  To: Hin-Tak Leung; +Cc: linux-fsdevel, linux-kernel

On Sat, Sep 3, 2011 at 7:35 PM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
>> "if(sbi->s_backup_vhdr)" as you suggested didn't help.
>> But I made
>> another change. I made fs/hfsplus/super.c to look like this
>> near the
>> line 529:
>>
>> out_free_vhdr:
>>     printk(KERN_ERR "hfs: sbi->s_vhdr =
>> %p, sbi->s_backup_vhdr = %p\n",
>> sbi->s_vhdr, sbi->s_backup_vhdr);
>>     kfree(sbi->s_vhdr);
>>     kfree(sbi->s_backup_vhdr);
>>
>> And here's what I see after connecting an iPod:
>>
>> [   92.549197] hfs: filesystem size too
>> large blksz_shift=14,
>> total_blocks=486494
>> [   92.635714] hfs: sbi->s_vhdr =
>> ffff88013703a690, sbi->s_backup_vhdr
>> = ffff88013703e268
>> [   92.730543]
>> =============================================================================
>> [   92.828425] BUG kmalloc-4096: Invalid
>> object pointer 0xffff88013703a690
>> ...
>> [   93.213890]
>> =============================================================================
>> [   93.311834] BUG kmalloc-4096: Invalid
>> object pointer 0xffff88013703e268
>> ...
>> [   93.868618] hfs: filesystem size too
>> large blksz_shift=14,
>> total_blocks=486494
>> [   93.955327] hfs: sbi->s_vhdr =
>> ffff8801343c37d8, sbi->s_backup_vhdr
>> = ffff8801343c5120
>> [   94.050133]
>> =============================================================================
>> [   94.148026] BUG kmalloc-4096: Invalid
>> object pointer 0xffff8801343c37d8
>> ...
>> [   94.533895]
>> =============================================================================
>> [   94.631746] BUG kmalloc-4096: Invalid
>> object pointer 0xffff8801343c5120
>>
>>
>> So these 2 pointers are exactly what causing the trouble.
>
> This is interesting... so it would appear that hfsplus_read_wrapper() isn't working correctly, but enough of correct information to pass checks. I just re-read your e-mail and your device has a logical block size of 4096 bytes, whereas most of the hfsplus code uses a block size of 512... you will need to look into hfsplus_submit_bio(), which is in the same file wrapper.c.

I've looked into the code myself a little and here's what I see.
hfsplus_read_wrapper() calls to hfsplus_submit_bio() twice to fill
sbi->s_vhdr and sbi->s_backup_vhdr. And according to parameters they
are filled with pointers into sbi->s_vhdr_buf and
sbi->s_backup_vhdr_buf respectively. It's done with the following code
at fs/hfsplus/wrapper.c:79:

	if (!(rw & WRITE) && data)
		*data = (u8 *)buf + offset;

So s_vhdr and s_backup_vhdr shouldn't be freed, s_vhdr_buf and
s_backup_vhdr_buf should be freed instead. And indeed changing in
hfsplus_fill_super()

	kfree(sbi->s_vhdr);
	kfree(sbi->s_backup_vhdr);

to

	kfree(sbi->s_vhdr_buf);
	kfree(sbi->s_backup_vhdr_buf);

fixes BUG reports from SLUB.

Now, the problem with "too large" error is trickier. According to this message

>> [   92.549197] hfs: filesystem size too large blksz_shift=14, total_blocks=486494

HFS thinks that my iPod has block size of 16 KiB. But
generic_check_addressable() decides that everything with blocks larger
than PAGE_CACHE_SHIFT (i.e. 4 KiB on my system) cannot be addressable
and thus filesystem cannot be mounted. I guess it wasn't supposed to
be that way. Is hfsplus_read_wrapper() wrong in determining block size
or all iPods where this was tested actually had block size 4 KiB or
less?

> It is going to be difficult to do anything without the actual device and 8GB is too large to be send around. Assuming it is mostly music/media and there isn't too much stuff which is too confident/private, can I ask you to send me say, the first few MB of the disk?

I'll send it in a separate email bypassing lists.


Pavel
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-03 23:59             ` Pavel Ivanov
  (?)
@ 2011-09-04  0:37             ` Hin-Tak Leung
  2011-09-06  4:35                 ` Pavel Ivanov
  -1 siblings, 1 reply; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-04  0:37 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-fsdevel, linux-kernel

--- On Sun, 4/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> On Sat, Sep 3, 2011 at 7:35 PM,
> >> So these 2 pointers are exactly what causing the
> trouble.
> >
> > This is interesting... so it would appear that
> hfsplus_read_wrapper() isn't working correctly, but enough
> of correct information to pass checks. I just re-read your
> e-mail and your device has a logical block size of 4096
> bytes, whereas most of the hfsplus code uses a block size of
> 512... you will need to look into hfsplus_submit_bio(),
> which is in the same file wrapper.c.
> 
> I've looked into the code myself a little and here's what I
> see.
> hfsplus_read_wrapper() calls to hfsplus_submit_bio() twice
> to fill
> sbi->s_vhdr and sbi->s_backup_vhdr. And according to
> parameters they
> are filled with pointers into sbi->s_vhdr_buf and
> sbi->s_backup_vhdr_buf respectively. It's done with the
> following code
> at fs/hfsplus/wrapper.c:79:
> 
>     if (!(rw & WRITE) && data)
>         *data = (u8 *)buf +
> offset;
> 
> So s_vhdr and s_backup_vhdr shouldn't be freed, s_vhdr_buf
> and
> s_backup_vhdr_buf should be freed instead. And indeed
> changing in
> hfsplus_fill_super()
> 
>     kfree(sbi->s_vhdr);
>     kfree(sbi->s_backup_vhdr);
> 
> to
> 
>     kfree(sbi->s_vhdr_buf);
>     kfree(sbi->s_backup_vhdr_buf);
> 
> fixes BUG reports from SLUB.

The code around there is a bit too dense, and both of the *_buf are recent introductions (and temp values, I think) as is hfsplus_submit_bio() itself, around the 2.6.39/3.0 time frame. I think the intention is to fill s_vhdr/s_backup_vhdr via mulitple fetches using *_buf as temp buffer.

> Now, the problem with "too large" error is trickier.
> According to this message
> 
> >> [   92.549197] hfs: filesystem size too large
> blksz_shift=14, total_blocks=486494
> 
> HFS thinks that my iPod has block size of 16 KiB. But
> generic_check_addressable() decides that everything with
> blocks larger
> than PAGE_CACHE_SHIFT (i.e. 4 KiB on my system) cannot be
> addressable
> and thus filesystem cannot be mounted. I guess it wasn't
> supposed to
> be that way. Is hfsplus_read_wrapper() wrong in determining
> block size
> or all iPods where this was tested actually had block size
> 4 KiB or
> less?

Your logical sector size is 4k according to dmesg and hfs block size is 512 so that 16KiB is a bit dodgy.

> > It is going to be difficult to do anything without the
> actual device and 8GB is too large to be send around.
> Assuming it is mostly music/media and there isn't too much
> stuff which is too confident/private, can I ask you to send
> me say, the first few MB of the disk?
> 
> I'll send it in a separate email bypassing lists.

Thanks - I got them now. It will take a while to find my way around though...

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-04  0:37             ` Hin-Tak Leung
@ 2011-09-06  4:35                 ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-06  4:35 UTC (permalink / raw)
  To: Hin-Tak Leung
  Cc: linux-fsdevel, linux-kernel, Seth Forshee, Christoph Hellwig

On Sat, Sep 3, 2011 at 8:37 PM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
>> I've looked into the code myself a little and here's what I
>> see.
>> hfsplus_read_wrapper() calls to hfsplus_submit_bio() twice
>> to fill
>> sbi->s_vhdr and sbi->s_backup_vhdr. And according to
>> parameters they
>> are filled with pointers into sbi->s_vhdr_buf and
>> sbi->s_backup_vhdr_buf respectively. It's done with the
>> following code
>> at fs/hfsplus/wrapper.c:79:
>>
>>     if (!(rw & WRITE) && data)
>>         *data = (u8 *)buf +
>> offset;
>>
>> So s_vhdr and s_backup_vhdr shouldn't be freed, s_vhdr_buf
>> and
>> s_backup_vhdr_buf should be freed instead. And indeed
>> changing in
>> hfsplus_fill_super()
>>
>>     kfree(sbi->s_vhdr);
>>     kfree(sbi->s_backup_vhdr);
>>
>> to
>>
>>     kfree(sbi->s_vhdr_buf);
>>     kfree(sbi->s_backup_vhdr_buf);
>>
>> fixes BUG reports from SLUB.
>
> The code around there is a bit too dense, and both of the *_buf are recent introductions (and temp values, I think) as is hfsplus_submit_bio() itself, around the 2.6.39/3.0 time frame. I think the intention is to fill s_vhdr/s_backup_vhdr via mulitple fetches using *_buf as temp buffer.

Well, look at the commit 6596528e. It clearly shows that result of
kmalloc() is no longer assigned to sbi->s_vhdr and sbi->s_backup_vhdr,
but is assigned to sbi->s_vhdr_buf and sbi->s_backup_vhdr_buf. Also
this commit clearly changes hfsplus_put_super() so that it doesn't
free sbi->s_vhdr and sbi->s_backup_vhdr, but frees sbi->s_vhdr_buf and
sbi->s_backup_vhdr_buf instead. I guess Seth just missed
hfsplus_fill_super() in there as it's pretty unusual exit path.

>> Now, the problem with "too large" error is trickier.
>> According to this message
>>
>> >> [   92.549197] hfs: filesystem size too large
>> blksz_shift=14, total_blocks=486494
>>
>> HFS thinks that my iPod has block size of 16 KiB. But
>> generic_check_addressable() decides that everything with
>> blocks larger
>> than PAGE_CACHE_SHIFT (i.e. 4 KiB on my system) cannot be
>> addressable
>> and thus filesystem cannot be mounted. I guess it wasn't
>> supposed to
>> be that way. Is hfsplus_read_wrapper() wrong in determining
>> block size
>> or all iPods where this was tested actually had block size
>> 4 KiB or
>> less?
>
> Your logical sector size is 4k according to dmesg and hfs block size is 512 so that 16KiB is a bit dodgy.

I'm not sure where that "logical sector size" of 4k comes from but
according to the sources 16K is taken directly from iPod via vhdr in
hfsplus_read_wrapper(). And apparently all hfsplus code is designed to
work with blocks larger than PAGE_SIZE. So it's just
generic_check_addressable() that stands in the way. Maybe commit
c6d5f5fa wasn't quite well thought through or tested by Christoph?
Anyway the following patch worked for me and I've got my iPod mounted
and navigateable (although only in read-only mode because it has
journaled filesystem).

diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index c106ca2..5458be4 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -345,6 +345,8 @@ static int hfsplus_fill_super(struct super_block
*sb, void *data, int silent)
 	struct qstr str;
 	struct nls_table *nls = NULL;
 	int err;
+	unsigned check_blksz_bits;
+	u64 check_num_blocks;

 	err = -EINVAL;
 	sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
@@ -399,10 +401,15 @@ static int hfsplus_fill_super(struct super_block
*sb, void *data, int silent)
 	if (!sbi->rsrc_clump_blocks)
 		sbi->rsrc_clump_blocks = 1;

-	err = generic_check_addressable(sbi->alloc_blksz_shift,
-					sbi->total_blocks);
+	check_blksz_bits = sbi->alloc_blksz_shift;
+	check_num_blocks = sbi->total_blocks;
+	if (sbi->fs_shift != 0) {
+		check_num_blocks <<= sbi->fs_shift;
+		check_blksz_bits -= sbi->fs_shift;
+	}
+	err = generic_check_addressable(check_blksz_bits, check_num_blocks);
 	if (err) {
		printk(KERN_ERR "hfs: filesystem size too large.\n");
 		goto out_free_vhdr;


I can format and submit both patches (plus a small cleanup that I felt
is needed to be changed along the way). Tell me what you think.


Pavel

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-06  4:35                 ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-06  4:35 UTC (permalink / raw)
  To: Hin-Tak Leung
  Cc: linux-fsdevel, linux-kernel, Seth Forshee, Christoph Hellwig

On Sat, Sep 3, 2011 at 8:37 PM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
>> I've looked into the code myself a little and here's what I
>> see.
>> hfsplus_read_wrapper() calls to hfsplus_submit_bio() twice
>> to fill
>> sbi->s_vhdr and sbi->s_backup_vhdr. And according to
>> parameters they
>> are filled with pointers into sbi->s_vhdr_buf and
>> sbi->s_backup_vhdr_buf respectively. It's done with the
>> following code
>> at fs/hfsplus/wrapper.c:79:
>>
>>     if (!(rw & WRITE) && data)
>>         *data = (u8 *)buf +
>> offset;
>>
>> So s_vhdr and s_backup_vhdr shouldn't be freed, s_vhdr_buf
>> and
>> s_backup_vhdr_buf should be freed instead. And indeed
>> changing in
>> hfsplus_fill_super()
>>
>>     kfree(sbi->s_vhdr);
>>     kfree(sbi->s_backup_vhdr);
>>
>> to
>>
>>     kfree(sbi->s_vhdr_buf);
>>     kfree(sbi->s_backup_vhdr_buf);
>>
>> fixes BUG reports from SLUB.
>
> The code around there is a bit too dense, and both of the *_buf are recent introductions (and temp values, I think) as is hfsplus_submit_bio() itself, around the 2.6.39/3.0 time frame. I think the intention is to fill s_vhdr/s_backup_vhdr via mulitple fetches using *_buf as temp buffer.

Well, look at the commit 6596528e. It clearly shows that result of
kmalloc() is no longer assigned to sbi->s_vhdr and sbi->s_backup_vhdr,
but is assigned to sbi->s_vhdr_buf and sbi->s_backup_vhdr_buf. Also
this commit clearly changes hfsplus_put_super() so that it doesn't
free sbi->s_vhdr and sbi->s_backup_vhdr, but frees sbi->s_vhdr_buf and
sbi->s_backup_vhdr_buf instead. I guess Seth just missed
hfsplus_fill_super() in there as it's pretty unusual exit path.

>> Now, the problem with "too large" error is trickier.
>> According to this message
>>
>> >> [   92.549197] hfs: filesystem size too large
>> blksz_shift=14, total_blocks=486494
>>
>> HFS thinks that my iPod has block size of 16 KiB. But
>> generic_check_addressable() decides that everything with
>> blocks larger
>> than PAGE_CACHE_SHIFT (i.e. 4 KiB on my system) cannot be
>> addressable
>> and thus filesystem cannot be mounted. I guess it wasn't
>> supposed to
>> be that way. Is hfsplus_read_wrapper() wrong in determining
>> block size
>> or all iPods where this was tested actually had block size
>> 4 KiB or
>> less?
>
> Your logical sector size is 4k according to dmesg and hfs block size is 512 so that 16KiB is a bit dodgy.

I'm not sure where that "logical sector size" of 4k comes from but
according to the sources 16K is taken directly from iPod via vhdr in
hfsplus_read_wrapper(). And apparently all hfsplus code is designed to
work with blocks larger than PAGE_SIZE. So it's just
generic_check_addressable() that stands in the way. Maybe commit
c6d5f5fa wasn't quite well thought through or tested by Christoph?
Anyway the following patch worked for me and I've got my iPod mounted
and navigateable (although only in read-only mode because it has
journaled filesystem).

diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index c106ca2..5458be4 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -345,6 +345,8 @@ static int hfsplus_fill_super(struct super_block
*sb, void *data, int silent)
 	struct qstr str;
 	struct nls_table *nls = NULL;
 	int err;
+	unsigned check_blksz_bits;
+	u64 check_num_blocks;

 	err = -EINVAL;
 	sbi = kzalloc(sizeof(*sbi), GFP_KERNEL);
@@ -399,10 +401,15 @@ static int hfsplus_fill_super(struct super_block
*sb, void *data, int silent)
 	if (!sbi->rsrc_clump_blocks)
 		sbi->rsrc_clump_blocks = 1;

-	err = generic_check_addressable(sbi->alloc_blksz_shift,
-					sbi->total_blocks);
+	check_blksz_bits = sbi->alloc_blksz_shift;
+	check_num_blocks = sbi->total_blocks;
+	if (sbi->fs_shift != 0) {
+		check_num_blocks <<= sbi->fs_shift;
+		check_blksz_bits -= sbi->fs_shift;
+	}
+	err = generic_check_addressable(check_blksz_bits, check_num_blocks);
 	if (err) {
		printk(KERN_ERR "hfs: filesystem size too large.\n");
 		goto out_free_vhdr;


I can format and submit both patches (plus a small cleanup that I felt
is needed to be changed along the way). Tell me what you think.


Pavel
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-06  4:35                 ` Pavel Ivanov
@ 2011-09-06  5:12                   ` Hin-Tak Leung
  -1 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-06  5:12 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-fsdevel, linux-kernel, Seth Forshee, Christoph Hellwig

--- On Tue, 6/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> On Sat, Sep 3, 2011 at 8:37 PM,
> Hin-Tak Leung <hintak_leung@yahoo.co.uk>
> wrote:
> >> I've looked into the code myself a little and
> here's what I
> >> see.
> >> hfsplus_read_wrapper() calls to
> hfsplus_submit_bio() twice
> >> to fill
> >> sbi->s_vhdr and sbi->s_backup_vhdr. And
> according to
> >> parameters they
> >> are filled with pointers into sbi->s_vhdr_buf
> and
> >> sbi->s_backup_vhdr_buf respectively. It's done
> with the
> >> following code
> >> at fs/hfsplus/wrapper.c:79:
> >>
> >>     if (!(rw & WRITE) && data)
> >>         *data = (u8 *)buf +
> >> offset;
> >>
> >> So s_vhdr and s_backup_vhdr shouldn't be freed,
> s_vhdr_buf
> >> and
> >> s_backup_vhdr_buf should be freed instead. And
> indeed
> >> changing in
> >> hfsplus_fill_super()
> >>
> >>     kfree(sbi->s_vhdr);
> >>     kfree(sbi->s_backup_vhdr);
> >>
> >> to
> >>
> >>     kfree(sbi->s_vhdr_buf);
> >>     kfree(sbi->s_backup_vhdr_buf);
> >>
> >> fixes BUG reports from SLUB.
> >
> > The code around there is a bit too dense, and both of
> the *_buf are recent introductions (and temp values, I
> think) as is hfsplus_submit_bio() itself, around the
> 2.6.39/3.0 time frame. I think the intention is to fill
> s_vhdr/s_backup_vhdr via mulitple fetches using *_buf as
> temp buffer.
> 
> Well, look at the commit 6596528e. It clearly shows that
> result of
> kmalloc() is no longer assigned to sbi->s_vhdr and
> sbi->s_backup_vhdr,
> but is assigned to sbi->s_vhdr_buf and
> sbi->s_backup_vhdr_buf. Also
> this commit clearly changes hfsplus_put_super() so that it
> doesn't
> free sbi->s_vhdr and sbi->s_backup_vhdr, but frees
> sbi->s_vhdr_buf and
> sbi->s_backup_vhdr_buf instead. I guess Seth just
> missed
> hfsplus_fill_super() in there as it's pretty unusual exit
> path.

Indeed. But the differing role of the *vhdr and *buf wasn't clear.

> >> Now, the problem with "too large" error is
> trickier.
> >> According to this message
> >>
> >> >> [   92.549197] hfs: filesystem size
> too large
> >> blksz_shift=14, total_blocks=486494
> >>
> >> HFS thinks that my iPod has block size of 16 KiB.
> But
> >> generic_check_addressable() decides that
> everything with
> >> blocks larger
> >> than PAGE_CACHE_SHIFT (i.e. 4 KiB on my system)
> cannot be
> >> addressable
> >> and thus filesystem cannot be mounted. I guess it
> wasn't
> >> supposed to
> >> be that way. Is hfsplus_read_wrapper() wrong in
> determining
> >> block size
> >> or all iPods where this was tested actually had
> block size
> >> 4 KiB or
> >> less?
> >
> > Your logical sector size is 4k according to dmesg and
> hfs block size is 512 so that 16KiB is a bit dodgy.
> 
> I'm not sure where that "logical sector size" of 4k comes
> from but
> according to the sources 16K is taken directly from iPod
> via vhdr in
> hfsplus_read_wrapper(). And apparently all hfsplus code is
> designed to
> work with blocks larger than PAGE_SIZE. So it's just
> generic_check_addressable() that stands in the way. Maybe
> commit
> c6d5f5fa wasn't quite well thought through or tested by
> Christoph?

Yes, the 16k seem correct. The dmesg message is misleading.

> Anyway the following patch worked for me and I've got my
> iPod mounted
> and navigateable (although only in read-only mode because
> it has
> journaled filesystem).

I worked on the netgear journalling patches a bit:
http://htl10.users.sourceforge.net/patchsets/hfsplus_3.0_rfc/patches/
But please *back up your data*, as well as reading my notes before trying them out:
http://www.spinics.net/lists/linux-fsdevel/msg47684.html
http://www.spinics.net/lists/linux-fsdevel/msg47734.html

> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
> index c106ca2..5458be4 100644
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -345,6 +345,8 @@ static int hfsplus_fill_super(struct
> super_block
> *sb, void *data, int silent)
>      struct qstr str;
>      struct nls_table *nls = NULL;
>      int err;
> +    unsigned check_blksz_bits;
> +    u64 check_num_blocks;
> 
>      err = -EINVAL;
>      sbi = kzalloc(sizeof(*sbi),
> GFP_KERNEL);
> @@ -399,10 +401,15 @@ static int hfsplus_fill_super(struct
> super_block
> *sb, void *data, int silent)
>      if (!sbi->rsrc_clump_blocks)
>         
> sbi->rsrc_clump_blocks = 1;
> 
> -    err =
> generic_check_addressable(sbi->alloc_blksz_shift,
> -           
>        
> sbi->total_blocks);
> +    check_blksz_bits =
> sbi->alloc_blksz_shift;
> +    check_num_blocks =
> sbi->total_blocks;
> +    if (sbi->fs_shift != 0) {
> +        check_num_blocks
> <<= sbi->fs_shift;
> +        check_blksz_bits -=
> sbi->fs_shift;
> +    }
> +    err =
> generic_check_addressable(check_blksz_bits,
> check_num_blocks);
>      if (err) {
>         printk(KERN_ERR "hfs:
> filesystem size too large.\n");
>          goto out_free_vhdr;
> 
> 
> I can format and submit both patches (plus a small cleanup
> that I felt
> is needed to be changed along the way). Tell me what you
> think.

This is a bit ugly - what it does is massage the two values taking into account of sbi->fs_shift to pass check_addressable() . I think either check_addressable should be extended, or this be abstracted out say, to check_hfs_addressable() (with __inline__ if desired) to be cleaner.



^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-06  5:12                   ` Hin-Tak Leung
  0 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-06  5:12 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-fsdevel, linux-kernel, Seth Forshee, Christoph Hellwig

--- On Tue, 6/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> On Sat, Sep 3, 2011 at 8:37 PM,
> Hin-Tak Leung <hintak_leung@yahoo.co.uk>
> wrote:
> >> I've looked into the code myself a little and
> here's what I
> >> see.
> >> hfsplus_read_wrapper() calls to
> hfsplus_submit_bio() twice
> >> to fill
> >> sbi->s_vhdr and sbi->s_backup_vhdr. And
> according to
> >> parameters they
> >> are filled with pointers into sbi->s_vhdr_buf
> and
> >> sbi->s_backup_vhdr_buf respectively. It's done
> with the
> >> following code
> >> at fs/hfsplus/wrapper.c:79:
> >>
> >>     if (!(rw & WRITE) && data)
> >>         *data = (u8 *)buf +
> >> offset;
> >>
> >> So s_vhdr and s_backup_vhdr shouldn't be freed,
> s_vhdr_buf
> >> and
> >> s_backup_vhdr_buf should be freed instead. And
> indeed
> >> changing in
> >> hfsplus_fill_super()
> >>
> >>     kfree(sbi->s_vhdr);
> >>     kfree(sbi->s_backup_vhdr);
> >>
> >> to
> >>
> >>     kfree(sbi->s_vhdr_buf);
> >>     kfree(sbi->s_backup_vhdr_buf);
> >>
> >> fixes BUG reports from SLUB.
> >
> > The code around there is a bit too dense, and both of
> the *_buf are recent introductions (and temp values, I
> think) as is hfsplus_submit_bio() itself, around the
> 2.6.39/3.0 time frame. I think the intention is to fill
> s_vhdr/s_backup_vhdr via mulitple fetches using *_buf as
> temp buffer.
> 
> Well, look at the commit 6596528e. It clearly shows that
> result of
> kmalloc() is no longer assigned to sbi->s_vhdr and
> sbi->s_backup_vhdr,
> but is assigned to sbi->s_vhdr_buf and
> sbi->s_backup_vhdr_buf. Also
> this commit clearly changes hfsplus_put_super() so that it
> doesn't
> free sbi->s_vhdr and sbi->s_backup_vhdr, but frees
> sbi->s_vhdr_buf and
> sbi->s_backup_vhdr_buf instead. I guess Seth just
> missed
> hfsplus_fill_super() in there as it's pretty unusual exit
> path.

Indeed. But the differing role of the *vhdr and *buf wasn't clear.

> >> Now, the problem with "too large" error is
> trickier.
> >> According to this message
> >>
> >> >> [   92.549197] hfs: filesystem size
> too large
> >> blksz_shift=14, total_blocks=486494
> >>
> >> HFS thinks that my iPod has block size of 16 KiB.
> But
> >> generic_check_addressable() decides that
> everything with
> >> blocks larger
> >> than PAGE_CACHE_SHIFT (i.e. 4 KiB on my system)
> cannot be
> >> addressable
> >> and thus filesystem cannot be mounted. I guess it
> wasn't
> >> supposed to
> >> be that way. Is hfsplus_read_wrapper() wrong in
> determining
> >> block size
> >> or all iPods where this was tested actually had
> block size
> >> 4 KiB or
> >> less?
> >
> > Your logical sector size is 4k according to dmesg and
> hfs block size is 512 so that 16KiB is a bit dodgy.
> 
> I'm not sure where that "logical sector size" of 4k comes
> from but
> according to the sources 16K is taken directly from iPod
> via vhdr in
> hfsplus_read_wrapper(). And apparently all hfsplus code is
> designed to
> work with blocks larger than PAGE_SIZE. So it's just
> generic_check_addressable() that stands in the way. Maybe
> commit
> c6d5f5fa wasn't quite well thought through or tested by
> Christoph?

Yes, the 16k seem correct. The dmesg message is misleading.

> Anyway the following patch worked for me and I've got my
> iPod mounted
> and navigateable (although only in read-only mode because
> it has
> journaled filesystem).

I worked on the netgear journalling patches a bit:
http://htl10.users.sourceforge.net/patchsets/hfsplus_3.0_rfc/patches/
But please *back up your data*, as well as reading my notes before trying them out:
http://www.spinics.net/lists/linux-fsdevel/msg47684.html
http://www.spinics.net/lists/linux-fsdevel/msg47734.html

> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
> index c106ca2..5458be4 100644
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -345,6 +345,8 @@ static int hfsplus_fill_super(struct
> super_block
> *sb, void *data, int silent)
>      struct qstr str;
>      struct nls_table *nls = NULL;
>      int err;
> +    unsigned check_blksz_bits;
> +    u64 check_num_blocks;
> 
>      err = -EINVAL;
>      sbi = kzalloc(sizeof(*sbi),
> GFP_KERNEL);
> @@ -399,10 +401,15 @@ static int hfsplus_fill_super(struct
> super_block
> *sb, void *data, int silent)
>      if (!sbi->rsrc_clump_blocks)
>         
> sbi->rsrc_clump_blocks = 1;
> 
> -    err =
> generic_check_addressable(sbi->alloc_blksz_shift,
> -           
>        
> sbi->total_blocks);
> +    check_blksz_bits =
> sbi->alloc_blksz_shift;
> +    check_num_blocks =
> sbi->total_blocks;
> +    if (sbi->fs_shift != 0) {
> +        check_num_blocks
> <<= sbi->fs_shift;
> +        check_blksz_bits -=
> sbi->fs_shift;
> +    }
> +    err =
> generic_check_addressable(check_blksz_bits,
> check_num_blocks);
>      if (err) {
>         printk(KERN_ERR "hfs:
> filesystem size too large.\n");
>          goto out_free_vhdr;
> 
> 
> I can format and submit both patches (plus a small cleanup
> that I felt
> is needed to be changed along the way). Tell me what you
> think.

This is a bit ugly - what it does is massage the two values taking into account of sbi->fs_shift to pass check_addressable() . I think either check_addressable should be extended, or this be abstracted out say, to check_hfs_addressable() (with __inline__ if desired) to be cleaner.


--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-06  5:12                   ` Hin-Tak Leung
@ 2011-09-06 15:09                     ` Pavel Ivanov
  -1 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-06 15:09 UTC (permalink / raw)
  To: Hin-Tak Leung
  Cc: linux-fsdevel, linux-kernel, Seth Forshee, Christoph Hellwig

On Tue, Sep 6, 2011 at 1:12 AM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
>> Anyway the following patch worked for me and I've got my
>> iPod mounted
>> and navigateable (although only in read-only mode because
>> it has
>> journaled filesystem).
>
> I worked on the netgear journalling patches a bit:
> http://htl10.users.sourceforge.net/patchsets/hfsplus_3.0_rfc/patches/
> But please *back up your data*, as well as reading my notes before trying them out:
> http://www.spinics.net/lists/linux-fsdevel/msg47684.html
> http://www.spinics.net/lists/linux-fsdevel/msg47734.html

I'd be happy to try them out and to help in testing/fixing/reviewing them.

>> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
>> index c106ca2..5458be4 100644
>> --- a/fs/hfsplus/super.c
>> +++ b/fs/hfsplus/super.c
>> @@ -345,6 +345,8 @@ static int hfsplus_fill_super(struct
>> super_block
>> *sb, void *data, int silent)
>>      struct qstr str;
>>      struct nls_table *nls = NULL;
>>      int err;
>> +    unsigned check_blksz_bits;
>> +    u64 check_num_blocks;
>>
>>      err = -EINVAL;
>>      sbi = kzalloc(sizeof(*sbi),
>> GFP_KERNEL);
>> @@ -399,10 +401,15 @@ static int hfsplus_fill_super(struct
>> super_block
>> *sb, void *data, int silent)
>>      if (!sbi->rsrc_clump_blocks)
>>
>> sbi->rsrc_clump_blocks = 1;
>>
>> -    err =
>> generic_check_addressable(sbi->alloc_blksz_shift,
>> -
>>
>> sbi->total_blocks);
>> +    check_blksz_bits =
>> sbi->alloc_blksz_shift;
>> +    check_num_blocks =
>> sbi->total_blocks;
>> +    if (sbi->fs_shift != 0) {
>> +        check_num_blocks
>> <<= sbi->fs_shift;
>> +        check_blksz_bits -=
>> sbi->fs_shift;
>> +    }
>> +    err =
>> generic_check_addressable(check_blksz_bits,
>> check_num_blocks);
>>      if (err) {
>>         printk(KERN_ERR "hfs:
>> filesystem size too large.\n");
>>          goto out_free_vhdr;
>>
>>
>> I can format and submit both patches (plus a small cleanup
>> that I felt
>> is needed to be changed along the way). Tell me what you
>> think.
>
> This is a bit ugly - what it does is massage the two values taking into account of sbi->fs_shift to pass check_addressable() . I think either check_addressable should be extended, or this be abstracted out say, to check_hfs_addressable() (with __inline__ if desired) to be cleaner.

Agreed. It was more of a quick hack to prove the correctness of such
change direction. I'll think how to do it better.


Thank you,
Pavel

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-06 15:09                     ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-06 15:09 UTC (permalink / raw)
  To: Hin-Tak Leung
  Cc: linux-fsdevel, linux-kernel, Seth Forshee, Christoph Hellwig

On Tue, Sep 6, 2011 at 1:12 AM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
>> Anyway the following patch worked for me and I've got my
>> iPod mounted
>> and navigateable (although only in read-only mode because
>> it has
>> journaled filesystem).
>
> I worked on the netgear journalling patches a bit:
> http://htl10.users.sourceforge.net/patchsets/hfsplus_3.0_rfc/patches/
> But please *back up your data*, as well as reading my notes before trying them out:
> http://www.spinics.net/lists/linux-fsdevel/msg47684.html
> http://www.spinics.net/lists/linux-fsdevel/msg47734.html

I'd be happy to try them out and to help in testing/fixing/reviewing them.

>> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
>> index c106ca2..5458be4 100644
>> --- a/fs/hfsplus/super.c
>> +++ b/fs/hfsplus/super.c
>> @@ -345,6 +345,8 @@ static int hfsplus_fill_super(struct
>> super_block
>> *sb, void *data, int silent)
>>      struct qstr str;
>>      struct nls_table *nls = NULL;
>>      int err;
>> +    unsigned check_blksz_bits;
>> +    u64 check_num_blocks;
>>
>>      err = -EINVAL;
>>      sbi = kzalloc(sizeof(*sbi),
>> GFP_KERNEL);
>> @@ -399,10 +401,15 @@ static int hfsplus_fill_super(struct
>> super_block
>> *sb, void *data, int silent)
>>      if (!sbi->rsrc_clump_blocks)
>>
>> sbi->rsrc_clump_blocks = 1;
>>
>> -    err =
>> generic_check_addressable(sbi->alloc_blksz_shift,
>> -
>>
>> sbi->total_blocks);
>> +    check_blksz_bits =
>> sbi->alloc_blksz_shift;
>> +    check_num_blocks =
>> sbi->total_blocks;
>> +    if (sbi->fs_shift != 0) {
>> +        check_num_blocks
>> <<= sbi->fs_shift;
>> +        check_blksz_bits -=
>> sbi->fs_shift;
>> +    }
>> +    err =
>> generic_check_addressable(check_blksz_bits,
>> check_num_blocks);
>>      if (err) {
>>         printk(KERN_ERR "hfs:
>> filesystem size too large.\n");
>>          goto out_free_vhdr;
>>
>>
>> I can format and submit both patches (plus a small cleanup
>> that I felt
>> is needed to be changed along the way). Tell me what you
>> think.
>
> This is a bit ugly - what it does is massage the two values taking into account of sbi->fs_shift to pass check_addressable() . I think either check_addressable should be extended, or this be abstracted out say, to check_hfs_addressable() (with __inline__ if desired) to be cleaner.

Agreed. It was more of a quick hack to prove the correctness of such
change direction. I'll think how to do it better.


Thank you,
Pavel
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-06  4:35                 ` Pavel Ivanov
@ 2011-09-07 17:59                   ` Seth Forshee
  -1 siblings, 0 replies; 45+ messages in thread
From: Seth Forshee @ 2011-09-07 17:59 UTC (permalink / raw)
  To: Pavel Ivanov
  Cc: Hin-Tak Leung, linux-fsdevel, linux-kernel, Christoph Hellwig

On Tue, Sep 06, 2011 at 12:35:22AM -0400, Pavel Ivanov wrote:
> On Sat, Sep 3, 2011 at 8:37 PM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
> >> I've looked into the code myself a little and here's what I
> >> see.
> >> hfsplus_read_wrapper() calls to hfsplus_submit_bio() twice
> >> to fill
> >> sbi->s_vhdr and sbi->s_backup_vhdr. And according to
> >> parameters they
> >> are filled with pointers into sbi->s_vhdr_buf and
> >> sbi->s_backup_vhdr_buf respectively. It's done with the
> >> following code
> >> at fs/hfsplus/wrapper.c:79:
> >>
> >>     if (!(rw & WRITE) && data)
> >>         *data = (u8 *)buf +
> >> offset;
> >>
> >> So s_vhdr and s_backup_vhdr shouldn't be freed, s_vhdr_buf
> >> and
> >> s_backup_vhdr_buf should be freed instead. And indeed
> >> changing in
> >> hfsplus_fill_super()
> >>
> >>     kfree(sbi->s_vhdr);
> >>     kfree(sbi->s_backup_vhdr);
> >>
> >> to
> >>
> >>     kfree(sbi->s_vhdr_buf);
> >>     kfree(sbi->s_backup_vhdr_buf);
> >>
> >> fixes BUG reports from SLUB.
> >
> > The code around there is a bit too dense, and both of the *_buf are recent introductions (and temp values, I think) as is hfsplus_submit_bio() itself, around the 2.6.39/3.0 time frame. I think the intention is to fill s_vhdr/s_backup_vhdr via mulitple fetches using *_buf as temp buffer.
> 
> Well, look at the commit 6596528e. It clearly shows that result of
> kmalloc() is no longer assigned to sbi->s_vhdr and sbi->s_backup_vhdr,
> but is assigned to sbi->s_vhdr_buf and sbi->s_backup_vhdr_buf. Also
> this commit clearly changes hfsplus_put_super() so that it doesn't
> free sbi->s_vhdr and sbi->s_backup_vhdr, but frees sbi->s_vhdr_buf and
> sbi->s_backup_vhdr_buf instead. I guess Seth just missed
> hfsplus_fill_super() in there as it's pretty unusual exit path.

Yes, that was definitely just an oversight. Has anyone provided a patch
yet? If not I've pasted a patch below. Seems like a fix should be
applied ASAP.


>From d27825b880028e9a45ba640d86c9e8101db0606b Mon Sep 17 00:00:00 2001
From: Seth Forshee <seth.forshee@canonical.com>
Date: Wed, 7 Sep 2011 10:38:35 -0700
Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in hfsplus_fill_super() error path

Commit 6596528 (hfsplus: ensure bio requests are not smaller than
the hardware sectors) changed the pointers used for volume header
allocations but failed to change the pointer freed in the error
path of hfsplus_fill_super(). This patch fixes the problem.

Reported-by: Pavel Ivanov <paivanof@gmail.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
Cc: <stable@kernel.org>
---
 fs/hfsplus/super.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index c106ca2..cadbb8c 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -525,8 +525,8 @@ out_close_cat_tree:
 out_close_ext_tree:
 	hfs_btree_close(sbi->ext_tree);
 out_free_vhdr:
-	kfree(sbi->s_vhdr);
-	kfree(sbi->s_backup_vhdr);
+	kfree(sbi->s_vhdr_buf);
+	kfree(sbi->s_backup_vhdr_buf);
 out_unload_nls:
 	unload_nls(sbi->nls);
 	unload_nls(nls);
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-07 17:59                   ` Seth Forshee
  0 siblings, 0 replies; 45+ messages in thread
From: Seth Forshee @ 2011-09-07 17:59 UTC (permalink / raw)
  To: Pavel Ivanov
  Cc: Hin-Tak Leung, linux-fsdevel, linux-kernel, Christoph Hellwig

On Tue, Sep 06, 2011 at 12:35:22AM -0400, Pavel Ivanov wrote:
> On Sat, Sep 3, 2011 at 8:37 PM, Hin-Tak Leung <hintak_leung@yahoo.co.uk> wrote:
> >> I've looked into the code myself a little and here's what I
> >> see.
> >> hfsplus_read_wrapper() calls to hfsplus_submit_bio() twice
> >> to fill
> >> sbi->s_vhdr and sbi->s_backup_vhdr. And according to
> >> parameters they
> >> are filled with pointers into sbi->s_vhdr_buf and
> >> sbi->s_backup_vhdr_buf respectively. It's done with the
> >> following code
> >> at fs/hfsplus/wrapper.c:79:
> >>
> >>     if (!(rw & WRITE) && data)
> >>         *data = (u8 *)buf +
> >> offset;
> >>
> >> So s_vhdr and s_backup_vhdr shouldn't be freed, s_vhdr_buf
> >> and
> >> s_backup_vhdr_buf should be freed instead. And indeed
> >> changing in
> >> hfsplus_fill_super()
> >>
> >>     kfree(sbi->s_vhdr);
> >>     kfree(sbi->s_backup_vhdr);
> >>
> >> to
> >>
> >>     kfree(sbi->s_vhdr_buf);
> >>     kfree(sbi->s_backup_vhdr_buf);
> >>
> >> fixes BUG reports from SLUB.
> >
> > The code around there is a bit too dense, and both of the *_buf are recent introductions (and temp values, I think) as is hfsplus_submit_bio() itself, around the 2.6.39/3.0 time frame. I think the intention is to fill s_vhdr/s_backup_vhdr via mulitple fetches using *_buf as temp buffer.
> 
> Well, look at the commit 6596528e. It clearly shows that result of
> kmalloc() is no longer assigned to sbi->s_vhdr and sbi->s_backup_vhdr,
> but is assigned to sbi->s_vhdr_buf and sbi->s_backup_vhdr_buf. Also
> this commit clearly changes hfsplus_put_super() so that it doesn't
> free sbi->s_vhdr and sbi->s_backup_vhdr, but frees sbi->s_vhdr_buf and
> sbi->s_backup_vhdr_buf instead. I guess Seth just missed
> hfsplus_fill_super() in there as it's pretty unusual exit path.

Yes, that was definitely just an oversight. Has anyone provided a patch
yet? If not I've pasted a patch below. Seems like a fix should be
applied ASAP.


From d27825b880028e9a45ba640d86c9e8101db0606b Mon Sep 17 00:00:00 2001
From: Seth Forshee <seth.forshee@canonical.com>
Date: Wed, 7 Sep 2011 10:38:35 -0700
Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in hfsplus_fill_super() error path

Commit 6596528 (hfsplus: ensure bio requests are not smaller than
the hardware sectors) changed the pointers used for volume header
allocations but failed to change the pointer freed in the error
path of hfsplus_fill_super(). This patch fixes the problem.

Reported-by: Pavel Ivanov <paivanof@gmail.com>
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
Cc: <stable@kernel.org>
---
 fs/hfsplus/super.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index c106ca2..cadbb8c 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -525,8 +525,8 @@ out_close_cat_tree:
 out_close_ext_tree:
 	hfs_btree_close(sbi->ext_tree);
 out_free_vhdr:
-	kfree(sbi->s_vhdr);
-	kfree(sbi->s_backup_vhdr);
+	kfree(sbi->s_vhdr_buf);
+	kfree(sbi->s_backup_vhdr_buf);
 out_unload_nls:
 	unload_nls(sbi->nls);
 	unload_nls(nls);
-- 
1.7.4.1

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-07 17:59                   ` Seth Forshee
@ 2011-09-08  3:13                     ` Hin-Tak Leung
  -1 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-08  3:13 UTC (permalink / raw)
  To: Pavel Ivanov, Seth Forshee; +Cc: linux-fsdevel, linux-kernel, Christoph Hellwig

--- On Wed, 7/9/11, Seth Forshee <seth.forshee@canonical.com> wrote:

> Yes, that was definitely just an oversight. Has anyone
> provided a patch
> yet? If not I've pasted a patch below. Seems like a fix
> should be
> applied ASAP.
> 
> 
> From d27825b880028e9a45ba640d86c9e8101db0606b Mon Sep 17
> 00:00:00 2001
> From: Seth Forshee <seth.forshee@canonical.com>
> Date: Wed, 7 Sep 2011 10:38:35 -0700
> Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in
> hfsplus_fill_super() error path
> 
> Commit 6596528 (hfsplus: ensure bio requests are not
> smaller than
> the hardware sectors) changed the pointers used for volume
> header
> allocations but failed to change the pointer freed in the
> error
> path of hfsplus_fill_super(). This patch fixes the
> problem.
> 
> Reported-by: Pavel Ivanov <paivanof@gmail.com>
> Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
> Cc: <stable@kernel.org>

Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>

Please go ahead and submit the patch.

> ---
>  fs/hfsplus/super.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
> index c106ca2..cadbb8c 100644
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -525,8 +525,8 @@ out_close_cat_tree:
>  out_close_ext_tree:
>      hfs_btree_close(sbi->ext_tree);
>  out_free_vhdr:
> -    kfree(sbi->s_vhdr);
> -    kfree(sbi->s_backup_vhdr);
> +    kfree(sbi->s_vhdr_buf);
> +    kfree(sbi->s_backup_vhdr_buf);
>  out_unload_nls:
>      unload_nls(sbi->nls);
>      unload_nls(nls);
> -- 
> 1.7.4.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-08  3:13                     ` Hin-Tak Leung
  0 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-08  3:13 UTC (permalink / raw)
  To: Pavel Ivanov, Seth Forshee; +Cc: linux-fsdevel, linux-kernel, Christoph Hellwig

--- On Wed, 7/9/11, Seth Forshee <seth.forshee@canonical.com> wrote:

> Yes, that was definitely just an oversight. Has anyone
> provided a patch
> yet? If not I've pasted a patch below. Seems like a fix
> should be
> applied ASAP.
> 
> 
> From d27825b880028e9a45ba640d86c9e8101db0606b Mon Sep 17
> 00:00:00 2001
> From: Seth Forshee <seth.forshee@canonical.com>
> Date: Wed, 7 Sep 2011 10:38:35 -0700
> Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in
> hfsplus_fill_super() error path
> 
> Commit 6596528 (hfsplus: ensure bio requests are not
> smaller than
> the hardware sectors) changed the pointers used for volume
> header
> allocations but failed to change the pointer freed in the
> error
> path of hfsplus_fill_super(). This patch fixes the
> problem.
> 
> Reported-by: Pavel Ivanov <paivanof@gmail.com>
> Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
> Cc: <stable@kernel.org>

Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>

Please go ahead and submit the patch.

> ---
>  fs/hfsplus/super.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
> index c106ca2..cadbb8c 100644
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -525,8 +525,8 @@ out_close_cat_tree:
>  out_close_ext_tree:
>      hfs_btree_close(sbi->ext_tree);
>  out_free_vhdr:
> -    kfree(sbi->s_vhdr);
> -    kfree(sbi->s_backup_vhdr);
> +    kfree(sbi->s_vhdr_buf);
> +    kfree(sbi->s_backup_vhdr_buf);
>  out_unload_nls:
>      unload_nls(sbi->nls);
>      unload_nls(nls);
> -- 
> 1.7.4.1
> 
> --
> To unsubscribe from this list: send the line "unsubscribe
> linux-fsdevel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-08  3:13                     ` Hin-Tak Leung
  (?)
@ 2011-09-08 16:23                     ` Seth Forshee
  2011-09-09 12:48                       ` Christoph Hellwig
  2011-09-11  3:32                         ` Pavel Ivanov
  -1 siblings, 2 replies; 45+ messages in thread
From: Seth Forshee @ 2011-09-08 16:23 UTC (permalink / raw)
  To: Hin-Tak Leung, Christoph Hellwig
  Cc: Pavel Ivanov, linux-fsdevel, linux-kernel

On Thu, Sep 08, 2011 at 04:13:01AM +0100, Hin-Tak Leung wrote:
> --- On Wed, 7/9/11, Seth Forshee <seth.forshee@canonical.com> wrote:
> 
> > Yes, that was definitely just an oversight. Has anyone
> > provided a patch
> > yet? If not I've pasted a patch below. Seems like a fix
> > should be
> > applied ASAP.
> > 
> > 
> > From d27825b880028e9a45ba640d86c9e8101db0606b Mon Sep 17
> > 00:00:00 2001
> > From: Seth Forshee <seth.forshee@canonical.com>
> > Date: Wed, 7 Sep 2011 10:38:35 -0700
> > Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in
> > hfsplus_fill_super() error path
> > 
> > Commit 6596528 (hfsplus: ensure bio requests are not
> > smaller than
> > the hardware sectors) changed the pointers used for volume
> > header
> > allocations but failed to change the pointer freed in the
> > error
> > path of hfsplus_fill_super(). This patch fixes the
> > problem.
> > 
> > Reported-by: Pavel Ivanov <paivanof@gmail.com>
> > Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
> > Cc: <stable@kernel.org>
> 
> Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>
> 
> Please go ahead and submit the patch.

That was my patch submission :)

Christoph, does that work for you, or would you like me to send the
patch in a separate email?

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-08 16:23                     ` Seth Forshee
@ 2011-09-09 12:48                       ` Christoph Hellwig
  2011-09-11  3:32                         ` Pavel Ivanov
  1 sibling, 0 replies; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-09 12:48 UTC (permalink / raw)
  To: Hin-Tak Leung, Christoph Hellwig, Pavel Ivanov, linux-fsdevel,
	linux-kernel

On Thu, Sep 08, 2011 at 09:23:04AM -0700, Seth Forshee wrote:
> That was my patch submission :)
> 
> Christoph, does that work for you, or would you like me to send the
> patch in a separate email?

The submission is fine.  I'll try to find a QA setup to test it properly
and will send it on to Linus afterwards.

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-08 16:23                     ` Seth Forshee
@ 2011-09-11  3:32                         ` Pavel Ivanov
  2011-09-11  3:32                         ` Pavel Ivanov
  1 sibling, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-11  3:32 UTC (permalink / raw)
  To: Hin-Tak Leung, Christoph Hellwig, Pavel Ivanov, linux-fsdevel,
	linux-kernel, Seth Forshee

On Thu, Sep 8, 2011 at 12:23 PM, Seth Forshee
<seth.forshee@canonical.com> wrote:
> On Thu, Sep 08, 2011 at 04:13:01AM +0100, Hin-Tak Leung wrote:
>> --- On Wed, 7/9/11, Seth Forshee <seth.forshee@canonical.com> wrote:
>>
>> > Yes, that was definitely just an oversight. Has anyone
>> > provided a patch
>> > yet? If not I've pasted a patch below. Seems like a fix
>> > should be
>> > applied ASAP.
>> >
>> >
>> > From d27825b880028e9a45ba640d86c9e8101db0606b Mon Sep 17
>> > 00:00:00 2001
>> > From: Seth Forshee <seth.forshee@canonical.com>
>> > Date: Wed, 7 Sep 2011 10:38:35 -0700
>> > Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in
>> > hfsplus_fill_super() error path
>> >
>> > Commit 6596528 (hfsplus: ensure bio requests are not
>> > smaller than
>> > the hardware sectors) changed the pointers used for volume
>> > header
>> > allocations but failed to change the pointer freed in the
>> > error
>> > path of hfsplus_fill_super(). This patch fixes the
>> > problem.
>> >
>> > Reported-by: Pavel Ivanov <paivanof@gmail.com>
>> > Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
>> > Cc: <stable@kernel.org>
>>
>> Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>
>>
>> Please go ahead and submit the patch.
>
> That was my patch submission :)
>
> Christoph, does that work for you, or would you like me to send the
> patch in a separate email?

Seth, Christoph,

I've just found another wrong pointers freeing. The following patch
should fix it.



Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in
hfsplus_read_wrapper() error path

Commit 6596528 (hfsplus: ensure bio requests are not smaller than
the hardware sectors) changed the pointers used for volume header
allocations but failed to change the pointer freed in the error
path of hfsplus_read_wrapper(). This patch fixes the problem.

Signed-off-by: Pavel Ivanov <paivanof@gmail.com>
Cc: <stable@kernel.org>
---

diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c
index 10e515a..7daf4b8 100644
--- a/fs/hfsplus/wrapper.c
+++ b/fs/hfsplus/wrapper.c
@@ -272,9 +272,9 @@ reread:
 	return 0;

 out_free_backup_vhdr:
-	kfree(sbi->s_backup_vhdr);
+	kfree(sbi->s_backup_vhdr_buf);
 out_free_vhdr:
-	kfree(sbi->s_vhdr);
+	kfree(sbi->s_vhdr_buf);
 out:
 	return error;
 }
--

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-11  3:32                         ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-11  3:32 UTC (permalink / raw)
  To: Hin-Tak Leung, Christoph Hellwig, Pavel Ivanov, linux-fsdevel,
	linux-kernel

On Thu, Sep 8, 2011 at 12:23 PM, Seth Forshee
<seth.forshee@canonical.com> wrote:
> On Thu, Sep 08, 2011 at 04:13:01AM +0100, Hin-Tak Leung wrote:
>> --- On Wed, 7/9/11, Seth Forshee <seth.forshee@canonical.com> wrote:
>>
>> > Yes, that was definitely just an oversight. Has anyone
>> > provided a patch
>> > yet? If not I've pasted a patch below. Seems like a fix
>> > should be
>> > applied ASAP.
>> >
>> >
>> > From d27825b880028e9a45ba640d86c9e8101db0606b Mon Sep 17
>> > 00:00:00 2001
>> > From: Seth Forshee <seth.forshee@canonical.com>
>> > Date: Wed, 7 Sep 2011 10:38:35 -0700
>> > Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in
>> > hfsplus_fill_super() error path
>> >
>> > Commit 6596528 (hfsplus: ensure bio requests are not
>> > smaller than
>> > the hardware sectors) changed the pointers used for volume
>> > header
>> > allocations but failed to change the pointer freed in the
>> > error
>> > path of hfsplus_fill_super(). This patch fixes the
>> > problem.
>> >
>> > Reported-by: Pavel Ivanov <paivanof@gmail.com>
>> > Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
>> > Cc: <stable@kernel.org>
>>
>> Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>
>>
>> Please go ahead and submit the patch.
>
> That was my patch submission :)
>
> Christoph, does that work for you, or would you like me to send the
> patch in a separate email?

Seth, Christoph,

I've just found another wrong pointers freeing. The following patch
should fix it.



Subject: [PATCH] hfsplus: Fix kfree of wrong pointers in
hfsplus_read_wrapper() error path

Commit 6596528 (hfsplus: ensure bio requests are not smaller than
the hardware sectors) changed the pointers used for volume header
allocations but failed to change the pointer freed in the error
path of hfsplus_read_wrapper(). This patch fixes the problem.

Signed-off-by: Pavel Ivanov <paivanof@gmail.com>
Cc: <stable@kernel.org>
---

diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c
index 10e515a..7daf4b8 100644
--- a/fs/hfsplus/wrapper.c
+++ b/fs/hfsplus/wrapper.c
@@ -272,9 +272,9 @@ reread:
 	return 0;

 out_free_backup_vhdr:
-	kfree(sbi->s_backup_vhdr);
+	kfree(sbi->s_backup_vhdr_buf);
 out_free_vhdr:
-	kfree(sbi->s_vhdr);
+	kfree(sbi->s_vhdr_buf);
 out:
 	return error;
 }
--

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-06 15:09                     ` Pavel Ivanov
@ 2011-09-11  3:52                       ` Pavel Ivanov
  -1 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-11  3:52 UTC (permalink / raw)
  To: Hin-Tak Leung; +Cc: linux-fsdevel, linux-kernel, Christoph Hellwig

On Tue, Sep 6, 2011 at 11:09 AM, Pavel Ivanov <paivanof@gmail.com> wrote:
>>> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
>>> index c106ca2..5458be4 100644
>>> --- a/fs/hfsplus/super.c
>>> +++ b/fs/hfsplus/super.c
>>> @@ -345,6 +345,8 @@ static int hfsplus_fill_super(struct
>>> super_block
>>> *sb, void *data, int silent)
>>>      struct qstr str;
>>>      struct nls_table *nls = NULL;
>>>      int err;
>>> +    unsigned check_blksz_bits;
>>> +    u64 check_num_blocks;
>>>
>>>      err = -EINVAL;
>>>      sbi = kzalloc(sizeof(*sbi),
>>> GFP_KERNEL);
>>> @@ -399,10 +401,15 @@ static int hfsplus_fill_super(struct
>>> super_block
>>> *sb, void *data, int silent)
>>>      if (!sbi->rsrc_clump_blocks)
>>>
>>> sbi->rsrc_clump_blocks = 1;
>>>
>>> -    err =
>>> generic_check_addressable(sbi->alloc_blksz_shift,
>>> -
>>>
>>> sbi->total_blocks);
>>> +    check_blksz_bits =
>>> sbi->alloc_blksz_shift;
>>> +    check_num_blocks =
>>> sbi->total_blocks;
>>> +    if (sbi->fs_shift != 0) {
>>> +        check_num_blocks
>>> <<= sbi->fs_shift;
>>> +        check_blksz_bits -=
>>> sbi->fs_shift;
>>> +    }
>>> +    err =
>>> generic_check_addressable(check_blksz_bits,
>>> check_num_blocks);
>>>      if (err) {
>>>         printk(KERN_ERR "hfs:
>>> filesystem size too large.\n");
>>>          goto out_free_vhdr;
>>
>> This is a bit ugly - what it does is massage the two values taking into account of sbi->fs_shift to pass check_addressable() . I think either check_addressable should be extended, or this be abstracted out say, to check_hfs_addressable() (with __inline__ if desired) to be cleaner.
>
> Agreed. It was more of a quick hack to prove the correctness of such
> change direction. I'll think how to do it better.

Hin-Tak,

How about the following patch?


Subject: [PATCH] hfsplus: Allow to mount filesystem with block size
greater than PAGE_SIZE

Commit c6d5f5fa (hfsplus: lift the 2TB size limit) added call to
generic_check_addressable() but used the system's internal block size
which can be larger than PAGE_SIZE and will cause
generic_check_addressable() to return -EINVAL in this case. This
results in impossibility to mount file systems with such block sizes.
To fix it we have to use block size understandable by
generic_check_addressable() and adjust number of blocks accordingly.

Signed-off-by: Pavel Ivanov <paivanof@gmail.com>
Cc: <stable@kernel.org>
---

diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index c106ca2..26ac5a5 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -399,8 +399,17 @@ static int hfsplus_fill_super(struct super_block
*sb, void *data, int silent)
 	if (!sbi->rsrc_clump_blocks)
 		sbi->rsrc_clump_blocks = 1;

-	err = generic_check_addressable(sbi->alloc_blksz_shift,
-					sbi->total_blocks);
+	/*
+	 * Check that filesystem data can be addressed by sector_t. Obvious way
+	 * to do that is to call generic_check_addressable with alloc_blksz_shift
+	 * and total_blocks as parameters. But alloc_blksz_shift can be greater
+	 * than PAGE_SIZE_SHIFT and in this case it won't be accepted by
+	 * generic_check_addressable. s_blocksize_bits will always be accepted
+	 * and difference between it and alloc_blksz_shift will be always in
+	 * fs_shift.
+	 */
+	err = generic_check_addressable(sb->s_blocksize_bits,
+			(u64)sbi->total_blocks << sbi->fs_shift);
 	if (err) {
 		printk(KERN_ERR "hfs: filesystem size too large.\n");
 		goto out_free_vhdr;
--

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-11  3:52                       ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-11  3:52 UTC (permalink / raw)
  To: Hin-Tak Leung; +Cc: linux-fsdevel, linux-kernel, Christoph Hellwig

On Tue, Sep 6, 2011 at 11:09 AM, Pavel Ivanov <paivanof@gmail.com> wrote:
>>> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
>>> index c106ca2..5458be4 100644
>>> --- a/fs/hfsplus/super.c
>>> +++ b/fs/hfsplus/super.c
>>> @@ -345,6 +345,8 @@ static int hfsplus_fill_super(struct
>>> super_block
>>> *sb, void *data, int silent)
>>>      struct qstr str;
>>>      struct nls_table *nls = NULL;
>>>      int err;
>>> +    unsigned check_blksz_bits;
>>> +    u64 check_num_blocks;
>>>
>>>      err = -EINVAL;
>>>      sbi = kzalloc(sizeof(*sbi),
>>> GFP_KERNEL);
>>> @@ -399,10 +401,15 @@ static int hfsplus_fill_super(struct
>>> super_block
>>> *sb, void *data, int silent)
>>>      if (!sbi->rsrc_clump_blocks)
>>>
>>> sbi->rsrc_clump_blocks = 1;
>>>
>>> -    err =
>>> generic_check_addressable(sbi->alloc_blksz_shift,
>>> -
>>>
>>> sbi->total_blocks);
>>> +    check_blksz_bits =
>>> sbi->alloc_blksz_shift;
>>> +    check_num_blocks =
>>> sbi->total_blocks;
>>> +    if (sbi->fs_shift != 0) {
>>> +        check_num_blocks
>>> <<= sbi->fs_shift;
>>> +        check_blksz_bits -=
>>> sbi->fs_shift;
>>> +    }
>>> +    err =
>>> generic_check_addressable(check_blksz_bits,
>>> check_num_blocks);
>>>      if (err) {
>>>         printk(KERN_ERR "hfs:
>>> filesystem size too large.\n");
>>>          goto out_free_vhdr;
>>
>> This is a bit ugly - what it does is massage the two values taking into account of sbi->fs_shift to pass check_addressable() . I think either check_addressable should be extended, or this be abstracted out say, to check_hfs_addressable() (with __inline__ if desired) to be cleaner.
>
> Agreed. It was more of a quick hack to prove the correctness of such
> change direction. I'll think how to do it better.

Hin-Tak,

How about the following patch?


Subject: [PATCH] hfsplus: Allow to mount filesystem with block size
greater than PAGE_SIZE

Commit c6d5f5fa (hfsplus: lift the 2TB size limit) added call to
generic_check_addressable() but used the system's internal block size
which can be larger than PAGE_SIZE and will cause
generic_check_addressable() to return -EINVAL in this case. This
results in impossibility to mount file systems with such block sizes.
To fix it we have to use block size understandable by
generic_check_addressable() and adjust number of blocks accordingly.

Signed-off-by: Pavel Ivanov <paivanof@gmail.com>
Cc: <stable@kernel.org>
---

diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index c106ca2..26ac5a5 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -399,8 +399,17 @@ static int hfsplus_fill_super(struct super_block
*sb, void *data, int silent)
 	if (!sbi->rsrc_clump_blocks)
 		sbi->rsrc_clump_blocks = 1;

-	err = generic_check_addressable(sbi->alloc_blksz_shift,
-					sbi->total_blocks);
+	/*
+	 * Check that filesystem data can be addressed by sector_t. Obvious way
+	 * to do that is to call generic_check_addressable with alloc_blksz_shift
+	 * and total_blocks as parameters. But alloc_blksz_shift can be greater
+	 * than PAGE_SIZE_SHIFT and in this case it won't be accepted by
+	 * generic_check_addressable. s_blocksize_bits will always be accepted
+	 * and difference between it and alloc_blksz_shift will be always in
+	 * fs_shift.
+	 */
+	err = generic_check_addressable(sb->s_blocksize_bits,
+			(u64)sbi->total_blocks << sbi->fs_shift);
 	if (err) {
 		printk(KERN_ERR "hfs: filesystem size too large.\n");
 		goto out_free_vhdr;
--
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-11  3:52                       ` Pavel Ivanov
@ 2011-09-11 13:46                         ` Hin-Tak Leung
  -1 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-11 13:46 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-fsdevel, linux-kernel, Christoph Hellwig

--- On Sun, 11/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> How about the following patch?
> 
> 
> Subject: [PATCH] hfsplus: Allow to mount filesystem with
> block size
> greater than PAGE_SIZE
> 
> Commit c6d5f5fa (hfsplus: lift the 2TB size limit) added
> call to
> generic_check_addressable() but used the system's internal
> block size
> which can be larger than PAGE_SIZE and will cause
> generic_check_addressable() to return -EINVAL in this case.
> This
> results in impossibility to mount file systems with such
> block sizes.
> To fix it we have to use block size understandable by
> generic_check_addressable() and adjust number of blocks
> accordingly.
> 
> Signed-off-by: Pavel Ivanov <paivanof@gmail.com>
> Cc: <stable@kernel.org>
> ---
> 
> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
> index c106ca2..26ac5a5 100644
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -399,8 +399,17 @@ static int hfsplus_fill_super(struct
> super_block
> *sb, void *data, int silent)
>      if (!sbi->rsrc_clump_blocks)
>         
> sbi->rsrc_clump_blocks = 1;
> 
> -    err =
> generic_check_addressable(sbi->alloc_blksz_shift,
> -           
>        
> sbi->total_blocks);
> +    /*
> +     * Check that filesystem data
> can be addressed by sector_t. Obvious way
> +     * to do that is to call
> generic_check_addressable with alloc_blksz_shift
> +     * and total_blocks as
> parameters. But alloc_blksz_shift can be greater
> +     * than PAGE_SIZE_SHIFT and
> in this case it won't be accepted by
> +     * generic_check_addressable.
> s_blocksize_bits will always be accepted
> +     * and difference between it
> and alloc_blksz_shift will be always in
> +     * fs_shift.
> +     */
> +    err =
> generic_check_addressable(sb->s_blocksize_bits,
> +           
> (u64)sbi->total_blocks << sbi->fs_shift);
>      if (err) {
>          printk(KERN_ERR
> "hfs: filesystem size too large.\n");
>          goto out_free_vhdr;

Why is the u64 needed? If it is needed, it probably means sbi->total_blocks should have been u64 in the first place.


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-11 13:46                         ` Hin-Tak Leung
  0 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-11 13:46 UTC (permalink / raw)
  To: Pavel Ivanov; +Cc: linux-fsdevel, linux-kernel, Christoph Hellwig

--- On Sun, 11/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> How about the following patch?
> 
> 
> Subject: [PATCH] hfsplus: Allow to mount filesystem with
> block size
> greater than PAGE_SIZE
> 
> Commit c6d5f5fa (hfsplus: lift the 2TB size limit) added
> call to
> generic_check_addressable() but used the system's internal
> block size
> which can be larger than PAGE_SIZE and will cause
> generic_check_addressable() to return -EINVAL in this case.
> This
> results in impossibility to mount file systems with such
> block sizes.
> To fix it we have to use block size understandable by
> generic_check_addressable() and adjust number of blocks
> accordingly.
> 
> Signed-off-by: Pavel Ivanov <paivanof@gmail.com>
> Cc: <stable@kernel.org>
> ---
> 
> diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
> index c106ca2..26ac5a5 100644
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -399,8 +399,17 @@ static int hfsplus_fill_super(struct
> super_block
> *sb, void *data, int silent)
>      if (!sbi->rsrc_clump_blocks)
>         
> sbi->rsrc_clump_blocks = 1;
> 
> -    err =
> generic_check_addressable(sbi->alloc_blksz_shift,
> -           
>        
> sbi->total_blocks);
> +    /*
> +     * Check that filesystem data
> can be addressed by sector_t. Obvious way
> +     * to do that is to call
> generic_check_addressable with alloc_blksz_shift
> +     * and total_blocks as
> parameters. But alloc_blksz_shift can be greater
> +     * than PAGE_SIZE_SHIFT and
> in this case it won't be accepted by
> +     * generic_check_addressable.
> s_blocksize_bits will always be accepted
> +     * and difference between it
> and alloc_blksz_shift will be always in
> +     * fs_shift.
> +     */
> +    err =
> generic_check_addressable(sb->s_blocksize_bits,
> +           
> (u64)sbi->total_blocks << sbi->fs_shift);
>      if (err) {
>          printk(KERN_ERR
> "hfs: filesystem size too large.\n");
>          goto out_free_vhdr;

Why is the u64 needed? If it is needed, it probably means sbi->total_blocks should have been u64 in the first place.

--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-11  3:32                         ` Pavel Ivanov
  (?)
@ 2011-09-11 14:10                         ` Christoph Hellwig
  2011-09-12 14:00                           ` Pavel Ivanov
  -1 siblings, 1 reply; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-11 14:10 UTC (permalink / raw)
  To: Pavel Ivanov
  Cc: Hin-Tak Leung, Christoph Hellwig, linux-fsdevel, linux-kernel,
	Seth Forshee

On Sat, Sep 10, 2011 at 11:32:15PM -0400, Pavel Ivanov wrote:
> Seth, Christoph,
> 
> I've just found another wrong pointers freeing. The following patch
> should fix it.

I'd like to throw this into Seths previous patch, while adding an
ACK for your finding.  Is that fine with you?


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-11  3:52                       ` Pavel Ivanov
  (?)
  (?)
@ 2011-09-11 14:12                       ` Christoph Hellwig
  -1 siblings, 0 replies; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-11 14:12 UTC (permalink / raw)
  To: Pavel Ivanov
  Cc: Hin-Tak Leung, linux-fsdevel, linux-kernel, Christoph Hellwig

On Sat, Sep 10, 2011 at 11:52:55PM -0400, Pavel Ivanov wrote:
> > Agreed. It was more of a quick hack to prove the correctness of such
> > change direction. I'll think how to do it better.
> 
> Hin-Tak,
> 
> How about the following patch?
> 
> 
> Subject: [PATCH] hfsplus: Allow to mount filesystem with block size
> greater than PAGE_SIZE
> 
> Commit c6d5f5fa (hfsplus: lift the 2TB size limit) added call to
> generic_check_addressable() but used the system's internal block size
> which can be larger than PAGE_SIZE and will cause
> generic_check_addressable() to return -EINVAL in this case. This
> results in impossibility to mount file systems with such block sizes.
> To fix it we have to use block size understandable by
> generic_check_addressable() and adjust number of blocks accordingly.

Given that a large part of the checks are related to the actual
block size I think that we're better off just opencoding it.


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-11 13:46                         ` Hin-Tak Leung
  (?)
@ 2011-09-11 14:14                         ` Christoph Hellwig
  -1 siblings, 0 replies; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-11 14:14 UTC (permalink / raw)
  To: Hin-Tak Leung
  Cc: Pavel Ivanov, linux-fsdevel, linux-kernel, Christoph Hellwig

On Sun, Sep 11, 2011 at 02:46:08PM +0100, Hin-Tak Leung wrote:
> > +?????* and difference between it
> > and alloc_blksz_shift will be always in
> > +?????* fs_shift.
> > +?????*/
> > +??? err =
> > generic_check_addressable(sb->s_blocksize_bits,
> > +??? ??? ???
> > (u64)sbi->total_blocks << sbi->fs_shift);
> >  ??? if (err) {
> >  ??? ??? printk(KERN_ERR
> > "hfs: filesystem size too large.\n");
> >  ??? ??? goto out_free_vhdr;
> 
> Why is the u64 needed? If it is needed, it probably means sbi->total_blocks should have been u64 in the first place.

No.  When you shift values to the left they obviously become larger.
The total_blocks count on disk 32-bit so there is no need to store
it in a larger variable in the in-core superblock.

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-11 14:10                         ` Christoph Hellwig
@ 2011-09-12 14:00                           ` Pavel Ivanov
  2011-09-12 15:27                             ` [PATCH] hfsplus: Fix kfree of wrong vhdr pointers Seth Forshee
  0 siblings, 1 reply; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-12 14:00 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Hin-Tak Leung, Christoph Hellwig, linux-fsdevel, linux-kernel,
	Seth Forshee

On Sun, Sep 11, 2011 at 10:10 AM, Christoph Hellwig <hch@infradead.org> wrote:
> On Sat, Sep 10, 2011 at 11:32:15PM -0400, Pavel Ivanov wrote:
>> Seth, Christoph,
>>
>> I've just found another wrong pointers freeing. The following patch
>> should fix it.
>
> I'd like to throw this into Seths previous patch, while adding an
> ACK for your finding.  Is that fine with you?

Yes, that's fine with me.


Pavel

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-11  3:52                       ` Pavel Ivanov
                                         ` (2 preceding siblings ...)
  (?)
@ 2011-09-12 14:34                       ` Christoph Hellwig
  2011-09-12 15:19                           ` Pavel Ivanov
  -1 siblings, 1 reply; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-12 14:34 UTC (permalink / raw)
  To: Pavel Ivanov
  Cc: Hin-Tak Leung, linux-fsdevel, linux-kernel, Christoph Hellwig

Does this patch fix your issues with large block sizes?


Index: linux-2.6/fs/hfsplus/super.c
===================================================================
--- linux-2.6.orig/fs/hfsplus/super.c	2011-09-12 09:56:58.619988416 -0400
+++ linux-2.6/fs/hfsplus/super.c	2011-09-12 10:07:18.006651395 -0400
@@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct sup
 	struct inode *root, *inode;
 	struct qstr str;
 	struct nls_table *nls = NULL;
+	u64 last_fs_block, last_fs_page;
 	int err;
 
 	err = -EINVAL;
@@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct sup
 	if (!sbi->rsrc_clump_blocks)
 		sbi->rsrc_clump_blocks = 1;
 
-	err = generic_check_addressable(sbi->alloc_blksz_shift,
-					sbi->total_blocks);
-	if (err) {
+	err = -EFBIG;
+	last_fs_block = sbi->total_blocks - 1;
+	last_fs_page = (last_fs_block >> sbi->alloc_blksz_shift) <<
+			PAGE_CACHE_SHIFT;
+
+	if ((last_fs_block > (sector_t)(~0ULL) >> (sbi->alloc_blksz_shift - 9)) ||
+	    (last_fs_page > (pgoff_t)(~0ULL))) {
 		printk(KERN_ERR "hfs: filesystem size too large.\n");
 		goto out_free_vhdr;
 	}

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-12 14:34                       ` Christoph Hellwig
@ 2011-09-12 15:19                           ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-12 15:19 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Hin-Tak Leung, linux-fsdevel, linux-kernel, Christoph Hellwig

On Mon, Sep 12, 2011 at 10:34 AM, Christoph Hellwig <hch@infradead.org> wrote:
> Does this patch fix your issues with large block sizes?

I'll be able to try it in the evening but meanwhile I have some comments below.

>
>
> Index: linux-2.6/fs/hfsplus/super.c
> ===================================================================
> --- linux-2.6.orig/fs/hfsplus/super.c   2011-09-12 09:56:58.619988416 -0400
> +++ linux-2.6/fs/hfsplus/super.c        2011-09-12 10:07:18.006651395 -0400
> @@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct sup
>        struct inode *root, *inode;
>        struct qstr str;
>        struct nls_table *nls = NULL;
> +       u64 last_fs_block, last_fs_page;
>        int err;
>
>        err = -EINVAL;
> @@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct sup
>        if (!sbi->rsrc_clump_blocks)
>                sbi->rsrc_clump_blocks = 1;
>
> -       err = generic_check_addressable(sbi->alloc_blksz_shift,
> -                                       sbi->total_blocks);
> -       if (err) {
> +       err = -EFBIG;
> +       last_fs_block = sbi->total_blocks - 1;
> +       last_fs_page = (last_fs_block >> sbi->alloc_blksz_shift) <<
> +                       PAGE_CACHE_SHIFT;

Did you mix left and right shifts here? Expression doesn't make sense to me.

Also I have a little concern about consistency in using
PAGE_CACHE_SHIFT and PAGE_SHIFT. hfsplus_read_wrapper() limits visible
block size to PAGE_SIZE, not PAGE_CACHE_SIZE. And although now they
are equal comment in linux/pagemap.h clearly says that PAGE_CACHE_SIZE
can be bigger than PAGE_SIZE. Is it something that should be fixed in
hfsplus_read_wrapper() ?

> +
> +       if ((last_fs_block > (sector_t)(~0ULL) >> (sbi->alloc_blksz_shift - 9)) ||

Maybe this 9 should be extracted from here and
generic_check_addressable() into some macro?

> +           (last_fs_page > (pgoff_t)(~0ULL))) {
>                printk(KERN_ERR "hfs: filesystem size too large.\n");
>                goto out_free_vhdr;
>        }
>

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-12 15:19                           ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-12 15:19 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Hin-Tak Leung, linux-fsdevel, linux-kernel, Christoph Hellwig

On Mon, Sep 12, 2011 at 10:34 AM, Christoph Hellwig <hch@infradead.org> wrote:
> Does this patch fix your issues with large block sizes?

I'll be able to try it in the evening but meanwhile I have some comments below.

>
>
> Index: linux-2.6/fs/hfsplus/super.c
> ===================================================================
> --- linux-2.6.orig/fs/hfsplus/super.c   2011-09-12 09:56:58.619988416 -0400
> +++ linux-2.6/fs/hfsplus/super.c        2011-09-12 10:07:18.006651395 -0400
> @@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct sup
>        struct inode *root, *inode;
>        struct qstr str;
>        struct nls_table *nls = NULL;
> +       u64 last_fs_block, last_fs_page;
>        int err;
>
>        err = -EINVAL;
> @@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct sup
>        if (!sbi->rsrc_clump_blocks)
>                sbi->rsrc_clump_blocks = 1;
>
> -       err = generic_check_addressable(sbi->alloc_blksz_shift,
> -                                       sbi->total_blocks);
> -       if (err) {
> +       err = -EFBIG;
> +       last_fs_block = sbi->total_blocks - 1;
> +       last_fs_page = (last_fs_block >> sbi->alloc_blksz_shift) <<
> +                       PAGE_CACHE_SHIFT;

Did you mix left and right shifts here? Expression doesn't make sense to me.

Also I have a little concern about consistency in using
PAGE_CACHE_SHIFT and PAGE_SHIFT. hfsplus_read_wrapper() limits visible
block size to PAGE_SIZE, not PAGE_CACHE_SIZE. And although now they
are equal comment in linux/pagemap.h clearly says that PAGE_CACHE_SIZE
can be bigger than PAGE_SIZE. Is it something that should be fixed in
hfsplus_read_wrapper() ?

> +
> +       if ((last_fs_block > (sector_t)(~0ULL) >> (sbi->alloc_blksz_shift - 9)) ||

Maybe this 9 should be extracted from here and
generic_check_addressable() into some macro?

> +           (last_fs_page > (pgoff_t)(~0ULL))) {
>                printk(KERN_ERR "hfs: filesystem size too large.\n");
>                goto out_free_vhdr;
>        }
>
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* [PATCH] hfsplus: Fix kfree of wrong vhdr pointers
  2011-09-12 14:00                           ` Pavel Ivanov
@ 2011-09-12 15:27                             ` Seth Forshee
  2011-09-12 15:28                               ` Christoph Hellwig
  0 siblings, 1 reply; 45+ messages in thread
From: Seth Forshee @ 2011-09-12 15:27 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: linux-fsdevel, linux-kernel, Pavel Ivanov, Hin-Tak Leung

Commit 6596528 (hfsplus: ensure bio requests are not smaller than
the hardware sectors) changed the pointers used for volume header
allocations, but a couple of spots are still freeing the old
pointers. This patch fixes the problem.

Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
Acked-by: Pavel Ivanov <paivanof@gmail.com>
Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>
Cc: <stable@kernel.org>
---
 fs/hfsplus/super.c   |    4 ++--
 fs/hfsplus/wrapper.c |    4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/fs/hfsplus/super.c b/fs/hfsplus/super.c
index c106ca2..cadbb8c 100644
--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -525,8 +525,8 @@ out_close_cat_tree:
 out_close_ext_tree:
 	hfs_btree_close(sbi->ext_tree);
 out_free_vhdr:
-	kfree(sbi->s_vhdr);
-	kfree(sbi->s_backup_vhdr);
+	kfree(sbi->s_vhdr_buf);
+	kfree(sbi->s_backup_vhdr_buf);
 out_unload_nls:
 	unload_nls(sbi->nls);
 	unload_nls(nls);
diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c
index 10e515a..7daf4b8 100644
--- a/fs/hfsplus/wrapper.c
+++ b/fs/hfsplus/wrapper.c
@@ -272,9 +272,9 @@ reread:
 	return 0;
 
 out_free_backup_vhdr:
-	kfree(sbi->s_backup_vhdr);
+	kfree(sbi->s_backup_vhdr_buf);
 out_free_vhdr:
-	kfree(sbi->s_vhdr);
+	kfree(sbi->s_vhdr_buf);
 out:
 	return error;
 }
-- 
1.7.4.1


^ permalink raw reply related	[flat|nested] 45+ messages in thread

* Re: [PATCH] hfsplus: Fix kfree of wrong vhdr pointers
  2011-09-12 15:27                             ` [PATCH] hfsplus: Fix kfree of wrong vhdr pointers Seth Forshee
@ 2011-09-12 15:28                               ` Christoph Hellwig
  0 siblings, 0 replies; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-12 15:28 UTC (permalink / raw)
  To: Seth Forshee
  Cc: Christoph Hellwig, linux-fsdevel, linux-kernel, Pavel Ivanov,
	Hin-Tak Leung

On Mon, Sep 12, 2011 at 10:27:07AM -0500, Seth Forshee wrote:
> Commit 6596528 (hfsplus: ensure bio requests are not smaller than
> the hardware sectors) changed the pointers used for volume header
> allocations, but a couple of spots are still freeing the old
> pointers. This patch fixes the problem.

I've already respun the patch to include your Pavel's additional
fixes.  Just waiting to sort out the size checking issue, and then
I will send both things on to Linus.


^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-12 15:19                           ` Pavel Ivanov
  (?)
@ 2011-09-12 15:31                           ` Christoph Hellwig
  2011-09-13  2:20                               ` Pavel Ivanov
  -1 siblings, 1 reply; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-12 15:31 UTC (permalink / raw)
  To: Pavel Ivanov
  Cc: Christoph Hellwig, Hin-Tak Leung, linux-fsdevel, linux-kernel,
	Christoph Hellwig

Yes, the shifts were the wrong way around.  I'll leave the 9 in for now,
we use it in so many places and if we're going to clean it up I'd do it
in ne go.

Index: linux-2.6/fs/hfsplus/super.c
===================================================================
--- linux-2.6.orig/fs/hfsplus/super.c	2011-09-12 11:20:33.866598100 -0400
+++ linux-2.6/fs/hfsplus/super.c	2011-09-12 11:20:52.538098052 -0400
@@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct sup
 	struct inode *root, *inode;
 	struct qstr str;
 	struct nls_table *nls = NULL;
+	u64 last_fs_block, last_fs_page;
 	int err;
 
 	err = -EINVAL;
@@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct sup
 	if (!sbi->rsrc_clump_blocks)
 		sbi->rsrc_clump_blocks = 1;
 
-	err = generic_check_addressable(sbi->alloc_blksz_shift,
-					sbi->total_blocks);
-	if (err) {
+	err = -EFBIG;
+	last_fs_block = sbi->total_blocks - 1;
+	last_fs_page = (last_fs_block << sbi->alloc_blksz_shift) >>
+			PAGE_CACHE_SHIFT;
+
+	if ((last_fs_block > (sector_t)(~0ULL) >> (sbi->alloc_blksz_shift - 9)) ||
+	    (last_fs_page > (pgoff_t)(~0ULL))) {
 		printk(KERN_ERR "hfs: filesystem size too large.\n");
 		goto out_free_vhdr;
 	}

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-12 15:19                           ` Pavel Ivanov
  (?)
  (?)
@ 2011-09-12 15:57                           ` Hin-Tak Leung
  -1 siblings, 0 replies; 45+ messages in thread
From: Hin-Tak Leung @ 2011-09-12 15:57 UTC (permalink / raw)
  To: Christoph Hellwig, Pavel Ivanov
  Cc: linux-fsdevel, linux-kernel, Christoph Hellwig

--- On Mon, 12/9/11, Pavel Ivanov <paivanof@gmail.com> wrote:

> On Mon, Sep 12, 2011 at 10:34 AM,
> Christoph Hellwig <hch@infradead.org>
> wrote:
> > Does this patch fix your issues with large block
> sizes?
> 
> I'll be able to try it in the evening but meanwhile I have
> some comments below.
> 
> >
> >
> > Index: linux-2.6/fs/hfsplus/super.c
> >
> ===================================================================
> > --- linux-2.6.orig/fs/hfsplus/super.c   2011-09-12
> 09:56:58.619988416 -0400
> > +++ linux-2.6/fs/hfsplus/super.c        2011-09-12
> 10:07:18.006651395 -0400
> > @@ -344,6 +344,7 @@ static int
> hfsplus_fill_super(struct sup
> >        struct inode *root, *inode;
> >        struct qstr str;
> >        struct nls_table *nls = NULL;
> > +       u64 last_fs_block, last_fs_page;
> >        int err;
> >
> >        err = -EINVAL;
> > @@ -399,9 +400,13 @@ static int
> hfsplus_fill_super(struct sup
> >        if (!sbi->rsrc_clump_blocks)
> >                sbi->rsrc_clump_blocks = 1;
> >
> > -       err =
> generic_check_addressable(sbi->alloc_blksz_shift,
> > -                                  
>     sbi->total_blocks);
> > -       if (err) {
> > +       err = -EFBIG;
> > +       last_fs_block = sbi->total_blocks - 1;
> > +       last_fs_page = (last_fs_block >>
> sbi->alloc_blksz_shift) <<
> > +                       PAGE_CACHE_SHIFT;
> 
> Did you mix left and right shifts here? Expression doesn't
> make sense to me.
> 
> Also I have a little concern about consistency in using
> PAGE_CACHE_SHIFT and PAGE_SHIFT. hfsplus_read_wrapper()
> limits visible
> block size to PAGE_SIZE, not PAGE_CACHE_SIZE. And although
> now they
> are equal comment in linux/pagemap.h clearly says that
> PAGE_CACHE_SIZE
> can be bigger than PAGE_SIZE. Is it something that should
> be fixed in
> hfsplus_read_wrapper() ?
> 
> > +
> > +       if ((last_fs_block > (sector_t)(~0ULL)
> >> (sbi->alloc_blksz_shift - 9)) ||
> 
> Maybe this 9 should be extracted from here and
> generic_check_addressable() into some macro?
> 
> > +           (last_fs_page > (pgoff_t)(~0ULL)))
> {
> >                printk(KERN_ERR "hfs:
> filesystem size too large.\n");
> >                goto out_free_vhdr;
> >        }
> >

I 2nd that this is kind of ugly. The literal "9". How about abstracting this logic out to say, hfs_check_addressable()?

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-12 15:31                           ` Christoph Hellwig
@ 2011-09-13  2:20                               ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-13  2:20 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Hin-Tak Leung, linux-fsdevel, linux-kernel, Christoph Hellwig

On Mon, Sep 12, 2011 at 11:31 AM, Christoph Hellwig <hch@infradead.org> wrote:
> Yes, the shifts were the wrong way around.  I'll leave the 9 in for now,
> we use it in so many places and if we're going to clean it up I'd do it
> in ne go.
>
> Index: linux-2.6/fs/hfsplus/super.c
> ===================================================================
> --- linux-2.6.orig/fs/hfsplus/super.c   2011-09-12 11:20:33.866598100 -0400
> +++ linux-2.6/fs/hfsplus/super.c        2011-09-12 11:20:52.538098052 -0400
> @@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct sup
>        struct inode *root, *inode;
>        struct qstr str;
>        struct nls_table *nls = NULL;
> +       u64 last_fs_block, last_fs_page;
>        int err;
>
>        err = -EINVAL;
> @@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct sup
>        if (!sbi->rsrc_clump_blocks)
>                sbi->rsrc_clump_blocks = 1;
>
> -       err = generic_check_addressable(sbi->alloc_blksz_shift,
> -                                       sbi->total_blocks);
> -       if (err) {
> +       err = -EFBIG;
> +       last_fs_block = sbi->total_blocks - 1;
> +       last_fs_page = (last_fs_block << sbi->alloc_blksz_shift) >>
> +                       PAGE_CACHE_SHIFT;
> +
> +       if ((last_fs_block > (sector_t)(~0ULL) >> (sbi->alloc_blksz_shift - 9)) ||
> +           (last_fs_page > (pgoff_t)(~0ULL))) {
>                printk(KERN_ERR "hfs: filesystem size too large.\n");
>                goto out_free_vhdr;
>        }
>

Christoph,

This patch works for me.

And could you comment on my PAGE_SIZE question?

>> Also I have a little concern about consistency in using
>> PAGE_CACHE_SHIFT and PAGE_SHIFT. hfsplus_read_wrapper() limits visible
>> block size to PAGE_SIZE, not PAGE_CACHE_SIZE. And although now they
>> are equal comment in linux/pagemap.h clearly says that PAGE_CACHE_SIZE
>> can be bigger than PAGE_SIZE. Is it something that should be fixed in
>> hfsplus_read_wrapper() ?

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
@ 2011-09-13  2:20                               ` Pavel Ivanov
  0 siblings, 0 replies; 45+ messages in thread
From: Pavel Ivanov @ 2011-09-13  2:20 UTC (permalink / raw)
  To: Christoph Hellwig
  Cc: Hin-Tak Leung, linux-fsdevel, linux-kernel, Christoph Hellwig

On Mon, Sep 12, 2011 at 11:31 AM, Christoph Hellwig <hch@infradead.org> wrote:
> Yes, the shifts were the wrong way around.  I'll leave the 9 in for now,
> we use it in so many places and if we're going to clean it up I'd do it
> in ne go.
>
> Index: linux-2.6/fs/hfsplus/super.c
> ===================================================================
> --- linux-2.6.orig/fs/hfsplus/super.c   2011-09-12 11:20:33.866598100 -0400
> +++ linux-2.6/fs/hfsplus/super.c        2011-09-12 11:20:52.538098052 -0400
> @@ -344,6 +344,7 @@ static int hfsplus_fill_super(struct sup
>        struct inode *root, *inode;
>        struct qstr str;
>        struct nls_table *nls = NULL;
> +       u64 last_fs_block, last_fs_page;
>        int err;
>
>        err = -EINVAL;
> @@ -399,9 +400,13 @@ static int hfsplus_fill_super(struct sup
>        if (!sbi->rsrc_clump_blocks)
>                sbi->rsrc_clump_blocks = 1;
>
> -       err = generic_check_addressable(sbi->alloc_blksz_shift,
> -                                       sbi->total_blocks);
> -       if (err) {
> +       err = -EFBIG;
> +       last_fs_block = sbi->total_blocks - 1;
> +       last_fs_page = (last_fs_block << sbi->alloc_blksz_shift) >>
> +                       PAGE_CACHE_SHIFT;
> +
> +       if ((last_fs_block > (sector_t)(~0ULL) >> (sbi->alloc_blksz_shift - 9)) ||
> +           (last_fs_page > (pgoff_t)(~0ULL))) {
>                printk(KERN_ERR "hfs: filesystem size too large.\n");
>                goto out_free_vhdr;
>        }
>

Christoph,

This patch works for me.

And could you comment on my PAGE_SIZE question?

>> Also I have a little concern about consistency in using
>> PAGE_CACHE_SHIFT and PAGE_SHIFT. hfsplus_read_wrapper() limits visible
>> block size to PAGE_SIZE, not PAGE_CACHE_SIZE. And although now they
>> are equal comment in linux/pagemap.h clearly says that PAGE_CACHE_SIZE
>> can be bigger than PAGE_SIZE. Is it something that should be fixed in
>> hfsplus_read_wrapper() ?
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-13  2:20                               ` Pavel Ivanov
  (?)
@ 2011-09-14 17:42                               ` Christoph Hellwig
  2011-09-15 14:35                                 ` Christoph Hellwig
  -1 siblings, 1 reply; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-14 17:42 UTC (permalink / raw)
  To: Pavel Ivanov
  Cc: Christoph Hellwig, Hin-Tak Leung, linux-fsdevel, linux-kernel,
	Christoph Hellwig

On Mon, Sep 12, 2011 at 10:20:01PM -0400, Pavel Ivanov wrote:
> This patch works for me.
> 
> And could you comment on my PAGE_SIZE question?
> 
> >> Also I have a little concern about consistency in using
> >> PAGE_CACHE_SHIFT and PAGE_SHIFT. hfsplus_read_wrapper() limits visible
> >> block size to PAGE_SIZE, not PAGE_CACHE_SIZE. And although now they
> >> are equal comment in linux/pagemap.h clearly says that PAGE_CACHE_SIZE
> >> can be bigger than PAGE_SIZE. Is it something that should be fixed in
> >> hfsplus_read_wrapper() ?

The two are and always have been the same.  There were plans to allow
for a larger PAGE_CACHE_SIZE long time ago, but it never happened.

I'll switch everything to PAGE_SIZE in the patch for consistency.

^ permalink raw reply	[flat|nested] 45+ messages in thread

* Re: Kernel 3.1.0-rc4 oops when connecting iPod
  2011-09-14 17:42                               ` Christoph Hellwig
@ 2011-09-15 14:35                                 ` Christoph Hellwig
  0 siblings, 0 replies; 45+ messages in thread
From: Christoph Hellwig @ 2011-09-15 14:35 UTC (permalink / raw)
  To: Pavel Ivanov
  Cc: Christoph Hellwig, Hin-Tak Leung, linux-fsdevel, linux-kernel,
	Christoph Hellwig

On Wed, Sep 14, 2011 at 01:42:50PM -0400, Christoph Hellwig wrote:
> I'll switch everything to PAGE_SIZE in the patch for consistency.

I'll take that back.  hfsplus is mostly using PAGE_CACHE_SIZE and
friends, so I'll fix the few uses of plain PAGE_SIZE instead.  But
that's 3.2 material.


^ permalink raw reply	[flat|nested] 45+ messages in thread

end of thread, other threads:[~2011-09-15 14:35 UTC | newest]

Thread overview: 45+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-09-03  3:08 Kernel 3.1.0-rc4 oops when connecting iPod Pavel Ivanov
2011-09-03  3:59 ` Hin-Tak Leung
2011-09-03  3:59   ` Hin-Tak Leung
2011-09-03  4:37   ` Pavel Ivanov
2011-09-03  6:57     ` Hin-Tak Leung
2011-09-03 20:52       ` Pavel Ivanov
2011-09-03 20:52         ` Pavel Ivanov
2011-09-03 23:35         ` Hin-Tak Leung
2011-09-03 23:35           ` Hin-Tak Leung
2011-09-03 23:59           ` Pavel Ivanov
2011-09-03 23:59             ` Pavel Ivanov
2011-09-04  0:37             ` Hin-Tak Leung
2011-09-06  4:35               ` Pavel Ivanov
2011-09-06  4:35                 ` Pavel Ivanov
2011-09-06  5:12                 ` Hin-Tak Leung
2011-09-06  5:12                   ` Hin-Tak Leung
2011-09-06 15:09                   ` Pavel Ivanov
2011-09-06 15:09                     ` Pavel Ivanov
2011-09-11  3:52                     ` Pavel Ivanov
2011-09-11  3:52                       ` Pavel Ivanov
2011-09-11 13:46                       ` Hin-Tak Leung
2011-09-11 13:46                         ` Hin-Tak Leung
2011-09-11 14:14                         ` Christoph Hellwig
2011-09-11 14:12                       ` Christoph Hellwig
2011-09-12 14:34                       ` Christoph Hellwig
2011-09-12 15:19                         ` Pavel Ivanov
2011-09-12 15:19                           ` Pavel Ivanov
2011-09-12 15:31                           ` Christoph Hellwig
2011-09-13  2:20                             ` Pavel Ivanov
2011-09-13  2:20                               ` Pavel Ivanov
2011-09-14 17:42                               ` Christoph Hellwig
2011-09-15 14:35                                 ` Christoph Hellwig
2011-09-12 15:57                           ` Hin-Tak Leung
2011-09-07 17:59                 ` Seth Forshee
2011-09-07 17:59                   ` Seth Forshee
2011-09-08  3:13                   ` Hin-Tak Leung
2011-09-08  3:13                     ` Hin-Tak Leung
2011-09-08 16:23                     ` Seth Forshee
2011-09-09 12:48                       ` Christoph Hellwig
2011-09-11  3:32                       ` Pavel Ivanov
2011-09-11  3:32                         ` Pavel Ivanov
2011-09-11 14:10                         ` Christoph Hellwig
2011-09-12 14:00                           ` Pavel Ivanov
2011-09-12 15:27                             ` [PATCH] hfsplus: Fix kfree of wrong vhdr pointers Seth Forshee
2011-09-12 15:28                               ` Christoph Hellwig

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.