Fixdisk repeatedly unable to find partition 1

It also doesn't tell you the end sectors, which you need to know to recreate the partitions properly.
You might think it is just one less than the start of the next partition, but on all my disks, it is two less.
Then you've got the end of the last partition problem as there's obviously no next one to crib from, but I guess setting it to the max. isn't going to cause too much fuss.
A better way might be to get the size of partition 2 from its superblock
That would seem sensible.
 
A bad sector that got repaired. If you read the logs provided by the OP...
Good point - I didn't look at the logs.
Now that I have I suspect it was caused by fix-disk!
Eg at the end of the first log - it writes to LBA0 due to the errors it found on the drive.
It looks like it corrupted LBA0 (ie the MBR) at the end of its fixes for the bad data/blocks.
I am taking a guess at this from the info from the first log - it didn't find anything wrong with LBA0 to start with, the first block in error was 608 and the rest were very much later.
From the first log the drive initially had 3 partitions, then ended with zero partitions! These were the re-writes (from the log)
Code:
re-writing sector 608: succeeded
re-writing sector 1931746576: succeeded
re-writing sector 3040836344: succeeded
re-writing sector 3040836352: succeeded
re-writing sector 3043331864: succeeded
re-writing sector 3043331872: succeeded
re-writing sector 3048438960: succeeded
re-writing sector 3048600576: succeeded
re-writing sector 3048600936: succeeded
re-writing sector 3048600944: succeeded
re-writing sector 3048600952: succeeded
re-writing sector 3048600960: succeeded
re-writing sector 3048601752: succeeded
re-writing sector 3048601760: succeeded
re-writing sector 3048601768: succeeded
re-writing sector 3048950432: succeeded
re-writing sector 3048952920: succeeded
re-writing sector 3048952944: succeeded
re-writing sector 3048952952: succeeded
re-writing sector 3048952976: succeeded
re-writing sector 3048953000: succeeded
re-writing sector 3048953008: succeeded
re-writing sector 3067092232: succeeded
re-writing sector 3067092240: succeeded
re-writing sector 0: succeeded
Using info from https://wiki.hummy.tv/wiki/2TB_Disk_Installation_Blog suggest there was a single corruption in first partition and multiple corruptions in second partition. But given that all corruptions were within their respective partition boundaries - why was it necessary to write a new LBA0 / MBR ?
As I say, this is just a guess - I may have missed something important. If so - apologies!
 
Last edited:
Another couple of problems with fix-disk are:
  • It only searches from LBA 2 to 32 for partition 1, which seems ridiculously small. Some tools won't let you use less than 63 for start of P1.
  • It gives up if it can't find partition 1 and doesn't even try 2 and 3. It would seem sensible to carry on and fix what it can, then if it has found 2 but not either of the others, it can recreate it/them either side of 2.
 
Last edited:
But given that all corruptions were within their respective partition boundaries - why was it necessary to write a new LBA0 / MBR ?
Because the SMART says it's duff, enough though it might appear not to be. That was troubling me too.
It would seem sensible for fix-disk to attempt to backup LBA 0 before it attempts to re-write it though, rather than after it.

I guess we might also need the OP to produce the output of smartctl -a /dev/sda to see what the state of the disk is.
 
Because the SMART says it's duff, enough though it might appear not to be. That was troubling me too.
It would seem sensible for fix-disk to attempt to backup LBA 0 before it attempts to re-write it though, rather than after it.

I guess we might also need the OP to produce the output of smartctl -a /dev/sda to see what the state of the disk is.
I think you'll find SMART is fine with the drive on the first run, because the MBR was there to begin with. It failed at the beginning of the 2nd run because fix-disk corrupted the MBR at end of first run. (A bit ironic - a script called fix-disk corrupting the drive.)
This probably on occurs on a small number of users, otherwise there'll be more users suffering from this.
 
Last edited:
I don't think that is accurate.
It is accurate. Why do you think otherwise? Here is the code: 1) start=$(locate_part 2 32) ;;
You can read it for yourself in /bin/fix-disk if you don't believe me.
P1 on my GPT AF drive start at something like 2048 and fix-disk copes with it ok. I.e. it does the fschk on the partitions fine.
Nobody, apart from you, is talking about GPT in this thread. You're just confusing the issue. Partitions on GPT are done completely differently from those in MBR and the MBR is just a fixed, protective thing to stop other stuff moaning.
I think you'll find SMART is fine with the drive on the first run, because the MBR was there to begin with.
Have you actually read the first log file? The bit where it actually says its repairing LBA 0 at the end?
It failed at the beginning of the 2nd run
No, it didn't. It just reported the same thing as at the end of the first run, because all the other things in the first run had been fixed.
because fix-disk corrupted the MBR at end of first run. (A bit ironic - a script called fix-disk corrupting the drive.)
That I will probably agree with.
 
It is accurate. Why do you think otherwise? Here is the code: 1) start=$(locate_part 2 32) ;;
You can read it for yourself in /bin/fix-disk if you don't believe me.
Sorry my bad - I made a mistake and took it off that post - but not before you read it.
Nobody, apart from you, is talking about GPT in this thread. You're just confusing the issue. Partitions on GPT are done completely differently from those in MBR and the MBR is just a fixed, protective thing to stop other stuff moaning.
Fair enough - I'll not go on about GPT because it'll confuse the issue and not relevant in this case.
Have you actually read the first log file? The bit where it actually says its repairing LBA 0 at the end?
Yes - that bit confuses me.
When the first fix-disk script ran - it found the partitions at the beginning - therefore there must have been a MBR.
So why did it find an error later on after all processing - at LBA 0? It does not make sense especially when you consider that before that last bit - all LBA reports were in numerical order. Ie why was LBA 0 in error all of a sudden?
The other reason why is doesn't make any sense is that it was not necessary to update LBA 0 / MBR. The fixes it applied were all within partition boundaries. It did not need to adjust partition boundaries. There is nothing else on the MBR it needed to update.
I suspect it highlighted an error LBA 0 by mistake and it went downhill from there.
My skills on script reading are limited so haven't followed it through thoroughly.
 
Last edited:
If we take a closer look at parts of the first log - humax_fixdisk_run_1.txt
Code:
.....
Please select option: fixdisk
Any additional options (-h for list or press return for none): -d -y
Are you sure you wish to run the hard disk checker (-d -y)? [Y/N] y
Running /bin/fix-disk
PART: [3 1 2]
FSCKOPTS: []

Checking disk sda (4096 byte sectors)

Partition /dev/sda1 is already unmounted
Partition /dev/sda2 is already unmounted
Partition /dev/sda3 is already unmounted


Running short disk self test
Error at LBA 608

/dev/sda:
re-writing sector 608: succeeded
This is an advanced-format disk.
Also checking blocks 608 - 615 (8 blocks)
.
. continues until
.
Running select disk self test
Error at LBA 0

/dev/sda:
re-writing sector 0: succeeded
This is an advanced-format disk.
Also checking blocks 0 - 7 (8 blocks)
    Block 0          - OK
    Block 1          - OK
    Block 2          - OK
    Block 3          - OK
    Block 4          - OK
    Block 5          - OK
    Block 6          - OK
    Block 7          - OK

Running select disk self test

Checking partition tables...

MBR Status: not present
GPT Status: not present

Partition table is missing/corrupt. If the disk has not been formatted by
the Humax, recovery by fix-disk may not be successful.

Searching for partitions...

Unable to find partition 1, exiting...
fix-disk: session terminated with exit status 1

Press return to continue:
In summary LBA 0 / MBR was fine, fix-disk does it's stuff including
short disk self test (2 times)
long disk self test (1 time)
select disk self test (24 times)

Where it found - Error at LBA 0 one the penultimate "select disk self test"
I find that odd/suspicious/too much of a coincidence.
MBR was fine before fix-disk.
It was fine during first 3 set of block updates and SMART tests (2 short and 1 long)
It performs its various sets of block updates and select SMART tests 22/23 times.
Then if finds an issue with LBA 0 / MBR.

So I guess it could be
  • there was nothing wrong with LBA 0 / MBR and it was reported in error, fix-disk overwrote with corrupt data (eg blank strings/assignments) or
  • something else odd that fix-disk didn't anticipate or
  • the block updates it applied also performs some write action to LBA 0 / MBR in tandem and wore out the LBA 0 / MBR
Also I've run fix-disk many times without issue so there may be a specific combination that causes this error.
 
Last edited:
If the OP was to post the output from smartctl -l selftest /dev/sda, it should show whether an error was detected at LBA 0.
 
Hi, OP here. Thanks all for the detailed discussion. I'd just hopped on here to have a go at editing the script, and hadn't expected so many new messages!

I'm going to give that smartctl command a try. I'm not sure how long to expect it to take, but I'll post the output back here either later this evening or tomorrow.
 
I'm going to give that smartctl command a try. I'm not sure how long to expect it to take, but I'll post the output back here either later this evening or tomorrow.

Ok that was a lot quicker than I expected... :)

Code:
humax# smartctl -l selftest /dev/sda
smartctl 6.4 2015-06-04 r4109 [7405b0-smp-linux-2.6.18-7.1] (local build)
Copyright (C) 2002-15, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%     11881         -
# 2  Short offline       Completed: read failure       90%     11881         0
# 3  Selective offline   Completed without error       00%     11881         -
# 4  Selective offline   Completed: read failure       90%     11877         0
# 5  Selective offline   Completed: read failure       90%     11876         3067092240
# 6  Selective offline   Completed: read failure       90%     11876         3067092232
# 7  Selective offline   Completed: read failure       90%     11876         3048953008
# 8  Selective offline   Completed: read failure       90%     11876         3048953000
# 9  Selective offline   Completed: read failure       90%     11876         3048952976
#10  Selective offline   Completed: read failure       90%     11876         3048952952
#11  Selective offline   Completed: read failure       90%     11876         3048952944
#12  Selective offline   Completed: read failure       90%     11875         3048952920
#13  Selective offline   Completed: read failure       90%     11875         3048950432
#14  Selective offline   Completed: read failure       90%     11875         3048601768
#15  Selective offline   Completed: read failure       90%     11875         3048601760
#16  Selective offline   Completed: read failure       90%     11875         3048601752
#17  Selective offline   Completed: read failure       90%     11875         3048600960
#18  Selective offline   Completed: read failure       90%     11875         3048600952
#19  Selective offline   Completed: read failure       90%     11875         3048600944
#20  Selective offline   Completed: read failure       90%     11875         3048600936
#21  Selective offline   Completed: read failure       90%     11875         3048600576
 
I'm sorely tempted to say there's a bug in the drive firmware mis-reporting the SMART status of LBA 0.
Then everything goes downhill from there. And like I said, it's a shame fix-disk doesn't make a backup copy before starting operations, given the criticality.
Anyway, back to the problem. Can the OP provide the outputs requested from posts #16 and the modified script in #26?
 
Anyway, back to the problem. Can the OP provide the outputs requested from posts #16 and the modified script in #26?

I need a bit of assistance. Editing and running the modified scripts via cli is fine. But where/how can I access a safely writable part of the filesystem (to store the modified scripts)?
Also, do you recommend I always be in Maintenance mode for these?
 
If your disk is (effectively) blank it makes no difference about maintenance mode, so no.
Just run the smartctl command and for the diagnostic do something like this:
Code:
cd /tmp
diag -d igorw >igorw
chmod +x igorw
vi igorw
You'll need to patch up the lines mentioned previously, and remove the first line that says "Viewing: igorw" and then you run it: ./igorw
/tmp is in RAM so don't reboot until you've copied down the numbers.
I hope you know how to use vi.
 
Nice one. Yep I'm good with all the rest of that, it was just /tmp being in RAM that was the missing puzzle piece. Thanks!
I'll give this a try again tomorrow.
 
Apologies for the delay, I didn't get a chance to look at this last night.

Here's the output from the modified igorw script from post #16:

Code:
humax# ./igorw 
END CHS 3907024064
Searching for partition 1...
Found partition 1 @ 64
Searching for partition 2...
Found partition 2 @ 2104576
Searching for partition 3...
Found partition 3 @ 3886043176
 
And here's the output from the smartctl -a /dev/sda command from post #26 (sorry I missed this one somehow):

Code:
humax# smartctl -a /dev/sda
smartctl 6.4 2015-06-04 r4109 [7405b0-smp-linux-2.6.18-7.1] (local build)
Copyright (C) 2002-15, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Video 3.5 HDD
Device Model:     ST2000VM003-1CT164
Serial Number:    W1H2W9NT
LU WWN Device Id: 5 000c50 06e6c0799
Firmware Version: SC23
User Capacity:    2,000,398,934,016 bytes [2.00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    5900 rpm
Form Factor:      3.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ATA8-ACS T13/1699-D revision 4
SATA Version is:  SATA 3.0, 6.0 Gb/s (current: 3.0 Gb/s)
Local Time is:    Wed Nov 17 21:15:08 2021 GMT
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
See vendor-specific Attribute list for marginal Attributes.

General SMART Values:
Offline data collection status:  (0x00) Offline data collection activity
                                        was never started.
                                        Auto Offline Data Collection: Disabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever 
                                        been run.
Total time to complete Offline 
data collection:                (  107) seconds.
Offline data collection
capabilities:                    (0x73) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        No Offline surface scan supported.
                                        Self-test supported.
                                        Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine 
recommended polling time:        (   1) minutes.
Extended self-test routine
recommended polling time:        ( 266) minutes.
Conveyance self-test routine
recommended polling time:        (   2) minutes.
SCT capabilities:              (0x10b9) SCT Status supported.
                                        SCT Error Recovery Control supported.
                                        SCT Feature Control supported.
                                        SCT Data Table supported.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   091   091   006    Pre-fail  Always       -       168521614
  3 Spin_Up_Time            0x0003   095   095   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   095   095   020    Old_age   Always       -       5937
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       200
  7 Seek_Error_Rate         0x000f   078   060   030    Pre-fail  Always       -       8724120516
  9 Power_On_Hours          0x0032   087   087   000    Old_age   Always       -       11882
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   095   095   020    Old_age   Always       -       5938
184 End-to-End_Error        0x0032   100   100   099    Old_age   Always       -       0
187 Reported_Uncorrect      0x0032   001   001   000    Old_age   Always       -       422
188 Command_Timeout         0x0032   100   100   000    Old_age   Always       -       0
189 High_Fly_Writes         0x003a   001   001   000    Old_age   Always       -       269
190 Airflow_Temperature_Cel 0x0022   056   045   045    Old_age   Always   In_the_past 44 (Min/Max 16/44)
191 G-Sense_Error_Rate      0x0032   100   100   000    Old_age   Always       -       0
192 Power-Off_Retract_Count 0x0032   098   098   000    Old_age   Always       -       5936
193 Load_Cycle_Count        0x0032   098   098   000    Old_age   Always       -       5937
194 Temperature_Celsius     0x0022   044   055   000    Old_age   Always       -       44 (0 10 0 0 0)
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   200   000    Old_age   Always       -       0

SMART Error Log Version: 1
ATA Error Count: 686 (device log contains only the most recent five errors)
        CR = Command Register [HEX]
        FR = Features Register [HEX]
        SC = Sector Count Register [HEX]
        SN = Sector Number Register [HEX]
        CL = Cylinder Low Register [HEX]
        CH = Cylinder High Register [HEX]
        DH = Device/Head Register [HEX]
        DC = Device Command Register [HEX]
        ER = Error register [HEX]
        ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 686 occurred at disk power-on lifetime: 11876 hours (494 days + 20 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 ff ff ff 0f  Error: UNC at LBA = 0x0fffffff = 268435455

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  24 00 01 ff ff ff ef 00      03:34:08.764  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:08.739  WRITE SECTORS(S) EXT
  ec 00 00 16 1d d0 a0 00      03:34:08.724  IDENTIFY DEVICE
  24 00 01 ff ff ff ef 00      03:34:08.093  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:08.067  WRITE SECTORS(S) EXT

Error 685 occurred at disk power-on lifetime: 11876 hours (494 days + 20 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 ff ff ff 0f  Error: UNC at LBA = 0x0fffffff = 268435455

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  24 00 01 ff ff ff ef 00      03:34:08.093  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:08.067  WRITE SECTORS(S) EXT
  ec 00 00 15 1d d0 a0 00      03:34:08.052  IDENTIFY DEVICE
  24 00 01 ff ff ff ef 00      03:34:07.421  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:07.395  WRITE SECTORS(S) EXT

Error 684 occurred at disk power-on lifetime: 11876 hours (494 days + 20 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 ff ff ff 0f  Error: UNC at LBA = 0x0fffffff = 268435455

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  24 00 01 ff ff ff ef 00      03:34:07.421  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:07.395  WRITE SECTORS(S) EXT
  ec 00 00 14 1d d0 a0 00      03:34:07.380  IDENTIFY DEVICE
  24 00 01 ff ff ff ef 00      03:34:06.749  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:06.723  WRITE SECTORS(S) EXT

Error 683 occurred at disk power-on lifetime: 11876 hours (494 days + 20 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 ff ff ff 0f  Error: UNC at LBA = 0x0fffffff = 268435455

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  24 00 01 ff ff ff ef 00      03:34:06.749  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:06.723  WRITE SECTORS(S) EXT
  ec 00 00 13 1d d0 a0 00      03:34:06.708  IDENTIFY DEVICE
  24 00 01 ff ff ff ef 00      03:34:06.080  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:06.054  WRITE SECTORS(S) EXT

Error 682 occurred at disk power-on lifetime: 11876 hours (494 days + 20 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  40 51 00 ff ff ff 0f  Error: UNC at LBA = 0x0fffffff = 268435455

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  24 00 01 ff ff ff ef 00      03:34:06.080  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:06.054  WRITE SECTORS(S) EXT
  ec 00 00 12 1d d0 a0 00      03:34:06.007  IDENTIFY DEVICE
  24 00 01 ff ff ff ef 00      03:34:05.380  READ SECTOR(S) EXT
  34 00 01 ff ff ff ef 00      03:34:05.354  WRITE SECTORS(S) EXT

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%     11881         -
# 2  Short offline       Completed: read failure       90%     11881         0
# 3  Selective offline   Completed without error       00%     11881         -
# 4  Selective offline   Completed: read failure       90%     11877         0
# 5  Selective offline   Completed: read failure       90%     11876         3067092240
# 6  Selective offline   Completed: read failure       90%     11876         3067092232
# 7  Selective offline   Completed: read failure       90%     11876         3048953008
# 8  Selective offline   Completed: read failure       90%     11876         3048953000
# 9  Selective offline   Completed: read failure       90%     11876         3048952976
#10  Selective offline   Completed: read failure       90%     11876         3048952952
#11  Selective offline   Completed: read failure       90%     11876         3048952944
#12  Selective offline   Completed: read failure       90%     11875         3048952920
#13  Selective offline   Completed: read failure       90%     11875         3048950432
#14  Selective offline   Completed: read failure       90%     11875         3048601768
#15  Selective offline   Completed: read failure       90%     11875         3048601760
#16  Selective offline   Completed: read failure       90%     11875         3048601752
#17  Selective offline   Completed: read failure       90%     11875         3048600960
#18  Selective offline   Completed: read failure       90%     11875         3048600952
#19  Selective offline   Completed: read failure       90%     11875         3048600944
#20  Selective offline   Completed: read failure       90%     11875         3048600936
#21  Selective offline   Completed: read failure       90%     11875         3048600576

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA     MAX_LBA  CURRENT_TEST_STATUS
    1        0  3907029167  Not_testing
    2        0           0  Not_testing
    3        0           0  Not_testing
    4        0           0  Not_testing
    5        0           0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.
 
Back
Top