diff options
| -rw-r--r-- | drivers/gpu/drm/drm_mm.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_mem.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_state.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atpx_handler.c | 29 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_cursor.c | 6 | ||||
| -rw-r--r-- | fs/hpfs/Kconfig | 1 | ||||
| -rw-r--r-- | fs/hpfs/alloc.c | 118 | ||||
| -rw-r--r-- | fs/hpfs/anode.c | 138 | ||||
| -rw-r--r-- | fs/hpfs/buffer.c | 24 | ||||
| -rw-r--r-- | fs/hpfs/dir.c | 22 | ||||
| -rw-r--r-- | fs/hpfs/dnode.c | 174 | ||||
| -rw-r--r-- | fs/hpfs/ea.c | 136 | ||||
| -rw-r--r-- | fs/hpfs/file.c | 31 | ||||
| -rw-r--r-- | fs/hpfs/hpfs.h | 439 | ||||
| -rw-r--r-- | fs/hpfs/hpfs_fn.h | 80 | ||||
| -rw-r--r-- | fs/hpfs/inode.c | 47 | ||||
| -rw-r--r-- | fs/hpfs/map.c | 56 | ||||
| -rw-r--r-- | fs/hpfs/name.c | 33 | ||||
| -rw-r--r-- | fs/hpfs/namei.c | 106 | ||||
| -rw-r--r-- | fs/hpfs/super.c | 118 | ||||
| -rw-r--r-- | include/drm/drm_mm.h | 2 | ||||
| -rw-r--r-- | sound/soc/davinci/davinci-mcasp.c | 19 | ||||
| -rw-r--r-- | sound/soc/samsung/goni_wm8994.c | 8 |
24 files changed, 787 insertions, 817 deletions
diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index 5d00b0fc0d91..959186cbf328 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c | |||
| @@ -431,7 +431,7 @@ EXPORT_SYMBOL(drm_mm_search_free_in_range); | |||
| 431 | void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new) | 431 | void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new) |
| 432 | { | 432 | { |
| 433 | list_replace(&old->node_list, &new->node_list); | 433 | list_replace(&old->node_list, &new->node_list); |
| 434 | list_replace(&old->node_list, &new->hole_stack); | 434 | list_replace(&old->hole_stack, &new->hole_stack); |
| 435 | new->hole_follows = old->hole_follows; | 435 | new->hole_follows = old->hole_follows; |
| 436 | new->mm = old->mm; | 436 | new->mm = old->mm; |
| 437 | new->start = old->start; | 437 | new->start = old->start; |
| @@ -699,8 +699,8 @@ int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm) | |||
| 699 | entry->size); | 699 | entry->size); |
| 700 | total_used += entry->size; | 700 | total_used += entry->size; |
| 701 | if (entry->hole_follows) { | 701 | if (entry->hole_follows) { |
| 702 | hole_start = drm_mm_hole_node_start(&mm->head_node); | 702 | hole_start = drm_mm_hole_node_start(entry); |
| 703 | hole_end = drm_mm_hole_node_end(&mm->head_node); | 703 | hole_end = drm_mm_hole_node_end(entry); |
| 704 | hole_size = hole_end - hole_start; | 704 | hole_size = hole_end - hole_start; |
| 705 | seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n", | 705 | seq_printf(m, "0x%08lx-0x%08lx: 0x%08lx: free\n", |
| 706 | hole_start, hole_end, hole_size); | 706 | hole_start, hole_end, hole_size); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c index 5045f8b921d6..c3e953b08992 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mem.c +++ b/drivers/gpu/drm/nouveau/nouveau_mem.c | |||
| @@ -152,8 +152,6 @@ nouveau_mem_vram_fini(struct drm_device *dev) | |||
| 152 | { | 152 | { |
| 153 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 153 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 154 | 154 | ||
| 155 | nouveau_bo_ref(NULL, &dev_priv->vga_ram); | ||
| 156 | |||
| 157 | ttm_bo_device_release(&dev_priv->ttm.bdev); | 155 | ttm_bo_device_release(&dev_priv->ttm.bdev); |
| 158 | 156 | ||
| 159 | nouveau_ttm_global_release(dev_priv); | 157 | nouveau_ttm_global_release(dev_priv); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index a30adec5beaa..915fbce89595 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
| @@ -768,6 +768,11 @@ static void nouveau_card_takedown(struct drm_device *dev) | |||
| 768 | engine->mc.takedown(dev); | 768 | engine->mc.takedown(dev); |
| 769 | engine->display.late_takedown(dev); | 769 | engine->display.late_takedown(dev); |
| 770 | 770 | ||
| 771 | if (dev_priv->vga_ram) { | ||
| 772 | nouveau_bo_unpin(dev_priv->vga_ram); | ||
| 773 | nouveau_bo_ref(NULL, &dev_priv->vga_ram); | ||
| 774 | } | ||
| 775 | |||
| 771 | mutex_lock(&dev->struct_mutex); | 776 | mutex_lock(&dev->struct_mutex); |
| 772 | ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM); | 777 | ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM); |
| 773 | ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT); | 778 | ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT); |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index f116516bfef7..dd881d035f09 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
| @@ -431,7 +431,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, | |||
| 431 | } | 431 | } |
| 432 | } | 432 | } |
| 433 | 433 | ||
| 434 | /* Acer laptop (Acer TravelMate 5730G) has an HDMI port | 434 | /* Acer laptop (Acer TravelMate 5730/5730G) has an HDMI port |
| 435 | * on the laptop and a DVI port on the docking station and | 435 | * on the laptop and a DVI port on the docking station and |
| 436 | * both share the same encoder, hpd pin, and ddc line. | 436 | * both share the same encoder, hpd pin, and ddc line. |
| 437 | * So while the bios table is technically correct, | 437 | * So while the bios table is technically correct, |
| @@ -440,7 +440,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, | |||
| 440 | * with different crtcs which isn't possible on the hardware | 440 | * with different crtcs which isn't possible on the hardware |
| 441 | * side and leaves no crtcs for LVDS or VGA. | 441 | * side and leaves no crtcs for LVDS or VGA. |
| 442 | */ | 442 | */ |
| 443 | if ((dev->pdev->device == 0x95c4) && | 443 | if (((dev->pdev->device == 0x95c4) || (dev->pdev->device == 0x9591)) && |
| 444 | (dev->pdev->subsystem_vendor == 0x1025) && | 444 | (dev->pdev->subsystem_vendor == 0x1025) && |
| 445 | (dev->pdev->subsystem_device == 0x013c)) { | 445 | (dev->pdev->subsystem_device == 0x013c)) { |
| 446 | if ((*connector_type == DRM_MODE_CONNECTOR_DVII) && | 446 | if ((*connector_type == DRM_MODE_CONNECTOR_DVII) && |
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c index ed5dfe58f29c..9d95792bea3e 100644 --- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c +++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c | |||
| @@ -15,6 +15,9 @@ | |||
| 15 | #define ATPX_VERSION 0 | 15 | #define ATPX_VERSION 0 |
| 16 | #define ATPX_GPU_PWR 2 | 16 | #define ATPX_GPU_PWR 2 |
| 17 | #define ATPX_MUX_SELECT 3 | 17 | #define ATPX_MUX_SELECT 3 |
| 18 | #define ATPX_I2C_MUX_SELECT 4 | ||
| 19 | #define ATPX_SWITCH_START 5 | ||
| 20 | #define ATPX_SWITCH_END 6 | ||
| 18 | 21 | ||
| 19 | #define ATPX_INTEGRATED 0 | 22 | #define ATPX_INTEGRATED 0 |
| 20 | #define ATPX_DISCRETE 1 | 23 | #define ATPX_DISCRETE 1 |
| @@ -149,13 +152,35 @@ static int radeon_atpx_switch_mux(acpi_handle handle, int mux_id) | |||
| 149 | return radeon_atpx_execute(handle, ATPX_MUX_SELECT, mux_id); | 152 | return radeon_atpx_execute(handle, ATPX_MUX_SELECT, mux_id); |
| 150 | } | 153 | } |
| 151 | 154 | ||
| 155 | static int radeon_atpx_switch_i2c_mux(acpi_handle handle, int mux_id) | ||
| 156 | { | ||
| 157 | return radeon_atpx_execute(handle, ATPX_I2C_MUX_SELECT, mux_id); | ||
| 158 | } | ||
| 159 | |||
| 160 | static int radeon_atpx_switch_start(acpi_handle handle, int gpu_id) | ||
| 161 | { | ||
| 162 | return radeon_atpx_execute(handle, ATPX_SWITCH_START, gpu_id); | ||
| 163 | } | ||
| 164 | |||
| 165 | static int radeon_atpx_switch_end(acpi_handle handle, int gpu_id) | ||
| 166 | { | ||
| 167 | return radeon_atpx_execute(handle, ATPX_SWITCH_END, gpu_id); | ||
| 168 | } | ||
| 152 | 169 | ||
| 153 | static int radeon_atpx_switchto(enum vga_switcheroo_client_id id) | 170 | static int radeon_atpx_switchto(enum vga_switcheroo_client_id id) |
| 154 | { | 171 | { |
| 172 | int gpu_id; | ||
| 173 | |||
| 155 | if (id == VGA_SWITCHEROO_IGD) | 174 | if (id == VGA_SWITCHEROO_IGD) |
| 156 | radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, 0); | 175 | gpu_id = ATPX_INTEGRATED; |
| 157 | else | 176 | else |
| 158 | radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, 1); | 177 | gpu_id = ATPX_DISCRETE; |
| 178 | |||
| 179 | radeon_atpx_switch_start(radeon_atpx_priv.atpx_handle, gpu_id); | ||
| 180 | radeon_atpx_switch_mux(radeon_atpx_priv.atpx_handle, gpu_id); | ||
| 181 | radeon_atpx_switch_i2c_mux(radeon_atpx_priv.atpx_handle, gpu_id); | ||
| 182 | radeon_atpx_switch_end(radeon_atpx_priv.atpx_handle, gpu_id); | ||
| 183 | |||
| 159 | return 0; | 184 | return 0; |
| 160 | } | 185 | } |
| 161 | 186 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c index bdf2fa1189ae..3189a7efb2e9 100644 --- a/drivers/gpu/drm/radeon/radeon_cursor.c +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | |||
| @@ -167,9 +167,6 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 167 | return -EINVAL; | 167 | return -EINVAL; |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | radeon_crtc->cursor_width = width; | ||
| 171 | radeon_crtc->cursor_height = height; | ||
| 172 | |||
| 173 | obj = drm_gem_object_lookup(crtc->dev, file_priv, handle); | 170 | obj = drm_gem_object_lookup(crtc->dev, file_priv, handle); |
| 174 | if (!obj) { | 171 | if (!obj) { |
| 175 | DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, radeon_crtc->crtc_id); | 172 | DRM_ERROR("Cannot find cursor object %x for crtc %d\n", handle, radeon_crtc->crtc_id); |
| @@ -180,6 +177,9 @@ int radeon_crtc_cursor_set(struct drm_crtc *crtc, | |||
| 180 | if (ret) | 177 | if (ret) |
| 181 | goto fail; | 178 | goto fail; |
| 182 | 179 | ||
| 180 | radeon_crtc->cursor_width = width; | ||
| 181 | radeon_crtc->cursor_height = height; | ||
| 182 | |||
| 183 | radeon_lock_cursor(crtc, true); | 183 | radeon_lock_cursor(crtc, true); |
| 184 | /* XXX only 27 bit offset for legacy cursor */ | 184 | /* XXX only 27 bit offset for legacy cursor */ |
| 185 | radeon_set_cursor(crtc, obj, gpu_addr); | 185 | radeon_set_cursor(crtc, obj, gpu_addr); |
diff --git a/fs/hpfs/Kconfig b/fs/hpfs/Kconfig index 0c39dc3ef7d7..56bd15c5bf6c 100644 --- a/fs/hpfs/Kconfig +++ b/fs/hpfs/Kconfig | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | config HPFS_FS | 1 | config HPFS_FS |
| 2 | tristate "OS/2 HPFS file system support" | 2 | tristate "OS/2 HPFS file system support" |
| 3 | depends on BLOCK | 3 | depends on BLOCK |
| 4 | depends on BROKEN || !PREEMPT | ||
| 5 | help | 4 | help |
| 6 | OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS | 5 | OS/2 is IBM's operating system for PC's, the same as Warp, and HPFS |
| 7 | is the file system used for organizing files on OS/2 hard disk | 6 | is the file system used for organizing files on OS/2 hard disk |
diff --git a/fs/hpfs/alloc.c b/fs/hpfs/alloc.c index 5503e2c28910..7a5eb2c718c8 100644 --- a/fs/hpfs/alloc.c +++ b/fs/hpfs/alloc.c | |||
| @@ -8,8 +8,6 @@ | |||
| 8 | 8 | ||
| 9 | #include "hpfs_fn.h" | 9 | #include "hpfs_fn.h" |
| 10 | 10 | ||
| 11 | static int hpfs_alloc_if_possible_nolock(struct super_block *s, secno sec); | ||
| 12 | |||
| 13 | /* | 11 | /* |
| 14 | * Check if a sector is allocated in bitmap | 12 | * Check if a sector is allocated in bitmap |
| 15 | * This is really slow. Turned on only if chk==2 | 13 | * This is really slow. Turned on only if chk==2 |
| @@ -18,9 +16,9 @@ static int hpfs_alloc_if_possible_nolock(struct super_block *s, secno sec); | |||
| 18 | static int chk_if_allocated(struct super_block *s, secno sec, char *msg) | 16 | static int chk_if_allocated(struct super_block *s, secno sec, char *msg) |
| 19 | { | 17 | { |
| 20 | struct quad_buffer_head qbh; | 18 | struct quad_buffer_head qbh; |
| 21 | unsigned *bmp; | 19 | u32 *bmp; |
| 22 | if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "chk"))) goto fail; | 20 | if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "chk"))) goto fail; |
| 23 | if ((bmp[(sec & 0x3fff) >> 5] >> (sec & 0x1f)) & 1) { | 21 | if ((cpu_to_le32(bmp[(sec & 0x3fff) >> 5]) >> (sec & 0x1f)) & 1) { |
| 24 | hpfs_error(s, "sector '%s' - %08x not allocated in bitmap", msg, sec); | 22 | hpfs_error(s, "sector '%s' - %08x not allocated in bitmap", msg, sec); |
| 25 | goto fail1; | 23 | goto fail1; |
| 26 | } | 24 | } |
| @@ -28,7 +26,7 @@ static int chk_if_allocated(struct super_block *s, secno sec, char *msg) | |||
| 28 | if (sec >= hpfs_sb(s)->sb_dirband_start && sec < hpfs_sb(s)->sb_dirband_start + hpfs_sb(s)->sb_dirband_size) { | 26 | if (sec >= hpfs_sb(s)->sb_dirband_start && sec < hpfs_sb(s)->sb_dirband_start + hpfs_sb(s)->sb_dirband_size) { |
| 29 | unsigned ssec = (sec - hpfs_sb(s)->sb_dirband_start) / 4; | 27 | unsigned ssec = (sec - hpfs_sb(s)->sb_dirband_start) / 4; |
| 30 | if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) goto fail; | 28 | if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) goto fail; |
| 31 | if ((bmp[ssec >> 5] >> (ssec & 0x1f)) & 1) { | 29 | if ((le32_to_cpu(bmp[ssec >> 5]) >> (ssec & 0x1f)) & 1) { |
| 32 | hpfs_error(s, "sector '%s' - %08x not allocated in directory bitmap", msg, sec); | 30 | hpfs_error(s, "sector '%s' - %08x not allocated in directory bitmap", msg, sec); |
| 33 | goto fail1; | 31 | goto fail1; |
| 34 | } | 32 | } |
| @@ -75,7 +73,6 @@ static secno alloc_in_bmp(struct super_block *s, secno near, unsigned n, unsigne | |||
| 75 | hpfs_error(s, "Bad allocation size: %d", n); | 73 | hpfs_error(s, "Bad allocation size: %d", n); |
| 76 | return 0; | 74 | return 0; |
| 77 | } | 75 | } |
| 78 | lock_super(s); | ||
| 79 | if (bs != ~0x3fff) { | 76 | if (bs != ~0x3fff) { |
| 80 | if (!(bmp = hpfs_map_bitmap(s, near >> 14, &qbh, "aib"))) goto uls; | 77 | if (!(bmp = hpfs_map_bitmap(s, near >> 14, &qbh, "aib"))) goto uls; |
| 81 | } else { | 78 | } else { |
| @@ -85,10 +82,6 @@ static secno alloc_in_bmp(struct super_block *s, secno near, unsigned n, unsigne | |||
| 85 | ret = bs + nr; | 82 | ret = bs + nr; |
| 86 | goto rt; | 83 | goto rt; |
| 87 | } | 84 | } |
| 88 | /*if (!tstbits(bmp, nr + n, n + forward)) { | ||
| 89 | ret = bs + nr + n; | ||
| 90 | goto rt; | ||
| 91 | }*/ | ||
| 92 | q = nr + n; b = 0; | 85 | q = nr + n; b = 0; |
| 93 | while ((a = tstbits(bmp, q, n + forward)) != 0) { | 86 | while ((a = tstbits(bmp, q, n + forward)) != 0) { |
| 94 | q += a; | 87 | q += a; |
| @@ -105,14 +98,14 @@ static secno alloc_in_bmp(struct super_block *s, secno near, unsigned n, unsigne | |||
| 105 | goto rt; | 98 | goto rt; |
| 106 | } | 99 | } |
| 107 | nr >>= 5; | 100 | nr >>= 5; |
| 108 | /*for (i = nr + 1; i != nr; i++, i &= 0x1ff) {*/ | 101 | /*for (i = nr + 1; i != nr; i++, i &= 0x1ff) */ |
| 109 | i = nr; | 102 | i = nr; |
| 110 | do { | 103 | do { |
| 111 | if (!bmp[i]) goto cont; | 104 | if (!le32_to_cpu(bmp[i])) goto cont; |
| 112 | if (n + forward >= 0x3f && bmp[i] != -1) goto cont; | 105 | if (n + forward >= 0x3f && le32_to_cpu(bmp[i]) != 0xffffffff) goto cont; |
| 113 | q = i<<5; | 106 | q = i<<5; |
| 114 | if (i > 0) { | 107 | if (i > 0) { |
| 115 | unsigned k = bmp[i-1]; | 108 | unsigned k = le32_to_cpu(bmp[i-1]); |
| 116 | while (k & 0x80000000) { | 109 | while (k & 0x80000000) { |
| 117 | q--; k <<= 1; | 110 | q--; k <<= 1; |
| 118 | } | 111 | } |
| @@ -132,18 +125,17 @@ static secno alloc_in_bmp(struct super_block *s, secno near, unsigned n, unsigne | |||
| 132 | } while (i != nr); | 125 | } while (i != nr); |
| 133 | rt: | 126 | rt: |
| 134 | if (ret) { | 127 | if (ret) { |
| 135 | if (hpfs_sb(s)->sb_chk && ((ret >> 14) != (bs >> 14) || (bmp[(ret & 0x3fff) >> 5] | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) { | 128 | if (hpfs_sb(s)->sb_chk && ((ret >> 14) != (bs >> 14) || (le32_to_cpu(bmp[(ret & 0x3fff) >> 5]) | ~(((1 << n) - 1) << (ret & 0x1f))) != 0xffffffff)) { |
| 136 | hpfs_error(s, "Allocation doesn't work! Wanted %d, allocated at %08x", n, ret); | 129 | hpfs_error(s, "Allocation doesn't work! Wanted %d, allocated at %08x", n, ret); |
| 137 | ret = 0; | 130 | ret = 0; |
| 138 | goto b; | 131 | goto b; |
| 139 | } | 132 | } |
| 140 | bmp[(ret & 0x3fff) >> 5] &= ~(((1 << n) - 1) << (ret & 0x1f)); | 133 | bmp[(ret & 0x3fff) >> 5] &= cpu_to_le32(~(((1 << n) - 1) << (ret & 0x1f))); |
| 141 | hpfs_mark_4buffers_dirty(&qbh); | 134 | hpfs_mark_4buffers_dirty(&qbh); |
| 142 | } | 135 | } |
| 143 | b: | 136 | b: |
| 144 | hpfs_brelse4(&qbh); | 137 | hpfs_brelse4(&qbh); |
| 145 | uls: | 138 | uls: |
| 146 | unlock_super(s); | ||
| 147 | return ret; | 139 | return ret; |
| 148 | } | 140 | } |
| 149 | 141 | ||
| @@ -155,7 +147,7 @@ static secno alloc_in_bmp(struct super_block *s, secno near, unsigned n, unsigne | |||
| 155 | * sectors | 147 | * sectors |
| 156 | */ | 148 | */ |
| 157 | 149 | ||
| 158 | secno hpfs_alloc_sector(struct super_block *s, secno near, unsigned n, int forward, int lock) | 150 | secno hpfs_alloc_sector(struct super_block *s, secno near, unsigned n, int forward) |
| 159 | { | 151 | { |
| 160 | secno sec; | 152 | secno sec; |
| 161 | int i; | 153 | int i; |
| @@ -167,7 +159,6 @@ secno hpfs_alloc_sector(struct super_block *s, secno near, unsigned n, int forwa | |||
| 167 | forward = -forward; | 159 | forward = -forward; |
| 168 | f_p = 1; | 160 | f_p = 1; |
| 169 | } | 161 | } |
| 170 | if (lock) hpfs_lock_creation(s); | ||
| 171 | n_bmps = (sbi->sb_fs_size + 0x4000 - 1) >> 14; | 162 | n_bmps = (sbi->sb_fs_size + 0x4000 - 1) >> 14; |
| 172 | if (near && near < sbi->sb_fs_size) { | 163 | if (near && near < sbi->sb_fs_size) { |
| 173 | if ((sec = alloc_in_bmp(s, near, n, f_p ? forward : forward/4))) goto ret; | 164 | if ((sec = alloc_in_bmp(s, near, n, f_p ? forward : forward/4))) goto ret; |
| @@ -214,18 +205,17 @@ secno hpfs_alloc_sector(struct super_block *s, secno near, unsigned n, int forwa | |||
| 214 | ret: | 205 | ret: |
| 215 | if (sec && f_p) { | 206 | if (sec && f_p) { |
| 216 | for (i = 0; i < forward; i++) { | 207 | for (i = 0; i < forward; i++) { |
| 217 | if (!hpfs_alloc_if_possible_nolock(s, sec + i + 1)) { | 208 | if (!hpfs_alloc_if_possible(s, sec + i + 1)) { |
| 218 | hpfs_error(s, "Prealloc doesn't work! Wanted %d, allocated at %08x, can't allocate %d", forward, sec, i); | 209 | hpfs_error(s, "Prealloc doesn't work! Wanted %d, allocated at %08x, can't allocate %d", forward, sec, i); |
| 219 | sec = 0; | 210 | sec = 0; |
| 220 | break; | 211 | break; |
| 221 | } | 212 | } |
| 222 | } | 213 | } |
| 223 | } | 214 | } |
| 224 | if (lock) hpfs_unlock_creation(s); | ||
| 225 | return sec; | 215 | return sec; |
| 226 | } | 216 | } |
| 227 | 217 | ||
| 228 | static secno alloc_in_dirband(struct super_block *s, secno near, int lock) | 218 | static secno alloc_in_dirband(struct super_block *s, secno near) |
| 229 | { | 219 | { |
| 230 | unsigned nr = near; | 220 | unsigned nr = near; |
| 231 | secno sec; | 221 | secno sec; |
| @@ -236,49 +226,35 @@ static secno alloc_in_dirband(struct super_block *s, secno near, int lock) | |||
| 236 | nr = sbi->sb_dirband_start + sbi->sb_dirband_size - 4; | 226 | nr = sbi->sb_dirband_start + sbi->sb_dirband_size - 4; |
| 237 | nr -= sbi->sb_dirband_start; | 227 | nr -= sbi->sb_dirband_start; |
| 238 | nr >>= 2; | 228 | nr >>= 2; |
| 239 | if (lock) hpfs_lock_creation(s); | ||
| 240 | sec = alloc_in_bmp(s, (~0x3fff) | nr, 1, 0); | 229 | sec = alloc_in_bmp(s, (~0x3fff) | nr, 1, 0); |
| 241 | if (lock) hpfs_unlock_creation(s); | ||
| 242 | if (!sec) return 0; | 230 | if (!sec) return 0; |
| 243 | return ((sec & 0x3fff) << 2) + sbi->sb_dirband_start; | 231 | return ((sec & 0x3fff) << 2) + sbi->sb_dirband_start; |
| 244 | } | 232 | } |
| 245 | 233 | ||
| 246 | /* Alloc sector if it's free */ | 234 | /* Alloc sector if it's free */ |
| 247 | 235 | ||
| 248 | static int hpfs_alloc_if_possible_nolock(struct super_block *s, secno sec) | 236 | int hpfs_alloc_if_possible(struct super_block *s, secno sec) |
| 249 | { | 237 | { |
| 250 | struct quad_buffer_head qbh; | 238 | struct quad_buffer_head qbh; |
| 251 | unsigned *bmp; | 239 | u32 *bmp; |
| 252 | lock_super(s); | ||
| 253 | if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "aip"))) goto end; | 240 | if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "aip"))) goto end; |
| 254 | if (bmp[(sec & 0x3fff) >> 5] & (1 << (sec & 0x1f))) { | 241 | if (le32_to_cpu(bmp[(sec & 0x3fff) >> 5]) & (1 << (sec & 0x1f))) { |
| 255 | bmp[(sec & 0x3fff) >> 5] &= ~(1 << (sec & 0x1f)); | 242 | bmp[(sec & 0x3fff) >> 5] &= cpu_to_le32(~(1 << (sec & 0x1f))); |
| 256 | hpfs_mark_4buffers_dirty(&qbh); | 243 | hpfs_mark_4buffers_dirty(&qbh); |
| 257 | hpfs_brelse4(&qbh); | 244 | hpfs_brelse4(&qbh); |
| 258 | unlock_super(s); | ||
| 259 | return 1; | 245 | return 1; |
| 260 | } | 246 | } |
| 261 | hpfs_brelse4(&qbh); | 247 | hpfs_brelse4(&qbh); |
| 262 | end: | 248 | end: |
| 263 | unlock_super(s); | ||
| 264 | return 0; | 249 | return 0; |
| 265 | } | 250 | } |
| 266 | 251 | ||
| 267 | int hpfs_alloc_if_possible(struct super_block *s, secno sec) | ||
| 268 | { | ||
| 269 | int r; | ||
| 270 | hpfs_lock_creation(s); | ||
| 271 | r = hpfs_alloc_if_possible_nolock(s, sec); | ||
| 272 | hpfs_unlock_creation(s); | ||
| 273 | return r; | ||
| 274 | } | ||
| 275 | |||
| 276 | /* Free sectors in bitmaps */ | 252 | /* Free sectors in bitmaps */ |
| 277 | 253 | ||
| 278 | void hpfs_free_sectors(struct super_block *s, secno sec, unsigned n) | 254 | void hpfs_free_sectors(struct super_block *s, secno sec, unsigned n) |
| 279 | { | 255 | { |
| 280 | struct quad_buffer_head qbh; | 256 | struct quad_buffer_head qbh; |
| 281 | unsigned *bmp; | 257 | u32 *bmp; |
| 282 | struct hpfs_sb_info *sbi = hpfs_sb(s); | 258 | struct hpfs_sb_info *sbi = hpfs_sb(s); |
| 283 | /*printk("2 - ");*/ | 259 | /*printk("2 - ");*/ |
| 284 | if (!n) return; | 260 | if (!n) return; |
| @@ -286,26 +262,22 @@ void hpfs_free_sectors(struct super_block *s, secno sec, unsigned n) | |||
| 286 | hpfs_error(s, "Trying to free reserved sector %08x", sec); | 262 | hpfs_error(s, "Trying to free reserved sector %08x", sec); |
| 287 | return; | 263 | return; |
| 288 | } | 264 | } |
| 289 | lock_super(s); | ||
| 290 | sbi->sb_max_fwd_alloc += n > 0xffff ? 0xffff : n; | 265 | sbi->sb_max_fwd_alloc += n > 0xffff ? 0xffff : n; |
| 291 | if (sbi->sb_max_fwd_alloc > 0xffffff) sbi->sb_max_fwd_alloc = 0xffffff; | 266 | if (sbi->sb_max_fwd_alloc > 0xffffff) sbi->sb_max_fwd_alloc = 0xffffff; |
| 292 | new_map: | 267 | new_map: |
| 293 | if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "free"))) { | 268 | if (!(bmp = hpfs_map_bitmap(s, sec >> 14, &qbh, "free"))) { |
| 294 | unlock_super(s); | ||
| 295 | return; | 269 | return; |
| 296 | } | 270 | } |
| 297 | new_tst: | 271 | new_tst: |
| 298 | if ((bmp[(sec & 0x3fff) >> 5] >> (sec & 0x1f) & 1)) { | 272 | if ((le32_to_cpu(bmp[(sec & 0x3fff) >> 5]) >> (sec & 0x1f) & 1)) { |
| 299 | hpfs_error(s, "sector %08x not allocated", sec); | 273 | hpfs_error(s, "sector %08x not allocated", sec); |
| 300 | hpfs_brelse4(&qbh); | 274 | hpfs_brelse4(&qbh); |
| 301 | unlock_super(s); | ||
| 302 | return; | 275 | return; |
| 303 | } | 276 | } |
| 304 | bmp[(sec & 0x3fff) >> 5] |= 1 << (sec & 0x1f); | 277 | bmp[(sec & 0x3fff) >> 5] |= cpu_to_le32(1 << (sec & 0x1f)); |
| 305 | if (!--n) { | 278 | if (!--n) { |
| 306 | hpfs_mark_4buffers_dirty(&qbh); | 279 | hpfs_mark_4buffers_dirty(&qbh); |
| 307 | hpfs_brelse4(&qbh); | 280 | hpfs_brelse4(&qbh); |
| 308 | unlock_super(s); | ||
| 309 | return; | 281 | return; |
| 310 | } | 282 | } |
| 311 | if (!(++sec & 0x3fff)) { | 283 | if (!(++sec & 0x3fff)) { |
| @@ -327,13 +299,13 @@ int hpfs_check_free_dnodes(struct super_block *s, int n) | |||
| 327 | int n_bmps = (hpfs_sb(s)->sb_fs_size + 0x4000 - 1) >> 14; | 299 | int n_bmps = (hpfs_sb(s)->sb_fs_size + 0x4000 - 1) >> 14; |
| 328 | int b = hpfs_sb(s)->sb_c_bitmap & 0x0fffffff; | 300 | int b = hpfs_sb(s)->sb_c_bitmap & 0x0fffffff; |
| 329 | int i, j; | 301 | int i, j; |
| 330 | unsigned *bmp; | 302 | u32 *bmp; |
| 331 | struct quad_buffer_head qbh; | 303 | struct quad_buffer_head qbh; |
| 332 | if ((bmp = hpfs_map_dnode_bitmap(s, &qbh))) { | 304 | if ((bmp = hpfs_map_dnode_bitmap(s, &qbh))) { |
| 333 | for (j = 0; j < 512; j++) { | 305 | for (j = 0; j < 512; j++) { |
| 334 | unsigned k; | 306 | unsigned k; |
| 335 | if (!bmp[j]) continue; | 307 | if (!le32_to_cpu(bmp[j])) continue; |
| 336 | for (k = bmp[j]; k; k >>= 1) if (k & 1) if (!--n) { | 308 | for (k = le32_to_cpu(bmp[j]); k; k >>= 1) if (k & 1) if (!--n) { |
| 337 | hpfs_brelse4(&qbh); | 309 | hpfs_brelse4(&qbh); |
| 338 | return 0; | 310 | return 0; |
| 339 | } | 311 | } |
| @@ -352,10 +324,10 @@ int hpfs_check_free_dnodes(struct super_block *s, int n) | |||
| 352 | chk_bmp: | 324 | chk_bmp: |
| 353 | if (bmp) { | 325 | if (bmp) { |
| 354 | for (j = 0; j < 512; j++) { | 326 | for (j = 0; j < 512; j++) { |
| 355 | unsigned k; | 327 | u32 k; |
| 356 | if (!bmp[j]) continue; | 328 | if (!le32_to_cpu(bmp[j])) continue; |
| 357 | for (k = 0xf; k; k <<= 4) | 329 | for (k = 0xf; k; k <<= 4) |
| 358 | if ((bmp[j] & k) == k) { | 330 | if ((le32_to_cpu(bmp[j]) & k) == k) { |
| 359 | if (!--n) { | 331 | if (!--n) { |
| 360 | hpfs_brelse4(&qbh); | 332 | hpfs_brelse4(&qbh); |
| 361 | return 0; | 333 | return 0; |
| @@ -379,44 +351,40 @@ void hpfs_free_dnode(struct super_block *s, dnode_secno dno) | |||
| 379 | hpfs_free_sectors(s, dno, 4); | 351 | hpfs_free_sectors(s, dno, 4); |
| 380 | } else { | 352 | } else { |
| 381 | struct quad_buffer_head qbh; | 353 | struct quad_buffer_head qbh; |
| 382 | unsigned *bmp; | 354 | u32 *bmp; |
| 383 | unsigned ssec = (dno - hpfs_sb(s)->sb_dirband_start) / 4; | 355 | unsigned ssec = (dno - hpfs_sb(s)->sb_dirband_start) / 4; |
| 384 | lock_super(s); | ||
| 385 | if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) { | 356 | if (!(bmp = hpfs_map_dnode_bitmap(s, &qbh))) { |
| 386 | unlock_super(s); | ||
| 387 | return; | 357 | return; |
| 388 | } | 358 | } |
| 389 | bmp[ssec >> 5] |= 1 << (ssec & 0x1f); | 359 | bmp[ssec >> 5] |= cpu_to_le32(1 << (ssec & 0x1f)); |
| 390 | hpfs_mark_4buffers_dirty(&qbh); | 360 | hpfs_mark_4buffers_dirty(&qbh); |
| 391 | hpfs_brelse4(&qbh); | 361 | hpfs_brelse4(&qbh); |
| 392 | unlock_super(s); | ||
| 393 | } | 362 | } |
| 394 | } | 363 | } |
| 395 | 364 | ||
| 396 | struct dnode *hpfs_alloc_dnode(struct super_block *s, secno near, | 365 | struct dnode *hpfs_alloc_dnode(struct super_block *s, secno near, |
| 397 | dnode_secno *dno, struct quad_buffer_head *qbh, | 366 | dnode_secno *dno, struct quad_buffer_head *qbh) |
| 398 | int lock) | ||
| 399 | { | 367 | { |
| 400 | struct dnode *d; | 368 | struct dnode *d; |
| 401 | if (hpfs_count_one_bitmap(s, hpfs_sb(s)->sb_dmap) > FREE_DNODES_ADD) { | 369 | if (hpfs_count_one_bitmap(s, hpfs_sb(s)->sb_dmap) > FREE_DNODES_ADD) { |
| 402 | if (!(*dno = alloc_in_dirband(s, near, lock))) | 370 | if (!(*dno = alloc_in_dirband(s, near))) |
| 403 | if (!(*dno = hpfs_alloc_sector(s, near, 4, 0, lock))) return NULL; | 371 | if (!(*dno = hpfs_alloc_sector(s, near, 4, 0))) return NULL; |
| 404 | } else { | 372 | } else { |
| 405 | if (!(*dno = hpfs_alloc_sector(s, near, 4, 0, lock))) | 373 | if (!(*dno = hpfs_alloc_sector(s, near, 4, 0))) |
| 406 | if (!(*dno = alloc_in_dirband(s, near, lock))) return NULL; | 374 | if (!(*dno = alloc_in_dirband(s, near))) return NULL; |
| 407 | } | 375 | } |
| 408 | if (!(d = hpfs_get_4sectors(s, *dno, qbh))) { | 376 | if (!(d = hpfs_get_4sectors(s, *dno, qbh))) { |
| 409 | hpfs_free_dnode(s, *dno); | 377 | hpfs_free_dnode(s, *dno); |
| 410 | return NULL; | 378 | return NULL; |
| 411 | } | 379 | } |
| 412 | memset(d, 0, 2048); | 380 | memset(d, 0, 2048); |
| 413 | d->magic = DNODE_MAGIC; | 381 | d->magic = cpu_to_le32(DNODE_MAGIC); |
| 414 | d->first_free = 52; | 382 | d->first_free = cpu_to_le32(52); |
| 415 | d->dirent[0] = 32; | 383 | d->dirent[0] = 32; |
| 416 | d->dirent[2] = 8; | 384 | d->dirent[2] = 8; |
| 417 | d->dirent[30] = 1; | 385 | d->dirent[30] = 1; |
| 418 | d->dirent[31] = 255; | 386 | d->dirent[31] = 255; |
| 419 | d->self = *dno; | 387 | d->self = cpu_to_le32(*dno); |
| 420 | return d; | 388 | return d; |
| 421 | } | 389 | } |
| 422 | 390 | ||
| @@ -424,16 +392,16 @@ struct fnode *hpfs_alloc_fnode(struct super_block *s, secno near, fnode_secno *f | |||
| 424 | struct buffer_head **bh) | 392 | struct buffer_head **bh) |
| 425 | { | 393 | { |
| 426 | struct fnode *f; | 394 | struct fnode *f; |
| 427 | if (!(*fno = hpfs_alloc_sector(s, near, 1, FNODE_ALLOC_FWD, 1))) return NULL; | 395 | if (!(*fno = hpfs_alloc_sector(s, near, 1, FNODE_ALLOC_FWD))) return NULL; |
| 428 | if (!(f = hpfs_get_sector(s, *fno, bh))) { | 396 | if (!(f = hpfs_get_sector(s, *fno, bh))) { |
| 429 | hpfs_free_sectors(s, *fno, 1); | 397 | hpfs_free_sectors(s, *fno, 1); |
| 430 | return NULL; | 398 | return NULL; |
| 431 | } | 399 | } |
| 432 | memset(f, 0, 512); | 400 | memset(f, 0, 512); |
| 433 | f->magic = FNODE_MAGIC; | 401 | f->magic = cpu_to_le32(FNODE_MAGIC); |
| 434 | f->ea_offs = 0xc4; | 402 | f->ea_offs = cpu_to_le16(0xc4); |
| 435 | f->btree.n_free_nodes = 8; | 403 | f->btree.n_free_nodes = 8; |
| 436 | f->btree.first_free = 8; | 404 | f->btree.first_free = cpu_to_le16(8); |
| 437 | return f; | 405 | return f; |
| 438 | } | 406 | } |
| 439 | 407 | ||
| @@ -441,16 +409,16 @@ struct anode *hpfs_alloc_anode(struct super_block *s, secno near, anode_secno *a | |||
| 441 | struct buffer_head **bh) | 409 | struct buffer_head **bh) |
| 442 | { | 410 | { |
| 443 | struct anode *a; | 411 | struct anode *a; |
| 444 | if (!(*ano = hpfs_alloc_sector(s, near, 1, ANODE_ALLOC_FWD, 1))) return NULL; | 412 | if (!(*ano = hpfs_alloc_sector(s, near, 1, ANODE_ALLOC_FWD))) return NULL; |
| 445 | if (!(a = hpfs_get_sector(s, *ano, bh))) { | 413 | if (!(a = hpfs_get_sector(s, *ano, bh))) { |
| 446 | hpfs_free_sectors(s, *ano, 1); | 414 | hpfs_free_sectors(s, *ano, 1); |
| 447 | return NULL; | 415 | return NULL; |
| 448 | } | 416 | } |
| 449 | memset(a, 0, 512); | 417 | memset(a, 0, 512); |
| 450 | a->magic = ANODE_MAGIC; | 418 | a->magic = cpu_to_le32(ANODE_MAGIC); |
| 451 | a->self = *ano; | 419 | a->self = cpu_to_le32(*ano); |
| 452 | a->btree.n_free_nodes = 40; | 420 | a->btree.n_free_nodes = 40; |
| 453 | a->btree.n_used_nodes = 0; | 421 | a->btree.n_used_nodes = 0; |
| 454 | a->btree.first_free = 8; | 422 | a->btree.first_free = cpu_to_le16(8); |
| 455 | return a; | 423 | return a; |
| 456 | } | 424 | } |
diff --git a/fs/hpfs/anode.c b/fs/hpfs/anode.c index 6a2f04bf3df0..08b503e8ed29 100644 --- a/fs/hpfs/anode.c +++ b/fs/hpfs/anode.c | |||
| @@ -22,8 +22,8 @@ secno hpfs_bplus_lookup(struct super_block *s, struct inode *inode, | |||
| 22 | if (hpfs_sb(s)->sb_chk) if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_bplus_lookup")) return -1; | 22 | if (hpfs_sb(s)->sb_chk) if (hpfs_stop_cycles(s, a, &c1, &c2, "hpfs_bplus_lookup")) return -1; |
| 23 | if (btree->internal) { | 23 | if (btree->internal) { |
| 24 | for (i = 0; i < btree->n_used_nodes; i++) | 24 | for (i = 0; i < btree->n_used_nodes; i++) |
| 25 | if (btree->u.internal[i].file_secno > sec) { | 25 | if (le32_to_cpu(btree->u.internal[i].file_secno) > sec) { |
| 26 | a = btree->u.internal[i].down; | 26 | a = le32_to_cpu(btree->u.internal[i].down); |
| 27 | brelse(bh); | 27 | brelse(bh); |
| 28 | if (!(anode = hpfs_map_anode(s, a, &bh))) return -1; | 28 | if (!(anode = hpfs_map_anode(s, a, &bh))) return -1; |
| 29 | btree = &anode->btree; | 29 | btree = &anode->btree; |
| @@ -34,18 +34,18 @@ secno hpfs_bplus_lookup(struct super_block *s, struct inode *inode, | |||
| 34 | return -1; | 34 | return -1; |
| 35 | } | 35 | } |
| 36 | for (i = 0; i < btree->n_used_nodes; i++) | 36 | for (i = 0; i < btree->n_used_nodes; i++) |
| 37 | if (btree->u.external[i].file_secno <= sec && | 37 | if (le32_to_cpu(btree->u.external[i].file_secno) <= sec && |
| 38 | btree->u.external[i].file_secno + btree->u.external[i].length > sec) { | 38 | le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) > sec) { |
| 39 | a = btree->u.external[i].disk_secno + sec - btree->u.external[i].file_secno; | 39 | a = le32_to_cpu(btree->u.external[i].disk_secno) + sec - le32_to_cpu(btree->u.external[i].file_secno); |
| 40 | if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, a, 1, "data")) { | 40 | if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, a, 1, "data")) { |
| 41 | brelse(bh); | 41 | brelse(bh); |
| 42 | return -1; | 42 | return -1; |
| 43 | } | 43 | } |
| 44 | if (inode) { | 44 | if (inode) { |
| 45 | struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); | 45 | struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); |
| 46 | hpfs_inode->i_file_sec = btree->u.external[i].file_secno; | 46 | hpfs_inode->i_file_sec = le32_to_cpu(btree->u.external[i].file_secno); |
| 47 | hpfs_inode->i_disk_sec = btree->u.external[i].disk_secno; | 47 | hpfs_inode->i_disk_sec = le32_to_cpu(btree->u.external[i].disk_secno); |
| 48 | hpfs_inode->i_n_secs = btree->u.external[i].length; | 48 | hpfs_inode->i_n_secs = le32_to_cpu(btree->u.external[i].length); |
| 49 | } | 49 | } |
| 50 | brelse(bh); | 50 | brelse(bh); |
| 51 | return a; | 51 | return a; |
| @@ -83,8 +83,8 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi | |||
| 83 | return -1; | 83 | return -1; |
| 84 | } | 84 | } |
| 85 | if (btree->internal) { | 85 | if (btree->internal) { |
| 86 | a = btree->u.internal[n].down; | 86 | a = le32_to_cpu(btree->u.internal[n].down); |
| 87 | btree->u.internal[n].file_secno = -1; | 87 | btree->u.internal[n].file_secno = cpu_to_le32(-1); |
| 88 | mark_buffer_dirty(bh); | 88 | mark_buffer_dirty(bh); |
| 89 | brelse(bh); | 89 | brelse(bh); |
| 90 | if (hpfs_sb(s)->sb_chk) | 90 | if (hpfs_sb(s)->sb_chk) |
| @@ -94,15 +94,15 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi | |||
| 94 | goto go_down; | 94 | goto go_down; |
| 95 | } | 95 | } |
| 96 | if (n >= 0) { | 96 | if (n >= 0) { |
| 97 | if (btree->u.external[n].file_secno + btree->u.external[n].length != fsecno) { | 97 | if (le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length) != fsecno) { |
| 98 | hpfs_error(s, "allocated size %08x, trying to add sector %08x, %cnode %08x", | 98 | hpfs_error(s, "allocated size %08x, trying to add sector %08x, %cnode %08x", |
| 99 | btree->u.external[n].file_secno + btree->u.external[n].length, fsecno, | 99 | le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length), fsecno, |
| 100 | fnod?'f':'a', node); | 100 | fnod?'f':'a', node); |
| 101 | brelse(bh); | 101 | brelse(bh); |
| 102 | return -1; | 102 | return -1; |
| 103 | } | 103 | } |
| 104 | if (hpfs_alloc_if_possible(s, se = btree->u.external[n].disk_secno + btree->u.external[n].length)) { | 104 | if (hpfs_alloc_if_possible(s, se = le32_to_cpu(btree->u.external[n].disk_secno) + le32_to_cpu(btree->u.external[n].length))) { |
| 105 | btree->u.external[n].length++; | 105 | btree->u.external[n].length = cpu_to_le32(le32_to_cpu(btree->u.external[n].length) + 1); |
| 106 | mark_buffer_dirty(bh); | 106 | mark_buffer_dirty(bh); |
| 107 | brelse(bh); | 107 | brelse(bh); |
| 108 | return se; | 108 | return se; |
| @@ -115,20 +115,20 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi | |||
| 115 | } | 115 | } |
| 116 | se = !fnod ? node : (node + 16384) & ~16383; | 116 | se = !fnod ? node : (node + 16384) & ~16383; |
| 117 | } | 117 | } |
| 118 | if (!(se = hpfs_alloc_sector(s, se, 1, fsecno*ALLOC_M>ALLOC_FWD_MAX ? ALLOC_FWD_MAX : fsecno*ALLOC_M<ALLOC_FWD_MIN ? ALLOC_FWD_MIN : fsecno*ALLOC_M, 1))) { | 118 | if (!(se = hpfs_alloc_sector(s, se, 1, fsecno*ALLOC_M>ALLOC_FWD_MAX ? ALLOC_FWD_MAX : fsecno*ALLOC_M<ALLOC_FWD_MIN ? ALLOC_FWD_MIN : fsecno*ALLOC_M))) { |
| 119 | brelse(bh); | 119 | brelse(bh); |
| 120 | return -1; | 120 | return -1; |
| 121 | } | 121 | } |
| 122 | fs = n < 0 ? 0 : btree->u.external[n].file_secno + btree->u.external[n].length; | 122 | fs = n < 0 ? 0 : le32_to_cpu(btree->u.external[n].file_secno) + le32_to_cpu(btree->u.external[n].length); |
| 123 | if (!btree->n_free_nodes) { | 123 | if (!btree->n_free_nodes) { |
| 124 | up = a != node ? anode->up : -1; | 124 | up = a != node ? le32_to_cpu(anode->up) : -1; |
| 125 | if (!(anode = hpfs_alloc_anode(s, a, &na, &bh1))) { | 125 | if (!(anode = hpfs_alloc_anode(s, a, &na, &bh1))) { |
| 126 | brelse(bh); | 126 | brelse(bh); |
| 127 | hpfs_free_sectors(s, se, 1); | 127 | hpfs_free_sectors(s, se, 1); |
| 128 | return -1; | 128 | return -1; |
| 129 | } | 129 | } |
| 130 | if (a == node && fnod) { | 130 | if (a == node && fnod) { |
| 131 | anode->up = node; | 131 | anode->up = cpu_to_le32(node); |
| 132 | anode->btree.fnode_parent = 1; | 132 | anode->btree.fnode_parent = 1; |
| 133 | anode->btree.n_used_nodes = btree->n_used_nodes; | 133 | anode->btree.n_used_nodes = btree->n_used_nodes; |
| 134 | anode->btree.first_free = btree->first_free; | 134 | anode->btree.first_free = btree->first_free; |
| @@ -137,9 +137,9 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi | |||
| 137 | btree->internal = 1; | 137 | btree->internal = 1; |
| 138 | btree->n_free_nodes = 11; | 138 | btree->n_free_nodes = 11; |
| 139 | btree->n_used_nodes = 1; | 139 | btree->n_used_nodes = 1; |
| 140 | btree->first_free = (char *)&(btree->u.internal[1]) - (char *)btree; | 140 | btree->first_free = cpu_to_le16((char *)&(btree->u.internal[1]) - (char *)btree); |
| 141 | btree->u.internal[0].file_secno = -1; | 141 | btree->u.internal[0].file_secno = cpu_to_le32(-1); |
| 142 | btree->u.internal[0].down = na; | 142 | btree->u.internal[0].down = cpu_to_le32(na); |
| 143 | mark_buffer_dirty(bh); | 143 | mark_buffer_dirty(bh); |
| 144 | } else if (!(ranode = hpfs_alloc_anode(s, /*a*/0, &ra, &bh2))) { | 144 | } else if (!(ranode = hpfs_alloc_anode(s, /*a*/0, &ra, &bh2))) { |
| 145 | brelse(bh); | 145 | brelse(bh); |
| @@ -153,15 +153,15 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi | |||
| 153 | btree = &anode->btree; | 153 | btree = &anode->btree; |
| 154 | } | 154 | } |
| 155 | btree->n_free_nodes--; n = btree->n_used_nodes++; | 155 | btree->n_free_nodes--; n = btree->n_used_nodes++; |
| 156 | btree->first_free += 12; | 156 | btree->first_free = cpu_to_le16(le16_to_cpu(btree->first_free) + 12); |
| 157 | btree->u.external[n].disk_secno = se; | 157 | btree->u.external[n].disk_secno = cpu_to_le32(se); |
| 158 | btree->u.external[n].file_secno = fs; | 158 | btree->u.external[n].file_secno = cpu_to_le32(fs); |
| 159 | btree->u.external[n].length = 1; | 159 | btree->u.external[n].length = cpu_to_le32(1); |
| 160 | mark_buffer_dirty(bh); | 160 | mark_buffer_dirty(bh); |
| 161 | brelse(bh); | 161 | brelse(bh); |
| 162 | if ((a == node && fnod) || na == -1) return se; | 162 | if ((a == node && fnod) || na == -1) return se; |
| 163 | c2 = 0; | 163 | c2 = 0; |
| 164 | while (up != -1) { | 164 | while (up != (anode_secno)-1) { |
| 165 | struct anode *new_anode; | 165 | struct anode *new_anode; |
| 166 | if (hpfs_sb(s)->sb_chk) | 166 | if (hpfs_sb(s)->sb_chk) |
| 167 | if (hpfs_stop_cycles(s, up, &c1, &c2, "hpfs_add_sector_to_btree #2")) return -1; | 167 | if (hpfs_stop_cycles(s, up, &c1, &c2, "hpfs_add_sector_to_btree #2")) return -1; |
| @@ -174,47 +174,47 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi | |||
| 174 | } | 174 | } |
| 175 | if (btree->n_free_nodes) { | 175 | if (btree->n_free_nodes) { |
| 176 | btree->n_free_nodes--; n = btree->n_used_nodes++; | 176 | btree->n_free_nodes--; n = btree->n_used_nodes++; |
| 177 | btree->first_free += 8; | 177 | btree->first_free = cpu_to_le16(le16_to_cpu(btree->first_free) + 8); |
| 178 | btree->u.internal[n].file_secno = -1; | 178 | btree->u.internal[n].file_secno = cpu_to_le32(-1); |
| 179 | btree->u.internal[n].down = na; | 179 | btree->u.internal[n].down = cpu_to_le32(na); |
| 180 | btree->u.internal[n-1].file_secno = fs; | 180 | btree->u.internal[n-1].file_secno = cpu_to_le32(fs); |
| 181 | mark_buffer_dirty(bh); | 181 | mark_buffer_dirty(bh); |
| 182 | brelse(bh); | 182 | brelse(bh); |
| 183 | brelse(bh2); | 183 | brelse(bh2); |
| 184 | hpfs_free_sectors(s, ra, 1); | 184 | hpfs_free_sectors(s, ra, 1); |
| 185 | if ((anode = hpfs_map_anode(s, na, &bh))) { | 185 | if ((anode = hpfs_map_anode(s, na, &bh))) { |
| 186 | anode->up = up; | 186 | anode->up = cpu_to_le32(up); |
| 187 | anode->btree.fnode_parent = up == node && fnod; | 187 | anode->btree.fnode_parent = up == node && fnod; |
| 188 | mark_buffer_dirty(bh); | 188 | mark_buffer_dirty(bh); |
| 189 | brelse(bh); | 189 | brelse(bh); |
| 190 | } | 190 | } |
| 191 | return se; | 191 | return se; |
| 192 | } | 192 | } |
| 193 | up = up != node ? anode->up : -1; | 193 | up = up != node ? le32_to_cpu(anode->up) : -1; |
| 194 | btree->u.internal[btree->n_used_nodes - 1].file_secno = /*fs*/-1; | 194 | btree->u.internal[btree->n_used_nodes - 1].file_secno = cpu_to_le32(/*fs*/-1); |
| 195 | mark_buffer_dirty(bh); | 195 | mark_buffer_dirty(bh); |
| 196 | brelse(bh); | 196 | brelse(bh); |
| 197 | a = na; | 197 | a = na; |
| 198 | if ((new_anode = hpfs_alloc_anode(s, a, &na, &bh))) { | 198 | if ((new_anode = hpfs_alloc_anode(s, a, &na, &bh))) { |
| 199 | anode = new_anode; | 199 | anode = new_anode; |
| 200 | /*anode->up = up != -1 ? up : ra;*/ | 200 | /*anode->up = cpu_to_le32(up != -1 ? up : ra);*/ |
| 201 | anode->btree.internal = 1; | 201 | anode->btree.internal = 1; |
| 202 | anode->btree.n_used_nodes = 1; | 202 | anode->btree.n_used_nodes = 1; |
| 203 | anode->btree.n_free_nodes = 59; | 203 | anode->btree.n_free_nodes = 59; |
| 204 | anode->btree.first_free = 16; | 204 | anode->btree.first_free = cpu_to_le16(16); |
| 205 | anode->btree.u.internal[0].down = a; | 205 | anode->btree.u.internal[0].down = cpu_to_le32(a); |
| 206 | anode->btree.u.internal[0].file_secno = -1; | 206 | anode->btree.u.internal[0].file_secno = cpu_to_le32(-1); |
| 207 | mark_buffer_dirty(bh); | 207 | mark_buffer_dirty(bh); |
| 208 | brelse(bh); | 208 | brelse(bh); |
| 209 | if ((anode = hpfs_map_anode(s, a, &bh))) { | 209 | if ((anode = hpfs_map_anode(s, a, &bh))) { |
| 210 | anode->up = na; | 210 | anode->up = cpu_to_le32(na); |
| 211 | mark_buffer_dirty(bh); | 211 | mark_buffer_dirty(bh); |
| 212 | brelse(bh); | 212 | brelse(bh); |
| 213 | } | 213 | } |
| 214 | } else na = a; | 214 | } else na = a; |
| 215 | } | 215 | } |
| 216 | if ((anode = hpfs_map_anode(s, na, &bh))) { | 216 | if ((anode = hpfs_map_anode(s, na, &bh))) { |
| 217 | anode->up = node; | 217 | anode->up = cpu_to_le32(node); |
| 218 | if (fnod) anode->btree.fnode_parent = 1; | 218 | if (fnod) anode->btree.fnode_parent = 1; |
| 219 | mark_buffer_dirty(bh); | 219 | mark_buffer_dirty(bh); |
| 220 | brelse(bh); | 220 | brelse(bh); |
| @@ -232,14 +232,14 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi | |||
| 232 | } | 232 | } |
| 233 | btree = &fnode->btree; | 233 | btree = &fnode->btree; |
| 234 | } | 234 | } |
| 235 | ranode->up = node; | 235 | ranode->up = cpu_to_le32(node); |
| 236 | memcpy(&ranode->btree, btree, btree->first_free); | 236 | memcpy(&ranode->btree, btree, le16_to_cpu(btree->first_free)); |
| 237 | if (fnod) ranode->btree.fnode_parent = 1; | 237 | if (fnod) ranode->btree.fnode_parent = 1; |
| 238 | ranode->btree.n_free_nodes = (ranode->btree.internal ? 60 : 40) - ranode->btree.n_used_nodes; | 238 | ranode->btree.n_free_nodes = (ranode->btree.internal ? 60 : 40) - ranode->btree.n_used_nodes; |
| 239 | if (ranode->btree.internal) for (n = 0; n < ranode->btree.n_used_nodes; n++) { | 239 | if (ranode->btree.internal) for (n = 0; n < ranode->btree.n_used_nodes; n++) { |
| 240 | struct anode *unode; | 240 | struct anode *unode; |
| 241 | if ((unode = hpfs_map_anode(s, ranode->u.internal[n].down, &bh1))) { | 241 | if ((unode = hpfs_map_anode(s, le32_to_cpu(ranode->u.internal[n].down), &bh1))) { |
| 242 | unode->up = ra; | 242 | unode->up = cpu_to_le32(ra); |
| 243 | unode->btree.fnode_parent = 0; | 243 | unode->btree.fnode_parent = 0; |
| 244 | mark_buffer_dirty(bh1); | 244 | mark_buffer_dirty(bh1); |
| 245 | brelse(bh1); | 245 | brelse(bh1); |
| @@ -248,11 +248,11 @@ secno hpfs_add_sector_to_btree(struct super_block *s, secno node, int fnod, unsi | |||
| 248 | btree->internal = 1; | 248 | btree->internal = 1; |
| 249 | btree->n_free_nodes = fnod ? 10 : 58; | 249 | btree->n_free_nodes = fnod ? 10 : 58; |
| 250 | btree->n_used_nodes = 2; | 250 | btree->n_used_nodes = 2; |
| 251 | btree->first_free = (char *)&btree->u.internal[2] - (char *)btree; | 251 | btree->first_free = cpu_to_le16((char *)&btree->u.internal[2] - (char *)btree); |
| 252 | btree->u.internal[0].file_secno = fs; | 252 | btree->u.internal[0].file_secno = cpu_to_le32(fs); |
| 253 | btree->u.internal[0].down = ra; | 253 | btree->u.internal[0].down = cpu_to_le32(ra); |
| 254 | btree->u.internal[1].file_secno = -1; | 254 | btree->u.internal[1].file_secno = cpu_to_le32(-1); |
| 255 | btree->u.internal[1].down = na; | 255 | btree->u.internal[1].down = cpu_to_le32(na); |
| 256 | mark_buffer_dirty(bh); | 256 | mark_buffer_dirty(bh); |
| 257 | brelse(bh); | 257 | brelse(bh); |
| 258 | mark_buffer_dirty(bh2); | 258 | mark_buffer_dirty(bh2); |
| @@ -279,7 +279,7 @@ void hpfs_remove_btree(struct super_block *s, struct bplus_header *btree) | |||
| 279 | go_down: | 279 | go_down: |
| 280 | d2 = 0; | 280 | d2 = 0; |
| 281 | while (btree1->internal) { | 281 | while (btree1->internal) { |
| 282 | ano = btree1->u.internal[pos].down; | 282 | ano = le32_to_cpu(btree1->u.internal[pos].down); |
| 283 | if (level) brelse(bh); | 283 | if (level) brelse(bh); |
| 284 | if (hpfs_sb(s)->sb_chk) | 284 | if (hpfs_sb(s)->sb_chk) |
| 285 | if (hpfs_stop_cycles(s, ano, &d1, &d2, "hpfs_remove_btree #1")) | 285 | if (hpfs_stop_cycles(s, ano, &d1, &d2, "hpfs_remove_btree #1")) |
| @@ -290,7 +290,7 @@ void hpfs_remove_btree(struct super_block *s, struct bplus_header *btree) | |||
| 290 | pos = 0; | 290 | pos = 0; |
| 291 | } | 291 | } |
| 292 | for (i = 0; i < btree1->n_used_nodes; i++) | 292 | for (i = 0; i < btree1->n_used_nodes; i++) |
| 293 | hpfs_free_sectors(s, btree1->u.external[i].disk_secno, btree1->u.external[i].length); | 293 | hpfs_free_sectors(s, le32_to_cpu(btree1->u.external[i].disk_secno), le32_to_cpu(btree1->u.external[i].length)); |
| 294 | go_up: | 294 | go_up: |
| 295 | if (!level) return; | 295 | if (!level) return; |
| 296 | brelse(bh); | 296 | brelse(bh); |
| @@ -298,13 +298,13 @@ void hpfs_remove_btree(struct super_block *s, struct bplus_header *btree) | |||
| 298 | if (hpfs_stop_cycles(s, ano, &c1, &c2, "hpfs_remove_btree #2")) return; | 298 | if (hpfs_stop_cycles(s, ano, &c1, &c2, "hpfs_remove_btree #2")) return; |
| 299 | hpfs_free_sectors(s, ano, 1); | 299 | hpfs_free_sectors(s, ano, 1); |
| 300 | oano = ano; | 300 | oano = ano; |
| 301 | ano = anode->up; | 301 | ano = le32_to_cpu(anode->up); |
| 302 | if (--level) { | 302 | if (--level) { |
| 303 | if (!(anode = hpfs_map_anode(s, ano, &bh))) return; | 303 | if (!(anode = hpfs_map_anode(s, ano, &bh))) return; |
| 304 | btree1 = &anode->btree; | 304 | btree1 = &anode->btree; |
| 305 | } else btree1 = btree; | 305 | } else btree1 = btree; |
| 306 | for (i = 0; i < btree1->n_used_nodes; i++) { | 306 | for (i = 0; i < btree1->n_used_nodes; i++) { |
| 307 | if (btree1->u.internal[i].down == oano) { | 307 | if (le32_to_cpu(btree1->u.internal[i].down) == oano) { |
| 308 | if ((pos = i + 1) < btree1->n_used_nodes) | 308 | if ((pos = i + 1) < btree1->n_used_nodes) |
| 309 | goto go_down; | 309 | goto go_down; |
| 310 | else | 310 | else |
| @@ -411,7 +411,7 @@ void hpfs_truncate_btree(struct super_block *s, secno f, int fno, unsigned secs) | |||
| 411 | if (fno) { | 411 | if (fno) { |
| 412 | btree->n_free_nodes = 8; | 412 | btree->n_free_nodes = 8; |
| 413 | btree->n_used_nodes = 0; | 413 | btree->n_used_nodes = 0; |
| 414 | btree->first_free = 8; | 414 | btree->first_free = cpu_to_le16(8); |
| 415 | btree->internal = 0; | 415 | btree->internal = 0; |
| 416 | mark_buffer_dirty(bh); | 416 | mark_buffer_dirty(bh); |
| 417 | } else hpfs_free_sectors(s, f, 1); | 417 | } else hpfs_free_sectors(s, f, 1); |
| @@ -421,22 +421,22 @@ void hpfs_truncate_btree(struct super_block *s, secno f, int fno, unsigned secs) | |||
| 421 | while (btree->internal) { | 421 | while (btree->internal) { |
| 422 | nodes = btree->n_used_nodes + btree->n_free_nodes; | 422 | nodes = btree->n_used_nodes + btree->n_free_nodes; |
| 423 | for (i = 0; i < btree->n_used_nodes; i++) | 423 | for (i = 0; i < btree->n_used_nodes; i++) |
| 424 | if (btree->u.internal[i].file_secno >= secs) goto f; | 424 | if (le32_to_cpu(btree->u.internal[i].file_secno) >= secs) goto f; |
| 425 | brelse(bh); | 425 | brelse(bh); |
| 426 | hpfs_error(s, "internal btree %08x doesn't end with -1", node); | 426 | hpfs_error(s, "internal btree %08x doesn't end with -1", node); |
| 427 | return; | 427 | return; |
| 428 | f: | 428 | f: |
| 429 | for (j = i + 1; j < btree->n_used_nodes; j++) | 429 | for (j = i + 1; j < btree->n_used_nodes; j++) |
| 430 | hpfs_ea_remove(s, btree->u.internal[j].down, 1, 0); | 430 | hpfs_ea_remove(s, le32_to_cpu(btree->u.internal[j].down), 1, 0); |
| 431 | btree->n_used_nodes = i + 1; | 431 | btree->n_used_nodes = i + 1; |
| 432 | btree->n_free_nodes = nodes - btree->n_used_nodes; | 432 | btree->n_free_nodes = nodes - btree->n_used_nodes; |
| 433 | btree->first_free = 8 + 8 * btree->n_used_nodes; | 433 | btree->first_free = cpu_to_le16(8 + 8 * btree->n_used_nodes); |
| 434 | mark_buffer_dirty(bh); | 434 | mark_buffer_dirty(bh); |
| 435 | if (btree->u.internal[i].file_secno == secs) { | 435 | if (btree->u.internal[i].file_secno == cpu_to_le32(secs)) { |
| 436 | brelse(bh); | 436 | brelse(bh); |
| 437 | return; | 437 | return; |
| 438 | } | 438 | } |
| 439 | node = btree->u.internal[i].down; | 439 | node = le32_to_cpu(btree->u.internal[i].down); |
| 440 | brelse(bh); | 440 | brelse(bh); |
| 441 | if (hpfs_sb(s)->sb_chk) | 441 | if (hpfs_sb(s)->sb_chk) |
| 442 | if (hpfs_stop_cycles(s, node, &c1, &c2, "hpfs_truncate_btree")) | 442 | if (hpfs_stop_cycles(s, node, &c1, &c2, "hpfs_truncate_btree")) |
| @@ -446,25 +446,25 @@ void hpfs_truncate_btree(struct super_block *s, secno f, int fno, unsigned secs) | |||
| 446 | } | 446 | } |
| 447 | nodes = btree->n_used_nodes + btree->n_free_nodes; | 447 | nodes = btree->n_used_nodes + btree->n_free_nodes; |
| 448 | for (i = 0; i < btree->n_used_nodes; i++) | 448 | for (i = 0; i < btree->n_used_nodes; i++) |
| 449 | if (btree->u.external[i].file_secno + btree->u.external[i].length >= secs) goto ff; | 449 | if (le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) >= secs) goto ff; |
| 450 | brelse(bh); | 450 | brelse(bh); |
| 451 | return; | 451 | return; |
| 452 | ff: | 452 | ff: |
| 453 | if (secs <= btree->u.external[i].file_secno) { | 453 | if (secs <= le32_to_cpu(btree->u.external[i].file_secno)) { |
| 454 | hpfs_error(s, "there is an allocation error in file %08x, sector %08x", f, secs); | 454 | hpfs_error(s, "there is an allocation error in file %08x, sector %08x", f, secs); |
| 455 | if (i) i--; | 455 | if (i) i--; |
| 456 | } | 456 | } |
| 457 | else if (btree->u.external[i].file_secno + btree->u.external[i].length > secs) { | 457 | else if (le32_to_cpu(btree->u.external[i].file_secno) + le32_to_cpu(btree->u.external[i].length) > secs) { |
| 458 | hpfs_free_sectors(s, btree->u.external[i].disk_secno + secs - | 458 | hpfs_free_sectors(s, le32_to_cpu(btree->u.external[i].disk_secno) + secs - |
| 459 | btree->u.external[i].file_secno, btree->u.external[i].length | 459 | le32_to_cpu(btree->u.external[i].file_secno), le32_to_cpu(btree->u.external[i].length) |
| 460 | - secs + btree->u.external[i].file_secno); /* I hope gcc optimizes this :-) */ | 460 | - secs + le32_to_cpu(btree->u.external[i].file_secno)); /* I hope gcc optimizes this :-) */ |
| 461 | btree->u.external[i].length = secs - btree->u.external[i].file_secno; | 461 | btree->u.external[i].length = cpu_to_le32(secs - le32_to_cpu(btree->u.external[i].file_secno)); |
| 462 | } | 462 | } |
| 463 | for (j = i + 1; j < btree->n_used_nodes; j++) | 463 | for (j = i + 1; j < btree->n_used_nodes; j++) |
| 464 | hpfs_free_sectors(s, btree->u.external[j].disk_secno, btree->u.external[j].length); | 464 | hpfs_free_sectors(s, le32_to_cpu(btree->u.external[j].disk_secno), le32_to_cpu(btree->u.external[j].length)); |
| 465 | btree->n_used_nodes = i + 1; | 465 | btree->n_used_nodes = i + 1; |
| 466 | btree->n_free_nodes = nodes - btree->n_used_nodes; | 466 | btree->n_free_nodes = nodes - btree->n_used_nodes; |
| 467 | btree->first_free = 8 + 12 * btree->n_used_nodes; | 467 | btree->first_free = cpu_to_le16(8 + 12 * btree->n_used_nodes); |
| 468 | mark_buffer_dirty(bh); | 468 | mark_buffer_dirty(bh); |
| 469 | brelse(bh); | 469 | brelse(bh); |
| 470 | } | 470 | } |
| @@ -480,12 +480,12 @@ void hpfs_remove_fnode(struct super_block *s, fnode_secno fno) | |||
| 480 | struct extended_attribute *ea_end; | 480 | struct extended_attribute *ea_end; |
| 481 | if (!(fnode = hpfs_map_fnode(s, fno, &bh))) return; | 481 | if (!(fnode = hpfs_map_fnode(s, fno, &bh))) return; |
| 482 | if (!fnode->dirflag) hpfs_remove_btree(s, &fnode->btree); | 482 | if (!fnode->dirflag) hpfs_remove_btree(s, &fnode->btree); |
| 483 | else hpfs_remove_dtree(s, fnode->u.external[0].disk_secno); | 483 | else hpfs_remove_dtree(s, le32_to_cpu(fnode->u.external[0].disk_secno)); |
| 484 | ea_end = fnode_end_ea(fnode); | 484 | ea_end = fnode_end_ea(fnode); |
| 485 | for (ea = fnode_ea(fnode); ea < ea_end; ea = next_ea(ea)) | 485 | for (ea = fnode_ea(fnode); ea < ea_end; ea = next_ea(ea)) |
| 486 | if (ea->indirect) | 486 | if (ea->indirect) |
| 487 | hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); | 487 | hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); |
| 488 | hpfs_ea_ext_remove(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l); | 488 | hpfs_ea_ext_remove(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l)); |
| 489 | brelse(bh); | 489 | brelse(bh); |
| 490 | hpfs_free_sectors(s, fno, 1); | 490 | hpfs_free_sectors(s, fno, 1); |
| 491 | } | 491 | } |
diff --git a/fs/hpfs/buffer.c b/fs/hpfs/buffer.c index 793cb9d943d2..9ecde27d1e29 100644 --- a/fs/hpfs/buffer.c +++ b/fs/hpfs/buffer.c | |||
| @@ -9,22 +9,6 @@ | |||
| 9 | #include <linux/slab.h> | 9 | #include <linux/slab.h> |
| 10 | #include "hpfs_fn.h" | 10 | #include "hpfs_fn.h" |
| 11 | 11 | ||
| 12 | void hpfs_lock_creation(struct super_block *s) | ||
| 13 | { | ||
| 14 | #ifdef DEBUG_LOCKS | ||
| 15 | printk("lock creation\n"); | ||
| 16 | #endif | ||
| 17 | mutex_lock(&hpfs_sb(s)->hpfs_creation_de); | ||
| 18 | } | ||
| 19 | |||
| 20 | void hpfs_unlock_creation(struct super_block *s) | ||
| 21 | { | ||
| 22 | #ifdef DEBUG_LOCKS | ||
| 23 | printk("unlock creation\n"); | ||
| 24 | #endif | ||
| 25 | mutex_unlock(&hpfs_sb(s)->hpfs_creation_de); | ||
| 26 | } | ||
| 27 | |||
| 28 | /* Map a sector into a buffer and return pointers to it and to the buffer. */ | 12 | /* Map a sector into a buffer and return pointers to it and to the buffer. */ |
| 29 | 13 | ||
| 30 | void *hpfs_map_sector(struct super_block *s, unsigned secno, struct buffer_head **bhp, | 14 | void *hpfs_map_sector(struct super_block *s, unsigned secno, struct buffer_head **bhp, |
| @@ -32,6 +16,8 @@ void *hpfs_map_sector(struct super_block *s, unsigned secno, struct buffer_head | |||
| 32 | { | 16 | { |
| 33 | struct buffer_head *bh; | 17 | struct buffer_head *bh; |
| 34 | 18 | ||
| 19 | hpfs_lock_assert(s); | ||
| 20 | |||
| 35 | cond_resched(); | 21 | cond_resched(); |
| 36 | 22 | ||
| 37 | *bhp = bh = sb_bread(s, secno); | 23 | *bhp = bh = sb_bread(s, secno); |
| @@ -50,6 +36,8 @@ void *hpfs_get_sector(struct super_block *s, unsigned secno, struct buffer_head | |||
| 50 | struct buffer_head *bh; | 36 | struct buffer_head *bh; |
| 51 | /*return hpfs_map_sector(s, secno, bhp, 0);*/ | 37 | /*return hpfs_map_sector(s, secno, bhp, 0);*/ |
| 52 | 38 | ||
| 39 | hpfs_lock_assert(s); | ||
| 40 | |||
| 53 | cond_resched(); | 41 | cond_resched(); |
| 54 | 42 | ||
| 55 | if ((*bhp = bh = sb_getblk(s, secno)) != NULL) { | 43 | if ((*bhp = bh = sb_getblk(s, secno)) != NULL) { |
| @@ -70,6 +58,8 @@ void *hpfs_map_4sectors(struct super_block *s, unsigned secno, struct quad_buffe | |||
| 70 | struct buffer_head *bh; | 58 | struct buffer_head *bh; |
| 71 | char *data; | 59 | char *data; |
| 72 | 60 | ||
| 61 | hpfs_lock_assert(s); | ||
| 62 | |||
| 73 | cond_resched(); | 63 | cond_resched(); |
| 74 | 64 | ||
| 75 | if (secno & 3) { | 65 | if (secno & 3) { |
| @@ -125,6 +115,8 @@ void *hpfs_get_4sectors(struct super_block *s, unsigned secno, | |||
| 125 | { | 115 | { |
| 126 | cond_resched(); | 116 | cond_resched(); |
| 127 | 117 | ||
| 118 | hpfs_lock_assert(s); | ||
| 119 | |||
| 128 | if (secno & 3) { | 120 | if (secno & 3) { |
| 129 | printk("HPFS: hpfs_get_4sectors: unaligned read\n"); | 121 | printk("HPFS: hpfs_get_4sectors: unaligned read\n"); |
| 130 | return NULL; | 122 | return NULL; |
diff --git a/fs/hpfs/dir.c b/fs/hpfs/dir.c index b3d7c0ddb609..f46ae025bfb5 100644 --- a/fs/hpfs/dir.c +++ b/fs/hpfs/dir.c | |||
| @@ -88,9 +88,9 @@ static int hpfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 88 | hpfs_error(inode->i_sb, "not a directory, fnode %08lx", | 88 | hpfs_error(inode->i_sb, "not a directory, fnode %08lx", |
| 89 | (unsigned long)inode->i_ino); | 89 | (unsigned long)inode->i_ino); |
| 90 | } | 90 | } |
| 91 | if (hpfs_inode->i_dno != fno->u.external[0].disk_secno) { | 91 | if (hpfs_inode->i_dno != le32_to_cpu(fno->u.external[0].disk_secno)) { |
| 92 | e = 1; | 92 | e = 1; |
| 93 | hpfs_error(inode->i_sb, "corrupted inode: i_dno == %08x, fnode -> dnode == %08x", hpfs_inode->i_dno, fno->u.external[0].disk_secno); | 93 | hpfs_error(inode->i_sb, "corrupted inode: i_dno == %08x, fnode -> dnode == %08x", hpfs_inode->i_dno, le32_to_cpu(fno->u.external[0].disk_secno)); |
| 94 | } | 94 | } |
| 95 | brelse(bh); | 95 | brelse(bh); |
| 96 | if (e) { | 96 | if (e) { |
| @@ -156,7 +156,7 @@ static int hpfs_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
| 156 | goto again; | 156 | goto again; |
| 157 | } | 157 | } |
| 158 | tempname = hpfs_translate_name(inode->i_sb, de->name, de->namelen, lc, de->not_8x3); | 158 | tempname = hpfs_translate_name(inode->i_sb, de->name, de->namelen, lc, de->not_8x3); |
| 159 | if (filldir(dirent, tempname, de->namelen, old_pos, de->fnode, DT_UNKNOWN) < 0) { | 159 | if (filldir(dirent, tempname, de->namelen, old_pos, le32_to_cpu(de->fnode), DT_UNKNOWN) < 0) { |
| 160 | filp->f_pos = old_pos; | 160 | filp->f_pos = old_pos; |
| 161 | if (tempname != de->name) kfree(tempname); | 161 | if (tempname != de->name) kfree(tempname); |
| 162 | hpfs_brelse4(&qbh); | 162 | hpfs_brelse4(&qbh); |
| @@ -221,7 +221,7 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct name | |||
| 221 | * Get inode number, what we're after. | 221 | * Get inode number, what we're after. |
| 222 | */ | 222 | */ |
| 223 | 223 | ||
| 224 | ino = de->fnode; | 224 | ino = le32_to_cpu(de->fnode); |
| 225 | 225 | ||
| 226 | /* | 226 | /* |
| 227 | * Go find or make an inode. | 227 | * Go find or make an inode. |
| @@ -236,7 +236,7 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct name | |||
| 236 | hpfs_init_inode(result); | 236 | hpfs_init_inode(result); |
| 237 | if (de->directory) | 237 | if (de->directory) |
| 238 | hpfs_read_inode(result); | 238 | hpfs_read_inode(result); |
| 239 | else if (de->ea_size && hpfs_sb(dir->i_sb)->sb_eas) | 239 | else if (le32_to_cpu(de->ea_size) && hpfs_sb(dir->i_sb)->sb_eas) |
| 240 | hpfs_read_inode(result); | 240 | hpfs_read_inode(result); |
| 241 | else { | 241 | else { |
| 242 | result->i_mode |= S_IFREG; | 242 | result->i_mode |= S_IFREG; |
| @@ -250,8 +250,6 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct name | |||
| 250 | hpfs_result = hpfs_i(result); | 250 | hpfs_result = hpfs_i(result); |
| 251 | if (!de->directory) hpfs_result->i_parent_dir = dir->i_ino; | 251 | if (!de->directory) hpfs_result->i_parent_dir = dir->i_ino; |
| 252 | 252 | ||
| 253 | hpfs_decide_conv(result, name, len); | ||
| 254 | |||
| 255 | if (de->has_acl || de->has_xtd_perm) if (!(dir->i_sb->s_flags & MS_RDONLY)) { | 253 | if (de->has_acl || de->has_xtd_perm) if (!(dir->i_sb->s_flags & MS_RDONLY)) { |
| 256 | hpfs_error(result->i_sb, "ACLs or XPERM found. This is probably HPFS386. This driver doesn't support it now. Send me some info on these structures"); | 254 | hpfs_error(result->i_sb, "ACLs or XPERM found. This is probably HPFS386. This driver doesn't support it now. Send me some info on these structures"); |
| 257 | goto bail1; | 255 | goto bail1; |
| @@ -263,19 +261,19 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, struct name | |||
| 263 | */ | 261 | */ |
| 264 | 262 | ||
| 265 | if (!result->i_ctime.tv_sec) { | 263 | if (!result->i_ctime.tv_sec) { |
| 266 | if (!(result->i_ctime.tv_sec = local_to_gmt(dir->i_sb, de->creation_date))) | 264 | if (!(result->i_ctime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->creation_date)))) |
| 267 | result->i_ctime.tv_sec = 1; | 265 | result->i_ctime.tv_sec = 1; |
| 268 | result->i_ctime.tv_nsec = 0; | 266 | result->i_ctime.tv_nsec = 0; |
| 269 | result->i_mtime.tv_sec = local_to_gmt(dir->i_sb, de->write_date); | 267 | result->i_mtime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->write_date)); |
| 270 | result->i_mtime.tv_nsec = 0; | 268 | result->i_mtime.tv_nsec = 0; |
| 271 | result->i_atime.tv_sec = local_to_gmt(dir->i_sb, de->read_date); | 269 | result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(de->read_date)); |
| 272 | result->i_atime.tv_nsec = 0; | 270 | result->i_atime.tv_nsec = 0; |
| 273 | hpfs_result->i_ea_size = de->ea_size; | 271 | hpfs_result->i_ea_size = le32_to_cpu(de->ea_size); |
| 274 | if (!hpfs_result->i_ea_mode && de->read_only) | 272 | if (!hpfs_result->i_ea_mode && de->read_only) |
| 275 | result->i_mode &= ~0222; | 273 | result->i_mode &= ~0222; |
| 276 | if (!de->directory) { | 274 | if (!de->directory) { |
| 277 | if (result->i_size == -1) { | 275 | if (result->i_size == -1) { |
| 278 | result->i_size = de->file_size; | 276 | result->i_size = le32_to_cpu(de->file_size); |
| 279 | result->i_data.a_ops = &hpfs_aops; | 277 | result->i_data.a_ops = &hpfs_aops; |
| 280 | hpfs_i(result)->mmu_private = result->i_size; | 278 | hpfs_i(result)->mmu_private = result->i_size; |
| 281 | /* | 279 | /* |
diff --git a/fs/hpfs/dnode.c b/fs/hpfs/dnode.c index 9b2ffadfc8c4..1e0e2ac30fd3 100644 --- a/fs/hpfs/dnode.c +++ b/fs/hpfs/dnode.c | |||
| @@ -14,11 +14,11 @@ static loff_t get_pos(struct dnode *d, struct hpfs_dirent *fde) | |||
| 14 | struct hpfs_dirent *de_end = dnode_end_de(d); | 14 | struct hpfs_dirent *de_end = dnode_end_de(d); |
| 15 | int i = 1; | 15 | int i = 1; |
| 16 | for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { | 16 | for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { |
| 17 | if (de == fde) return ((loff_t) d->self << 4) | (loff_t)i; | 17 | if (de == fde) return ((loff_t) le32_to_cpu(d->self) << 4) | (loff_t)i; |
| 18 | i++; | 18 | i++; |
| 19 | } | 19 | } |
| 20 | printk("HPFS: get_pos: not_found\n"); | 20 | printk("HPFS: get_pos: not_found\n"); |
| 21 | return ((loff_t)d->self << 4) | (loff_t)1; | 21 | return ((loff_t)le32_to_cpu(d->self) << 4) | (loff_t)1; |
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | void hpfs_add_pos(struct inode *inode, loff_t *pos) | 24 | void hpfs_add_pos(struct inode *inode, loff_t *pos) |
| @@ -130,29 +130,30 @@ static void set_last_pointer(struct super_block *s, struct dnode *d, dnode_secno | |||
| 130 | { | 130 | { |
| 131 | struct hpfs_dirent *de; | 131 | struct hpfs_dirent *de; |
| 132 | if (!(de = dnode_last_de(d))) { | 132 | if (!(de = dnode_last_de(d))) { |
| 133 | hpfs_error(s, "set_last_pointer: empty dnode %08x", d->self); | 133 | hpfs_error(s, "set_last_pointer: empty dnode %08x", le32_to_cpu(d->self)); |
| 134 | return; | 134 | return; |
| 135 | } | 135 | } |
| 136 | if (hpfs_sb(s)->sb_chk) { | 136 | if (hpfs_sb(s)->sb_chk) { |
| 137 | if (de->down) { | 137 | if (de->down) { |
| 138 | hpfs_error(s, "set_last_pointer: dnode %08x has already last pointer %08x", | 138 | hpfs_error(s, "set_last_pointer: dnode %08x has already last pointer %08x", |
| 139 | d->self, de_down_pointer(de)); | 139 | le32_to_cpu(d->self), de_down_pointer(de)); |
| 140 | return; | 140 | return; |
| 141 | } | 141 | } |
| 142 | if (de->length != 32) { | 142 | if (le16_to_cpu(de->length) != 32) { |
| 143 | hpfs_error(s, "set_last_pointer: bad last dirent in dnode %08x", d->self); | 143 | hpfs_error(s, "set_last_pointer: bad last dirent in dnode %08x", le32_to_cpu(d->self)); |
| 144 | return; | 144 | return; |
| 145 | } | 145 | } |
| 146 | } | 146 | } |
| 147 | if (ptr) { | 147 | if (ptr) { |
| 148 | if ((d->first_free += 4) > 2048) { | 148 | d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) + 4); |
| 149 | hpfs_error(s,"set_last_pointer: too long dnode %08x", d->self); | 149 | if (le32_to_cpu(d->first_free) > 2048) { |
| 150 | d->first_free -= 4; | 150 | hpfs_error(s, "set_last_pointer: too long dnode %08x", le32_to_cpu(d->self)); |
| 151 | d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - 4); | ||
| 151 | return; | 152 | return; |
| 152 | } | 153 | } |
| 153 | de->length = 36; | 154 | de->length = cpu_to_le16(36); |
| 154 | de->down = 1; | 155 | de->down = 1; |
| 155 | *(dnode_secno *)((char *)de + 32) = ptr; | 156 | *(dnode_secno *)((char *)de + 32) = cpu_to_le32(ptr); |
| 156 | } | 157 | } |
| 157 | } | 158 | } |
| 158 | 159 | ||
| @@ -168,7 +169,7 @@ struct hpfs_dirent *hpfs_add_de(struct super_block *s, struct dnode *d, | |||
| 168 | for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { | 169 | for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) { |
| 169 | int c = hpfs_compare_names(s, name, namelen, de->name, de->namelen, de->last); | 170 | int c = hpfs_compare_names(s, name, namelen, de->name, de->namelen, de->last); |
| 170 | if (!c) { | 171 | if (!c) { |
| 171 | hpfs_error(s, "name (%c,%d) already exists in dnode %08x", *name, namelen, d->self); | 172 | hpfs_error(s, "name (%c,%d) already exists in dnode %08x", *name, namelen, le32_to_cpu(d->self)); |
| 172 | return NULL; | 173 | return NULL; |
| 173 | } | 174 | } |
| 174 | if (c < 0) break; | 175 | if (c < 0) break; |
| @@ -176,15 +177,14 @@ struct hpfs_dirent *hpfs_add_de(struct super_block *s, struct dnode *d, | |||
| 176 | memmove((char *)de + d_size, de, (char *)de_end - (char *)de); | 177 | memmove((char *)de + d_size, de, (char *)de_end - (char *)de); |
| 177 | memset(de, 0, d_size); | 178 | memset(de, 0, d_size); |
| 178 | if (down_ptr) { | 179 | if (down_ptr) { |
| 179 | *(int *)((char *)de + d_size - 4) = down_ptr; | 180 | *(dnode_secno *)((char *)de + d_size - 4) = cpu_to_le32(down_ptr); |
| 180 | de->down = 1; | 181 | de->down = 1; |
| 181 | } | 182 | } |
| 182 | de->length = d_size; | 183 | de->length = cpu_to_le16(d_size); |
| 183 | if (down_ptr) de->down = 1; | ||
| 184 | de->not_8x3 = hpfs_is_name_long(name, namelen); | 184 | de->not_8x3 = hpfs_is_name_long(name, namelen); |
| 185 | de->namelen = namelen; | 185 | de->namelen = namelen; |
| 186 | memcpy(de->name, name, namelen); | 186 | memcpy(de->name, name, namelen); |
| 187 | d->first_free += d_size; | 187 | d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) + d_size); |
| 188 | return de; | 188 | return de; |
| 189 | } | 189 | } |
| 190 | 190 | ||
| @@ -194,25 +194,25 @@ static void hpfs_delete_de(struct super_block *s, struct dnode *d, | |||
| 194 | struct hpfs_dirent *de) | 194 | struct hpfs_dirent *de) |
| 195 | { | 195 | { |
| 196 | if (de->last) { | 196 | if (de->last) { |
| 197 | hpfs_error(s, "attempt to delete last dirent in dnode %08x", d->self); | 197 | hpfs_error(s, "attempt to delete last dirent in dnode %08x", le32_to_cpu(d->self)); |
| 198 | return; | 198 | return; |
| 199 | } | 199 | } |
| 200 | d->first_free -= de->length; | 200 | d->first_free = cpu_to_le32(le32_to_cpu(d->first_free) - le16_to_cpu(de->length)); |
| 201 | memmove(de, de_next_de(de), d->first_free + (char *)d - (char *)de); | 201 | memmove(de, de_next_de(de), le32_to_cpu(d->first_free) + (char *)d - (char *)de); |
| 202 | } | 202 | } |
| 203 | 203 | ||
| 204 | static void fix_up_ptrs(struct super_block *s, struct dnode *d) | 204 | static void fix_up_ptrs(struct super_block *s, struct dnode *d) |
| 205 | { | 205 | { |
| 206 | struct hpfs_dirent *de; | 206 | struct hpfs_dirent *de; |
| 207 | struct hpfs_dirent *de_end = dnode_end_de(d); | 207 | struct hpfs_dirent *de_end = dnode_end_de(d); |
| 208 | dnode_secno dno = d->self; | 208 | dnode_secno dno = le32_to_cpu(d->self); |
| 209 | for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) | 209 | for (de = dnode_first_de(d); de < de_end; de = de_next_de(de)) |
| 210 | if (de->down) { | 210 | if (de->down) { |
| 211 | struct quad_buffer_head qbh; | 211 | struct quad_buffer_head qbh; |
| 212 | struct dnode *dd; | 212 | struct dnode *dd; |
| 213 | if ((dd = hpfs_map_dnode(s, de_down_pointer(de), &qbh))) { | 213 | if ((dd = hpfs_map_dnode(s, de_down_pointer(de), &qbh))) { |
| 214 | if (dd->up != dno || dd->root_dnode) { | 214 | if (le32_to_cpu(dd->up) != dno || dd->root_dnode) { |
| 215 | dd->up = dno; | 215 | dd->up = cpu_to_le32(dno); |
| 216 | dd->root_dnode = 0; | 216 | dd->root_dnode = 0; |
| 217 | hpfs_mark_4buffers_dirty(&qbh); | 217 | hpfs_mark_4buffers_dirty(&qbh); |
| 218 | } | 218 | } |
| @@ -262,7 +262,7 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
| 262 | kfree(nname); | 262 | kfree(nname); |
| 263 | return 1; | 263 | return 1; |
| 264 | } | 264 | } |
| 265 | if (d->first_free + de_size(namelen, down_ptr) <= 2048) { | 265 | if (le32_to_cpu(d->first_free) + de_size(namelen, down_ptr) <= 2048) { |
| 266 | loff_t t; | 266 | loff_t t; |
| 267 | copy_de(de=hpfs_add_de(i->i_sb, d, name, namelen, down_ptr), new_de); | 267 | copy_de(de=hpfs_add_de(i->i_sb, d, name, namelen, down_ptr), new_de); |
| 268 | t = get_pos(d, de); | 268 | t = get_pos(d, de); |
| @@ -286,11 +286,11 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
| 286 | kfree(nname); | 286 | kfree(nname); |
| 287 | return 1; | 287 | return 1; |
| 288 | } | 288 | } |
| 289 | memcpy(nd, d, d->first_free); | 289 | memcpy(nd, d, le32_to_cpu(d->first_free)); |
| 290 | copy_de(de = hpfs_add_de(i->i_sb, nd, name, namelen, down_ptr), new_de); | 290 | copy_de(de = hpfs_add_de(i->i_sb, nd, name, namelen, down_ptr), new_de); |
| 291 | for_all_poss(i, hpfs_pos_ins, get_pos(nd, de), 1); | 291 | for_all_poss(i, hpfs_pos_ins, get_pos(nd, de), 1); |
| 292 | h = ((char *)dnode_last_de(nd) - (char *)nd) / 2 + 10; | 292 | h = ((char *)dnode_last_de(nd) - (char *)nd) / 2 + 10; |
| 293 | if (!(ad = hpfs_alloc_dnode(i->i_sb, d->up, &adno, &qbh1, 0))) { | 293 | if (!(ad = hpfs_alloc_dnode(i->i_sb, le32_to_cpu(d->up), &adno, &qbh1))) { |
| 294 | hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); | 294 | hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); |
| 295 | hpfs_brelse4(&qbh); | 295 | hpfs_brelse4(&qbh); |
| 296 | kfree(nd); | 296 | kfree(nd); |
| @@ -313,20 +313,21 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
| 313 | down_ptr = adno; | 313 | down_ptr = adno; |
| 314 | set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0); | 314 | set_last_pointer(i->i_sb, ad, de->down ? de_down_pointer(de) : 0); |
| 315 | de = de_next_de(de); | 315 | de = de_next_de(de); |
| 316 | memmove((char *)nd + 20, de, nd->first_free + (char *)nd - (char *)de); | 316 | memmove((char *)nd + 20, de, le32_to_cpu(nd->first_free) + (char *)nd - (char *)de); |
| 317 | nd->first_free -= (char *)de - (char *)nd - 20; | 317 | nd->first_free = cpu_to_le32(le32_to_cpu(nd->first_free) - ((char *)de - (char *)nd - 20)); |
| 318 | memcpy(d, nd, nd->first_free); | 318 | memcpy(d, nd, le32_to_cpu(nd->first_free)); |
| 319 | for_all_poss(i, hpfs_pos_del, (loff_t)dno << 4, pos); | 319 | for_all_poss(i, hpfs_pos_del, (loff_t)dno << 4, pos); |
| 320 | fix_up_ptrs(i->i_sb, ad); | 320 | fix_up_ptrs(i->i_sb, ad); |
| 321 | if (!d->root_dnode) { | 321 | if (!d->root_dnode) { |
| 322 | dno = ad->up = d->up; | 322 | ad->up = d->up; |
| 323 | dno = le32_to_cpu(ad->up); | ||
| 323 | hpfs_mark_4buffers_dirty(&qbh); | 324 | hpfs_mark_4buffers_dirty(&qbh); |
| 324 | hpfs_brelse4(&qbh); | 325 | hpfs_brelse4(&qbh); |
| 325 | hpfs_mark_4buffers_dirty(&qbh1); | 326 | hpfs_mark_4buffers_dirty(&qbh1); |
| 326 | hpfs_brelse4(&qbh1); | 327 | hpfs_brelse4(&qbh1); |
| 327 | goto go_up; | 328 | goto go_up; |
| 328 | } | 329 | } |
| 329 | if (!(rd = hpfs_alloc_dnode(i->i_sb, d->up, &rdno, &qbh2, 0))) { | 330 | if (!(rd = hpfs_alloc_dnode(i->i_sb, le32_to_cpu(d->up), &rdno, &qbh2))) { |
| 330 | hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); | 331 | hpfs_error(i->i_sb, "unable to alloc dnode - dnode tree will be corrupted"); |
| 331 | hpfs_brelse4(&qbh); | 332 | hpfs_brelse4(&qbh); |
| 332 | hpfs_brelse4(&qbh1); | 333 | hpfs_brelse4(&qbh1); |
| @@ -338,7 +339,7 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
| 338 | i->i_blocks += 4; | 339 | i->i_blocks += 4; |
| 339 | rd->root_dnode = 1; | 340 | rd->root_dnode = 1; |
| 340 | rd->up = d->up; | 341 | rd->up = d->up; |
| 341 | if (!(fnode = hpfs_map_fnode(i->i_sb, d->up, &bh))) { | 342 | if (!(fnode = hpfs_map_fnode(i->i_sb, le32_to_cpu(d->up), &bh))) { |
| 342 | hpfs_free_dnode(i->i_sb, rdno); | 343 | hpfs_free_dnode(i->i_sb, rdno); |
| 343 | hpfs_brelse4(&qbh); | 344 | hpfs_brelse4(&qbh); |
| 344 | hpfs_brelse4(&qbh1); | 345 | hpfs_brelse4(&qbh1); |
| @@ -347,10 +348,11 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
| 347 | kfree(nname); | 348 | kfree(nname); |
| 348 | return 1; | 349 | return 1; |
| 349 | } | 350 | } |
| 350 | fnode->u.external[0].disk_secno = rdno; | 351 | fnode->u.external[0].disk_secno = cpu_to_le32(rdno); |
| 351 | mark_buffer_dirty(bh); | 352 | mark_buffer_dirty(bh); |
| 352 | brelse(bh); | 353 | brelse(bh); |
| 353 | d->up = ad->up = hpfs_i(i)->i_dno = rdno; | 354 | hpfs_i(i)->i_dno = rdno; |
| 355 | d->up = ad->up = cpu_to_le32(rdno); | ||
| 354 | d->root_dnode = ad->root_dnode = 0; | 356 | d->root_dnode = ad->root_dnode = 0; |
| 355 | hpfs_mark_4buffers_dirty(&qbh); | 357 | hpfs_mark_4buffers_dirty(&qbh); |
| 356 | hpfs_brelse4(&qbh); | 358 | hpfs_brelse4(&qbh); |
| @@ -373,7 +375,7 @@ static int hpfs_add_to_dnode(struct inode *i, dnode_secno dno, | |||
| 373 | 375 | ||
| 374 | int hpfs_add_dirent(struct inode *i, | 376 | int hpfs_add_dirent(struct inode *i, |
| 375 | const unsigned char *name, unsigned namelen, | 377 | const unsigned char *name, unsigned namelen, |
| 376 | struct hpfs_dirent *new_de, int cdepth) | 378 | struct hpfs_dirent *new_de) |
| 377 | { | 379 | { |
| 378 | struct hpfs_inode_info *hpfs_inode = hpfs_i(i); | 380 | struct hpfs_inode_info *hpfs_inode = hpfs_i(i); |
| 379 | struct dnode *d; | 381 | struct dnode *d; |
| @@ -403,7 +405,6 @@ int hpfs_add_dirent(struct inode *i, | |||
| 403 | } | 405 | } |
| 404 | } | 406 | } |
| 405 | hpfs_brelse4(&qbh); | 407 | hpfs_brelse4(&qbh); |
| 406 | if (!cdepth) hpfs_lock_creation(i->i_sb); | ||
| 407 | if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_ADD)) { | 408 | if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_ADD)) { |
| 408 | c = 1; | 409 | c = 1; |
| 409 | goto ret; | 410 | goto ret; |
| @@ -411,7 +412,6 @@ int hpfs_add_dirent(struct inode *i, | |||
| 411 | i->i_version++; | 412 | i->i_version++; |
| 412 | c = hpfs_add_to_dnode(i, dno, name, namelen, new_de, 0); | 413 | c = hpfs_add_to_dnode(i, dno, name, namelen, new_de, 0); |
| 413 | ret: | 414 | ret: |
| 414 | if (!cdepth) hpfs_unlock_creation(i->i_sb); | ||
| 415 | return c; | 415 | return c; |
| 416 | } | 416 | } |
| 417 | 417 | ||
| @@ -437,9 +437,9 @@ static secno move_to_top(struct inode *i, dnode_secno from, dnode_secno to) | |||
| 437 | return 0; | 437 | return 0; |
| 438 | if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 0; | 438 | if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return 0; |
| 439 | if (hpfs_sb(i->i_sb)->sb_chk) { | 439 | if (hpfs_sb(i->i_sb)->sb_chk) { |
| 440 | if (dnode->up != chk_up) { | 440 | if (le32_to_cpu(dnode->up) != chk_up) { |
| 441 | hpfs_error(i->i_sb, "move_to_top: up pointer from %08x should be %08x, is %08x", | 441 | hpfs_error(i->i_sb, "move_to_top: up pointer from %08x should be %08x, is %08x", |
| 442 | dno, chk_up, dnode->up); | 442 | dno, chk_up, le32_to_cpu(dnode->up)); |
| 443 | hpfs_brelse4(&qbh); | 443 | hpfs_brelse4(&qbh); |
| 444 | return 0; | 444 | return 0; |
| 445 | } | 445 | } |
| @@ -455,7 +455,7 @@ static secno move_to_top(struct inode *i, dnode_secno from, dnode_secno to) | |||
| 455 | hpfs_brelse4(&qbh); | 455 | hpfs_brelse4(&qbh); |
| 456 | } | 456 | } |
| 457 | while (!(de = dnode_pre_last_de(dnode))) { | 457 | while (!(de = dnode_pre_last_de(dnode))) { |
| 458 | dnode_secno up = dnode->up; | 458 | dnode_secno up = le32_to_cpu(dnode->up); |
| 459 | hpfs_brelse4(&qbh); | 459 | hpfs_brelse4(&qbh); |
| 460 | hpfs_free_dnode(i->i_sb, dno); | 460 | hpfs_free_dnode(i->i_sb, dno); |
| 461 | i->i_size -= 2048; | 461 | i->i_size -= 2048; |
| @@ -474,8 +474,8 @@ static secno move_to_top(struct inode *i, dnode_secno from, dnode_secno to) | |||
| 474 | hpfs_brelse4(&qbh); | 474 | hpfs_brelse4(&qbh); |
| 475 | return 0; | 475 | return 0; |
| 476 | } | 476 | } |
| 477 | dnode->first_free -= 4; | 477 | dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) - 4); |
| 478 | de->length -= 4; | 478 | de->length = cpu_to_le16(le16_to_cpu(de->length) - 4); |
| 479 | de->down = 0; | 479 | de->down = 0; |
| 480 | hpfs_mark_4buffers_dirty(&qbh); | 480 | hpfs_mark_4buffers_dirty(&qbh); |
| 481 | dno = up; | 481 | dno = up; |
| @@ -483,12 +483,12 @@ static secno move_to_top(struct inode *i, dnode_secno from, dnode_secno to) | |||
| 483 | t = get_pos(dnode, de); | 483 | t = get_pos(dnode, de); |
| 484 | for_all_poss(i, hpfs_pos_subst, t, 4); | 484 | for_all_poss(i, hpfs_pos_subst, t, 4); |
| 485 | for_all_poss(i, hpfs_pos_subst, t + 1, 5); | 485 | for_all_poss(i, hpfs_pos_subst, t + 1, 5); |
| 486 | if (!(nde = kmalloc(de->length, GFP_NOFS))) { | 486 | if (!(nde = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) { |
| 487 | hpfs_error(i->i_sb, "out of memory for dirent - directory will be corrupted"); | 487 | hpfs_error(i->i_sb, "out of memory for dirent - directory will be corrupted"); |
| 488 | hpfs_brelse4(&qbh); | 488 | hpfs_brelse4(&qbh); |
| 489 | return 0; | 489 | return 0; |
| 490 | } | 490 | } |
| 491 | memcpy(nde, de, de->length); | 491 | memcpy(nde, de, le16_to_cpu(de->length)); |
| 492 | ddno = de->down ? de_down_pointer(de) : 0; | 492 | ddno = de->down ? de_down_pointer(de) : 0; |
| 493 | hpfs_delete_de(i->i_sb, dnode, de); | 493 | hpfs_delete_de(i->i_sb, dnode, de); |
| 494 | set_last_pointer(i->i_sb, dnode, ddno); | 494 | set_last_pointer(i->i_sb, dnode, ddno); |
| @@ -517,11 +517,11 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno) | |||
| 517 | try_it_again: | 517 | try_it_again: |
| 518 | if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "delete_empty_dnode")) return; | 518 | if (hpfs_stop_cycles(i->i_sb, dno, &c1, &c2, "delete_empty_dnode")) return; |
| 519 | if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return; | 519 | if (!(dnode = hpfs_map_dnode(i->i_sb, dno, &qbh))) return; |
| 520 | if (dnode->first_free > 56) goto end; | 520 | if (le32_to_cpu(dnode->first_free) > 56) goto end; |
| 521 | if (dnode->first_free == 52 || dnode->first_free == 56) { | 521 | if (le32_to_cpu(dnode->first_free) == 52 || le32_to_cpu(dnode->first_free) == 56) { |
| 522 | struct hpfs_dirent *de_end; | 522 | struct hpfs_dirent *de_end; |
| 523 | int root = dnode->root_dnode; | 523 | int root = dnode->root_dnode; |
| 524 | up = dnode->up; | 524 | up = le32_to_cpu(dnode->up); |
| 525 | de = dnode_first_de(dnode); | 525 | de = dnode_first_de(dnode); |
| 526 | down = de->down ? de_down_pointer(de) : 0; | 526 | down = de->down ? de_down_pointer(de) : 0; |
| 527 | if (hpfs_sb(i->i_sb)->sb_chk) if (root && !down) { | 527 | if (hpfs_sb(i->i_sb)->sb_chk) if (root && !down) { |
| @@ -545,13 +545,13 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno) | |||
| 545 | return; | 545 | return; |
| 546 | } | 546 | } |
| 547 | if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { | 547 | if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { |
| 548 | d1->up = up; | 548 | d1->up = cpu_to_le32(up); |
| 549 | d1->root_dnode = 1; | 549 | d1->root_dnode = 1; |
| 550 | hpfs_mark_4buffers_dirty(&qbh1); | 550 | hpfs_mark_4buffers_dirty(&qbh1); |
| 551 | hpfs_brelse4(&qbh1); | 551 | hpfs_brelse4(&qbh1); |
| 552 | } | 552 | } |
| 553 | if ((fnode = hpfs_map_fnode(i->i_sb, up, &bh))) { | 553 | if ((fnode = hpfs_map_fnode(i->i_sb, up, &bh))) { |
| 554 | fnode->u.external[0].disk_secno = down; | 554 | fnode->u.external[0].disk_secno = cpu_to_le32(down); |
| 555 | mark_buffer_dirty(bh); | 555 | mark_buffer_dirty(bh); |
| 556 | brelse(bh); | 556 | brelse(bh); |
| 557 | } | 557 | } |
| @@ -570,22 +570,22 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno) | |||
| 570 | for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, ((loff_t)up << 4) | p); | 570 | for_all_poss(i, hpfs_pos_subst, ((loff_t)dno << 4) | 1, ((loff_t)up << 4) | p); |
| 571 | if (!down) { | 571 | if (!down) { |
| 572 | de->down = 0; | 572 | de->down = 0; |
| 573 | de->length -= 4; | 573 | de->length = cpu_to_le16(le16_to_cpu(de->length) - 4); |
| 574 | dnode->first_free -= 4; | 574 | dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) - 4); |
| 575 | memmove(de_next_de(de), (char *)de_next_de(de) + 4, | 575 | memmove(de_next_de(de), (char *)de_next_de(de) + 4, |
| 576 | (char *)dnode + dnode->first_free - (char *)de_next_de(de)); | 576 | (char *)dnode + le32_to_cpu(dnode->first_free) - (char *)de_next_de(de)); |
| 577 | } else { | 577 | } else { |
| 578 | struct dnode *d1; | 578 | struct dnode *d1; |
| 579 | struct quad_buffer_head qbh1; | 579 | struct quad_buffer_head qbh1; |
| 580 | *(dnode_secno *) ((void *) de + de->length - 4) = down; | 580 | *(dnode_secno *) ((void *) de + le16_to_cpu(de->length) - 4) = down; |
| 581 | if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { | 581 | if ((d1 = hpfs_map_dnode(i->i_sb, down, &qbh1))) { |
| 582 | d1->up = up; | 582 | d1->up = cpu_to_le32(up); |
| 583 | hpfs_mark_4buffers_dirty(&qbh1); | 583 | hpfs_mark_4buffers_dirty(&qbh1); |
| 584 | hpfs_brelse4(&qbh1); | 584 | hpfs_brelse4(&qbh1); |
| 585 | } | 585 | } |
| 586 | } | 586 | } |
| 587 | } else { | 587 | } else { |
| 588 | hpfs_error(i->i_sb, "delete_empty_dnode: dnode %08x, first_free == %03x", dno, dnode->first_free); | 588 | hpfs_error(i->i_sb, "delete_empty_dnode: dnode %08x, first_free == %03x", dno, le32_to_cpu(dnode->first_free)); |
| 589 | goto end; | 589 | goto end; |
| 590 | } | 590 | } |
| 591 | 591 | ||
| @@ -596,18 +596,18 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno) | |||
| 596 | struct quad_buffer_head qbh1; | 596 | struct quad_buffer_head qbh1; |
| 597 | if (!de_next->down) goto endm; | 597 | if (!de_next->down) goto endm; |
| 598 | ndown = de_down_pointer(de_next); | 598 | ndown = de_down_pointer(de_next); |
| 599 | if (!(de_cp = kmalloc(de->length, GFP_NOFS))) { | 599 | if (!(de_cp = kmalloc(le16_to_cpu(de->length), GFP_NOFS))) { |
| 600 | printk("HPFS: out of memory for dtree balancing\n"); | 600 | printk("HPFS: out of memory for dtree balancing\n"); |
| 601 | goto endm; | 601 | goto endm; |
| 602 | } | 602 | } |
| 603 | memcpy(de_cp, de, de->length); | 603 | memcpy(de_cp, de, le16_to_cpu(de->length)); |
| 604 | hpfs_delete_de(i->i_sb, dnode, de); | 604 | hpfs_delete_de(i->i_sb, dnode, de); |
| 605 | hpfs_mark_4buffers_dirty(&qbh); | 605 | hpfs_mark_4buffers_dirty(&qbh); |
| 606 | hpfs_brelse4(&qbh); | 606 | hpfs_brelse4(&qbh); |
| 607 | for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, 4); | 607 | for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, 4); |
| 608 | for_all_poss(i, hpfs_pos_del, ((loff_t)up << 4) | p, 1); | 608 | for_all_poss(i, hpfs_pos_del, ((loff_t)up << 4) | p, 1); |
| 609 | if (de_cp->down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de_cp), &qbh1))) { | 609 | if (de_cp->down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de_cp), &qbh1))) { |
| 610 | d1->up = ndown; | 610 | d1->up = cpu_to_le32(ndown); |
| 611 | hpfs_mark_4buffers_dirty(&qbh1); | 611 | hpfs_mark_4buffers_dirty(&qbh1); |
| 612 | hpfs_brelse4(&qbh1); | 612 | hpfs_brelse4(&qbh1); |
| 613 | } | 613 | } |
| @@ -635,7 +635,7 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno) | |||
| 635 | struct hpfs_dirent *del = dnode_last_de(d1); | 635 | struct hpfs_dirent *del = dnode_last_de(d1); |
| 636 | dlp = del->down ? de_down_pointer(del) : 0; | 636 | dlp = del->down ? de_down_pointer(del) : 0; |
| 637 | if (!dlp && down) { | 637 | if (!dlp && down) { |
| 638 | if (d1->first_free > 2044) { | 638 | if (le32_to_cpu(d1->first_free) > 2044) { |
| 639 | if (hpfs_sb(i->i_sb)->sb_chk >= 2) { | 639 | if (hpfs_sb(i->i_sb)->sb_chk >= 2) { |
| 640 | printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); | 640 | printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); |
| 641 | printk("HPFS: warning: terminating balancing operation\n"); | 641 | printk("HPFS: warning: terminating balancing operation\n"); |
| @@ -647,38 +647,38 @@ static void delete_empty_dnode(struct inode *i, dnode_secno dno) | |||
| 647 | printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); | 647 | printk("HPFS: warning: unbalanced dnode tree, see hpfs.txt 4 more info\n"); |
| 648 | printk("HPFS: warning: goin'on\n"); | 648 | printk("HPFS: warning: goin'on\n"); |
| 649 | } | 649 | } |
| 650 | del->length += 4; | 650 | del->length = cpu_to_le16(le16_to_cpu(del->length) + 4); |
| 651 | del->down = 1; | 651 | del->down = 1; |
| 652 | d1->first_free += 4; | 652 | d1->first_free = cpu_to_le32(le32_to_cpu(d1->first_free) + 4); |
| 653 | } | 653 | } |
| 654 | if (dlp && !down) { | 654 | if (dlp && !down) { |
| 655 | del->length -= 4; | 655 | del->length = cpu_to_le16(le16_to_cpu(del->length) - 4); |
| 656 | del->down = 0; | 656 | del->down = 0; |
| 657 | d1->first_free -= 4; | 657 | d1->first_free = cpu_to_le32(le32_to_cpu(d1->first_free) - 4); |
| 658 | } else if (down) | 658 | } else if (down) |
| 659 | *(dnode_secno *) ((void *) del + del->length - 4) = down; | 659 | *(dnode_secno *) ((void *) del + le16_to_cpu(del->length) - 4) = cpu_to_le32(down); |
| 660 | } else goto endm; | 660 | } else goto endm; |
| 661 | if (!(de_cp = kmalloc(de_prev->length, GFP_NOFS))) { | 661 | if (!(de_cp = kmalloc(le16_to_cpu(de_prev->length), GFP_NOFS))) { |
| 662 | printk("HPFS: out of memory for dtree balancing\n"); | 662 | printk("HPFS: out of memory for dtree balancing\n"); |
| 663 | hpfs_brelse4(&qbh1); | 663 | hpfs_brelse4(&qbh1); |
| 664 | goto endm; | 664 | goto endm; |
| 665 | } | 665 | } |
| 666 | hpfs_mark_4buffers_dirty(&qbh1); | 666 | hpfs_mark_4buffers_dirty(&qbh1); |
| 667 | hpfs_brelse4(&qbh1); | 667 | hpfs_brelse4(&qbh1); |
| 668 | memcpy(de_cp, de_prev, de_prev->length); | 668 | memcpy(de_cp, de_prev, le16_to_cpu(de_prev->length)); |
| 669 | hpfs_delete_de(i->i_sb, dnode, de_prev); | 669 | hpfs_delete_de(i->i_sb, dnode, de_prev); |
| 670 | if (!de_prev->down) { | 670 | if (!de_prev->down) { |
| 671 | de_prev->length += 4; | 671 | de_prev->length = cpu_to_le16(le16_to_cpu(de_prev->length) + 4); |
| 672 | de_prev->down = 1; | 672 | de_prev->down = 1; |
| 673 | dnode->first_free += 4; | 673 | dnode->first_free = cpu_to_le32(le32_to_cpu(dnode->first_free) + 4); |
| 674 | } | 674 | } |
| 675 | *(dnode_secno *) ((void *) de_prev + de_prev->length - 4) = ndown; | 675 | *(dnode_secno *) ((void *) de_prev + le16_to_cpu(de_prev->length) - 4) = cpu_to_le32(ndown); |
| 676 | hpfs_mark_4buffers_dirty(&qbh); | 676 | hpfs_mark_4buffers_dirty(&qbh); |
| 677 | hpfs_brelse4(&qbh); | 677 | hpfs_brelse4(&qbh); |
| 678 | for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | (p - 1), 4); | 678 | for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | (p - 1), 4); |
| 679 | for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, ((loff_t)up << 4) | (p - 1)); | 679 | for_all_poss(i, hpfs_pos_subst, ((loff_t)up << 4) | p, ((loff_t)up << 4) | (p - 1)); |
| 680 | if (down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de), &qbh1))) { | 680 | if (down) if ((d1 = hpfs_map_dnode(i->i_sb, de_down_pointer(de), &qbh1))) { |
| 681 | d1->up = ndown; | 681 | d1->up = cpu_to_le32(ndown); |
| 682 | hpfs_mark_4buffers_dirty(&qbh1); | 682 | hpfs_mark_4buffers_dirty(&qbh1); |
| 683 | hpfs_brelse4(&qbh1); | 683 | hpfs_brelse4(&qbh1); |
| 684 | } | 684 | } |
| @@ -701,7 +701,6 @@ int hpfs_remove_dirent(struct inode *i, dnode_secno dno, struct hpfs_dirent *de, | |||
| 701 | { | 701 | { |
| 702 | struct dnode *dnode = qbh->data; | 702 | struct dnode *dnode = qbh->data; |
| 703 | dnode_secno down = 0; | 703 | dnode_secno down = 0; |
| 704 | int lock = 0; | ||
| 705 | loff_t t; | 704 | loff_t t; |
| 706 | if (de->first || de->last) { | 705 | if (de->first || de->last) { |
| 707 | hpfs_error(i->i_sb, "hpfs_remove_dirent: attempt to delete first or last dirent in dnode %08x", dno); | 706 | hpfs_error(i->i_sb, "hpfs_remove_dirent: attempt to delete first or last dirent in dnode %08x", dno); |
| @@ -710,11 +709,8 @@ int hpfs_remove_dirent(struct inode *i, dnode_secno dno, struct hpfs_dirent *de, | |||
| 710 | } | 709 | } |
| 711 | if (de->down) down = de_down_pointer(de); | 710 | if (de->down) down = de_down_pointer(de); |
| 712 | if (depth && (de->down || (de == dnode_first_de(dnode) && de_next_de(de)->last))) { | 711 | if (depth && (de->down || (de == dnode_first_de(dnode) && de_next_de(de)->last))) { |
| 713 | lock = 1; | ||
| 714 | hpfs_lock_creation(i->i_sb); | ||
| 715 | if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_DEL)) { | 712 | if (hpfs_check_free_dnodes(i->i_sb, FREE_DNODES_DEL)) { |
| 716 | hpfs_brelse4(qbh); | 713 | hpfs_brelse4(qbh); |
| 717 | hpfs_unlock_creation(i->i_sb); | ||
| 718 | return 2; | 714 | return 2; |
| 719 | } | 715 | } |
| 720 | } | 716 | } |
| @@ -727,11 +723,9 @@ int hpfs_remove_dirent(struct inode *i, dnode_secno dno, struct hpfs_dirent *de, | |||
| 727 | dnode_secno a = move_to_top(i, down, dno); | 723 | dnode_secno a = move_to_top(i, down, dno); |
| 728 | for_all_poss(i, hpfs_pos_subst, 5, t); | 724 | for_all_poss(i, hpfs_pos_subst, 5, t); |
| 729 | if (a) delete_empty_dnode(i, a); | 725 | if (a) delete_empty_dnode(i, a); |
| 730 | if (lock) hpfs_unlock_creation(i->i_sb); | ||
| 731 | return !a; | 726 | return !a; |
| 732 | } | 727 | } |
| 733 | delete_empty_dnode(i, dno); | 728 | delete_empty_dnode(i, dno); |
| 734 | if (lock) hpfs_unlock_creation(i->i_sb); | ||
| 735 | return 0; | 729 | return 0; |
| 736 | } | 730 | } |
| 737 | 731 | ||
| @@ -751,8 +745,8 @@ void hpfs_count_dnodes(struct super_block *s, dnode_secno dno, int *n_dnodes, | |||
| 751 | ptr = 0; | 745 | ptr = 0; |
| 752 | go_up: | 746 | go_up: |
| 753 | if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return; | 747 | if (!(dnode = hpfs_map_dnode(s, dno, &qbh))) return; |
| 754 | if (hpfs_sb(s)->sb_chk) if (odno && odno != -1 && dnode->up != odno) | 748 | if (hpfs_sb(s)->sb_chk) if (odno && odno != -1 && le32_to_cpu(dnode->up) != odno) |
| 755 | hpfs_error(s, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno, dno, dnode->up); | 749 | hpfs_error(s, "hpfs_count_dnodes: bad up pointer; dnode %08x, down %08x points to %08x", odno, dno, le32_to_cpu(dnode->up)); |
| 756 | de = dnode_first_de(dnode); | 750 | de = dnode_first_de(dnode); |
| 757 | if (ptr) while(1) { | 751 | if (ptr) while(1) { |
| 758 | if (de->down) if (de_down_pointer(de) == ptr) goto process_de; | 752 | if (de->down) if (de_down_pointer(de) == ptr) goto process_de; |
| @@ -776,7 +770,7 @@ void hpfs_count_dnodes(struct super_block *s, dnode_secno dno, int *n_dnodes, | |||
| 776 | if (!de->first && !de->last && n_items) (*n_items)++; | 770 | if (!de->first && !de->last && n_items) (*n_items)++; |
| 777 | if ((de = de_next_de(de)) < dnode_end_de(dnode)) goto next_de; | 771 | if ((de = de_next_de(de)) < dnode_end_de(dnode)) goto next_de; |
| 778 | ptr = dno; | 772 | ptr = dno; |
| 779 | dno = dnode->up; | 773 | dno = le32_to_cpu(dnode->up); |
| 780 | if (dnode->root_dnode) { | 774 | if (dnode->root_dnode) { |
| 781 | hpfs_brelse4(&qbh); | 775 | hpfs_brelse4(&qbh); |
| 782 | return; | 776 | return; |
| @@ -824,8 +818,8 @@ dnode_secno hpfs_de_as_down_as_possible(struct super_block *s, dnode_secno dno) | |||
| 824 | return d; | 818 | return d; |
| 825 | if (!(de = map_nth_dirent(s, d, 1, &qbh, NULL))) return dno; | 819 | if (!(de = map_nth_dirent(s, d, 1, &qbh, NULL))) return dno; |
| 826 | if (hpfs_sb(s)->sb_chk) | 820 | if (hpfs_sb(s)->sb_chk) |
| 827 | if (up && ((struct dnode *)qbh.data)->up != up) | 821 | if (up && le32_to_cpu(((struct dnode *)qbh.data)->up) != up) |
| 828 | hpfs_error(s, "hpfs_de_as_down_as_possible: bad up pointer; dnode %08x, down %08x points to %08x", up, d, ((struct dnode *)qbh.data)->up); | 822 | hpfs_error(s, "hpfs_de_as_down_as_possible: bad up pointer; dnode %08x, down %08x points to %08x", up, d, le32_to_cpu(((struct dnode *)qbh.data)->up)); |
| 829 | if (!de->down) { | 823 | if (!de->down) { |
| 830 | hpfs_brelse4(&qbh); | 824 | hpfs_brelse4(&qbh); |
| 831 | return d; | 825 | return d; |
| @@ -874,7 +868,7 @@ struct hpfs_dirent *map_pos_dirent(struct inode *inode, loff_t *posp, | |||
| 874 | /* Going up */ | 868 | /* Going up */ |
| 875 | if (dnode->root_dnode) goto bail; | 869 | if (dnode->root_dnode) goto bail; |
| 876 | 870 | ||
| 877 | if (!(up_dnode = hpfs_map_dnode(inode->i_sb, dnode->up, &qbh0))) | 871 | if (!(up_dnode = hpfs_map_dnode(inode->i_sb, le32_to_cpu(dnode->up), &qbh0))) |
| 878 | goto bail; | 872 | goto bail; |
| 879 | 873 | ||
| 880 | end_up_de = dnode_end_de(up_dnode); | 874 | end_up_de = dnode_end_de(up_dnode); |
| @@ -882,16 +876,16 @@ struct hpfs_dirent *map_pos_dirent(struct inode *inode, loff_t *posp, | |||
| 882 | for (up_de = dnode_first_de(up_dnode); up_de < end_up_de; | 876 | for (up_de = dnode_first_de(up_dnode); up_de < end_up_de; |
| 883 | up_de = de_next_de(up_de)) { | 877 | up_de = de_next_de(up_de)) { |
| 884 | if (!(++c & 077)) hpfs_error(inode->i_sb, | 878 | if (!(++c & 077)) hpfs_error(inode->i_sb, |
| 885 | "map_pos_dirent: pos crossed dnode boundary; dnode = %08x", dnode->up); | 879 | "map_pos_dirent: pos crossed dnode boundary; dnode = %08x", le32_to_cpu(dnode->up)); |
| 886 | if (up_de->down && de_down_pointer(up_de) == dno) { | 880 | if (up_de->down && de_down_pointer(up_de) == dno) { |
| 887 | *posp = ((loff_t) dnode->up << 4) + c; | 881 | *posp = ((loff_t) le32_to_cpu(dnode->up) << 4) + c; |
| 888 | hpfs_brelse4(&qbh0); | 882 | hpfs_brelse4(&qbh0); |
| 889 | return de; | 883 | return de; |
| 890 | } | 884 | } |
| 891 | } | 885 | } |
| 892 | 886 | ||
| 893 | hpfs_error(inode->i_sb, "map_pos_dirent: pointer to dnode %08x not found in parent dnode %08x", | 887 | hpfs_error(inode->i_sb, "map_pos_dirent: pointer to dnode %08x not found in parent dnode %08x", |
| 894 | dno, dnode->up); | 888 | dno, le32_to_cpu(dnode->up)); |
| 895 | hpfs_brelse4(&qbh0); | 889 | hpfs_brelse4(&qbh0); |
| 896 | 890 | ||
| 897 | bail: | 891 | bail: |
| @@ -1017,17 +1011,17 @@ struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno, | |||
| 1017 | /*name2[15] = 0xff;*/ | 1011 | /*name2[15] = 0xff;*/ |
| 1018 | name1len = 15; name2len = 256; | 1012 | name1len = 15; name2len = 256; |
| 1019 | } | 1013 | } |
| 1020 | if (!(upf = hpfs_map_fnode(s, f->up, &bh))) { | 1014 | if (!(upf = hpfs_map_fnode(s, le32_to_cpu(f->up), &bh))) { |
| 1021 | kfree(name2); | 1015 | kfree(name2); |
| 1022 | return NULL; | 1016 | return NULL; |
| 1023 | } | 1017 | } |
| 1024 | if (!upf->dirflag) { | 1018 | if (!upf->dirflag) { |
| 1025 | brelse(bh); | 1019 | brelse(bh); |
| 1026 | hpfs_error(s, "fnode %08x has non-directory parent %08x", fno, f->up); | 1020 | hpfs_error(s, "fnode %08x has non-directory parent %08x", fno, le32_to_cpu(f->up)); |
| 1027 | kfree(name2); | 1021 | kfree(name2); |
| 1028 | return NULL; | 1022 | return NULL; |
| 1029 | } | 1023 | } |
| 1030 | dno = upf->u.external[0].disk_secno; | 1024 | dno = le32_to_cpu(upf->u.external[0].disk_secno); |
| 1031 | brelse(bh); | 1025 | brelse(bh); |
| 1032 | go_down: | 1026 | go_down: |
| 1033 | downd = 0; | 1027 | downd = 0; |
| @@ -1049,7 +1043,7 @@ struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno, | |||
| 1049 | return NULL; | 1043 | return NULL; |
| 1050 | } | 1044 | } |
| 1051 | next_de: | 1045 | next_de: |
| 1052 | if (de->fnode == fno) { | 1046 | if (le32_to_cpu(de->fnode) == fno) { |
| 1053 | kfree(name2); | 1047 | kfree(name2); |
| 1054 | return de; | 1048 | return de; |
| 1055 | } | 1049 | } |
| @@ -1065,7 +1059,7 @@ struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno, | |||
| 1065 | goto go_down; | 1059 | goto go_down; |
| 1066 | } | 1060 | } |
| 1067 | f: | 1061 | f: |
| 1068 | if (de->fnode == fno) { | 1062 | if (le32_to_cpu(de->fnode) == fno) { |
| 1069 | kfree(name2); | 1063 | kfree(name2); |
| 1070 | return de; | 1064 | return de; |
| 1071 | } | 1065 | } |
| @@ -1074,7 +1068,7 @@ struct hpfs_dirent *map_fnode_dirent(struct super_block *s, fnode_secno fno, | |||
| 1074 | if ((de = de_next_de(de)) < de_end) goto next_de; | 1068 | if ((de = de_next_de(de)) < de_end) goto next_de; |
| 1075 | if (d->root_dnode) goto not_found; | 1069 | if (d->root_dnode) goto not_found; |
| 1076 | downd = dno; | 1070 | downd = dno; |
| 1077 | dno = d->up; | 1071 | dno = le32_to_cpu(d->up); |
| 1078 | hpfs_brelse4(qbh); | 1072 | hpfs_brelse4(qbh); |
| 1079 | if (hpfs_sb(s)->sb_chk) | 1073 | if (hpfs_sb(s)->sb_chk) |
| 1080 | if (hpfs_stop_cycles(s, downd, &d1, &d2, "map_fnode_dirent #2")) { | 1074 | if (hpfs_stop_cycles(s, downd, &d1, &d2, "map_fnode_dirent #2")) { |
diff --git a/fs/hpfs/ea.c b/fs/hpfs/ea.c index 45e53d972b42..d8b84d113c89 100644 --- a/fs/hpfs/ea.c +++ b/fs/hpfs/ea.c | |||
| @@ -24,7 +24,7 @@ void hpfs_ea_ext_remove(struct super_block *s, secno a, int ano, unsigned len) | |||
| 24 | } | 24 | } |
| 25 | if (hpfs_ea_read(s, a, ano, pos, 4, ex)) return; | 25 | if (hpfs_ea_read(s, a, ano, pos, 4, ex)) return; |
| 26 | if (ea->indirect) { | 26 | if (ea->indirect) { |
| 27 | if (ea->valuelen != 8) { | 27 | if (ea_valuelen(ea) != 8) { |
| 28 | hpfs_error(s, "ea->indirect set while ea->valuelen!=8, %s %08x, pos %08x", | 28 | hpfs_error(s, "ea->indirect set while ea->valuelen!=8, %s %08x, pos %08x", |
| 29 | ano ? "anode" : "sectors", a, pos); | 29 | ano ? "anode" : "sectors", a, pos); |
| 30 | return; | 30 | return; |
| @@ -33,7 +33,7 @@ void hpfs_ea_ext_remove(struct super_block *s, secno a, int ano, unsigned len) | |||
| 33 | return; | 33 | return; |
| 34 | hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); | 34 | hpfs_ea_remove(s, ea_sec(ea), ea->anode, ea_len(ea)); |
| 35 | } | 35 | } |
| 36 | pos += ea->namelen + ea->valuelen + 5; | 36 | pos += ea->namelen + ea_valuelen(ea) + 5; |
| 37 | } | 37 | } |
| 38 | if (!ano) hpfs_free_sectors(s, a, (len+511) >> 9); | 38 | if (!ano) hpfs_free_sectors(s, a, (len+511) >> 9); |
| 39 | else { | 39 | else { |
| @@ -76,24 +76,24 @@ int hpfs_read_ea(struct super_block *s, struct fnode *fnode, char *key, | |||
| 76 | unsigned pos; | 76 | unsigned pos; |
| 77 | int ano, len; | 77 | int ano, len; |
| 78 | secno a; | 78 | secno a; |
| 79 | char ex[4 + 255 + 1 + 8]; | ||
| 79 | struct extended_attribute *ea; | 80 | struct extended_attribute *ea; |
| 80 | struct extended_attribute *ea_end = fnode_end_ea(fnode); | 81 | struct extended_attribute *ea_end = fnode_end_ea(fnode); |
| 81 | for (ea = fnode_ea(fnode); ea < ea_end; ea = next_ea(ea)) | 82 | for (ea = fnode_ea(fnode); ea < ea_end; ea = next_ea(ea)) |
| 82 | if (!strcmp(ea->name, key)) { | 83 | if (!strcmp(ea->name, key)) { |
| 83 | if (ea->indirect) | 84 | if (ea->indirect) |
| 84 | goto indirect; | 85 | goto indirect; |
| 85 | if (ea->valuelen >= size) | 86 | if (ea_valuelen(ea) >= size) |
| 86 | return -EINVAL; | 87 | return -EINVAL; |
| 87 | memcpy(buf, ea_data(ea), ea->valuelen); | 88 | memcpy(buf, ea_data(ea), ea_valuelen(ea)); |
| 88 | buf[ea->valuelen] = 0; | 89 | buf[ea_valuelen(ea)] = 0; |
| 89 | return 0; | 90 | return 0; |
| 90 | } | 91 | } |
| 91 | a = fnode->ea_secno; | 92 | a = le32_to_cpu(fnode->ea_secno); |
| 92 | len = fnode->ea_size_l; | 93 | len = le32_to_cpu(fnode->ea_size_l); |
| 93 | ano = fnode->ea_anode; | 94 | ano = fnode->ea_anode; |
| 94 | pos = 0; | 95 | pos = 0; |
| 95 | while (pos < len) { | 96 | while (pos < len) { |
| 96 | char ex[4 + 255 + 1 + 8]; | ||
| 97 | ea = (struct extended_attribute *)ex; | 97 | ea = (struct extended_attribute *)ex; |
| 98 | if (pos + 4 > len) { | 98 | if (pos + 4 > len) { |
| 99 | hpfs_error(s, "EAs don't end correctly, %s %08x, len %08x", | 99 | hpfs_error(s, "EAs don't end correctly, %s %08x, len %08x", |
| @@ -106,14 +106,14 @@ int hpfs_read_ea(struct super_block *s, struct fnode *fnode, char *key, | |||
| 106 | if (!strcmp(ea->name, key)) { | 106 | if (!strcmp(ea->name, key)) { |
| 107 | if (ea->indirect) | 107 | if (ea->indirect) |
| 108 | goto indirect; | 108 | goto indirect; |
| 109 | if (ea->valuelen >= size) | 109 | if (ea_valuelen(ea) >= size) |
| 110 | return -EINVAL; | 110 | return -EINVAL; |
| 111 | if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea->valuelen, buf)) | 111 | if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea_valuelen(ea), buf)) |
| 112 | return -EIO; | 112 | return -EIO; |
| 113 | buf[ea->valuelen] = 0; | 113 | buf[ea_valuelen(ea)] = 0; |
| 114 | return 0; | 114 | return 0; |
| 115 | } | 115 | } |
| 116 | pos += ea->namelen + ea->valuelen + 5; | 116 | pos += ea->namelen + ea_valuelen(ea) + 5; |
| 117 | } | 117 | } |
| 118 | return -ENOENT; | 118 | return -ENOENT; |
| 119 | indirect: | 119 | indirect: |
| @@ -138,16 +138,16 @@ char *hpfs_get_ea(struct super_block *s, struct fnode *fnode, char *key, int *si | |||
| 138 | if (!strcmp(ea->name, key)) { | 138 | if (!strcmp(ea->name, key)) { |
| 139 | if (ea->indirect) | 139 | if (ea->indirect) |
| 140 | return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); | 140 | return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); |
| 141 | if (!(ret = kmalloc((*size = ea->valuelen) + 1, GFP_NOFS))) { | 141 | if (!(ret = kmalloc((*size = ea_valuelen(ea)) + 1, GFP_NOFS))) { |
| 142 | printk("HPFS: out of memory for EA\n"); | 142 | printk("HPFS: out of memory for EA\n"); |
| 143 | return NULL; | 143 | return NULL; |
| 144 | } | 144 | } |
| 145 | memcpy(ret, ea_data(ea), ea->valuelen); | 145 | memcpy(ret, ea_data(ea), ea_valuelen(ea)); |
| 146 | ret[ea->valuelen] = 0; | 146 | ret[ea_valuelen(ea)] = 0; |
| 147 | return ret; | 147 | return ret; |
| 148 | } | 148 | } |
| 149 | a = fnode->ea_secno; | 149 | a = le32_to_cpu(fnode->ea_secno); |
| 150 | len = fnode->ea_size_l; | 150 | len = le32_to_cpu(fnode->ea_size_l); |
| 151 | ano = fnode->ea_anode; | 151 | ano = fnode->ea_anode; |
| 152 | pos = 0; | 152 | pos = 0; |
| 153 | while (pos < len) { | 153 | while (pos < len) { |
| @@ -164,18 +164,18 @@ char *hpfs_get_ea(struct super_block *s, struct fnode *fnode, char *key, int *si | |||
| 164 | if (!strcmp(ea->name, key)) { | 164 | if (!strcmp(ea->name, key)) { |
| 165 | if (ea->indirect) | 165 | if (ea->indirect) |
| 166 | return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); | 166 | return get_indirect_ea(s, ea->anode, ea_sec(ea), *size = ea_len(ea)); |
| 167 | if (!(ret = kmalloc((*size = ea->valuelen) + 1, GFP_NOFS))) { | 167 | if (!(ret = kmalloc((*size = ea_valuelen(ea)) + 1, GFP_NOFS))) { |
| 168 | printk("HPFS: out of memory for EA\n"); | 168 | printk("HPFS: out of memory for EA\n"); |
| 169 | return NULL; | 169 | return NULL; |
| 170 | } | 170 | } |
| 171 | if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea->valuelen, ret)) { | 171 | if (hpfs_ea_read(s, a, ano, pos + 4 + ea->namelen + 1, ea_valuelen(ea), ret)) { |
| 172 | kfree(ret); | 172 | kfree(ret); |
| 173 | return NULL; | 173 | return NULL; |
| 174 | } | 174 | } |
| 175 | ret[ea->valuelen] = 0; | 175 | ret[ea_valuelen(ea)] = 0; |
| 176 | return ret; | 176 | return ret; |
| 177 | } | 177 | } |
| 178 | pos += ea->namelen + ea->valuelen + 5; | 178 | pos += ea->namelen + ea_valuelen(ea) + 5; |
| 179 | } | 179 | } |
| 180 | return NULL; | 180 | return NULL; |
| 181 | } | 181 | } |
| @@ -202,13 +202,13 @@ void hpfs_set_ea(struct inode *inode, struct fnode *fnode, const char *key, | |||
| 202 | if (ea->indirect) { | 202 | if (ea->indirect) { |
| 203 | if (ea_len(ea) == size) | 203 | if (ea_len(ea) == size) |
| 204 | set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); | 204 | set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); |
| 205 | } else if (ea->valuelen == size) { | 205 | } else if (ea_valuelen(ea) == size) { |
| 206 | memcpy(ea_data(ea), data, size); | 206 | memcpy(ea_data(ea), data, size); |
| 207 | } | 207 | } |
| 208 | return; | 208 | return; |
| 209 | } | 209 | } |
| 210 | a = fnode->ea_secno; | 210 | a = le32_to_cpu(fnode->ea_secno); |
| 211 | len = fnode->ea_size_l; | 211 | len = le32_to_cpu(fnode->ea_size_l); |
| 212 | ano = fnode->ea_anode; | 212 | ano = fnode->ea_anode; |
| 213 | pos = 0; | 213 | pos = 0; |
| 214 | while (pos < len) { | 214 | while (pos < len) { |
| @@ -228,68 +228,70 @@ void hpfs_set_ea(struct inode *inode, struct fnode *fnode, const char *key, | |||
| 228 | set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); | 228 | set_indirect_ea(s, ea->anode, ea_sec(ea), data, size); |
| 229 | } | 229 | } |
| 230 | else { | 230 | else { |
| 231 | if (ea->valuelen == size) | 231 | if (ea_valuelen(ea) == size) |
| 232 | hpfs_ea_write(s, a, ano, pos + 4 + ea->namelen + 1, size, data); | 232 | hpfs_ea_write(s, a, ano, pos + 4 + ea->namelen + 1, size, data); |
| 233 | } | 233 | } |
| 234 | return; | 234 | return; |
| 235 | } | 235 | } |
| 236 | pos += ea->namelen + ea->valuelen + 5; | 236 | pos += ea->namelen + ea_valuelen(ea) + 5; |
| 237 | } | 237 | } |
| 238 | if (!fnode->ea_offs) { | 238 | if (!le16_to_cpu(fnode->ea_offs)) { |
| 239 | /*if (fnode->ea_size_s) { | 239 | /*if (le16_to_cpu(fnode->ea_size_s)) { |
| 240 | hpfs_error(s, "fnode %08x: ea_size_s == %03x, ea_offs == 0", | 240 | hpfs_error(s, "fnode %08x: ea_size_s == %03x, ea_offs == 0", |
| 241 | inode->i_ino, fnode->ea_size_s); | 241 | inode->i_ino, le16_to_cpu(fnode->ea_size_s)); |
| 242 | return; | 242 | return; |
| 243 | }*/ | 243 | }*/ |
| 244 | fnode->ea_offs = 0xc4; | 244 | fnode->ea_offs = cpu_to_le16(0xc4); |
| 245 | } | 245 | } |
| 246 | if (fnode->ea_offs < 0xc4 || fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s > 0x200) { | 246 | if (le16_to_cpu(fnode->ea_offs) < 0xc4 || le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) > 0x200) { |
| 247 | hpfs_error(s, "fnode %08lx: ea_offs == %03x, ea_size_s == %03x", | 247 | hpfs_error(s, "fnode %08lx: ea_offs == %03x, ea_size_s == %03x", |
| 248 | (unsigned long)inode->i_ino, | 248 | (unsigned long)inode->i_ino, |
| 249 | fnode->ea_offs, fnode->ea_size_s); | 249 | le32_to_cpu(fnode->ea_offs), le16_to_cpu(fnode->ea_size_s)); |
| 250 | return; | 250 | return; |
| 251 | } | 251 | } |
| 252 | if ((fnode->ea_size_s || !fnode->ea_size_l) && | 252 | if ((le16_to_cpu(fnode->ea_size_s) || !le32_to_cpu(fnode->ea_size_l)) && |
| 253 | fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s + strlen(key) + size + 5 <= 0x200) { | 253 | le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) + strlen(key) + size + 5 <= 0x200) { |
| 254 | ea = fnode_end_ea(fnode); | 254 | ea = fnode_end_ea(fnode); |
| 255 | *(char *)ea = 0; | 255 | *(char *)ea = 0; |
| 256 | ea->namelen = strlen(key); | 256 | ea->namelen = strlen(key); |
| 257 | ea->valuelen = size; | 257 | ea->valuelen_lo = size; |
| 258 | ea->valuelen_hi = size >> 8; | ||
| 258 | strcpy(ea->name, key); | 259 | strcpy(ea->name, key); |
| 259 | memcpy(ea_data(ea), data, size); | 260 | memcpy(ea_data(ea), data, size); |
| 260 | fnode->ea_size_s += strlen(key) + size + 5; | 261 | fnode->ea_size_s = cpu_to_le16(le16_to_cpu(fnode->ea_size_s) + strlen(key) + size + 5); |
| 261 | goto ret; | 262 | goto ret; |
| 262 | } | 263 | } |
| 263 | /* Most the code here is 99.9993422% unused. I hope there are no bugs. | 264 | /* Most the code here is 99.9993422% unused. I hope there are no bugs. |
| 264 | But what .. HPFS.IFS has also bugs in ea management. */ | 265 | But what .. HPFS.IFS has also bugs in ea management. */ |
| 265 | if (fnode->ea_size_s && !fnode->ea_size_l) { | 266 | if (le16_to_cpu(fnode->ea_size_s) && !le32_to_cpu(fnode->ea_size_l)) { |
| 266 | secno n; | 267 | secno n; |
| 267 | struct buffer_head *bh; | 268 | struct buffer_head *bh; |
| 268 | char *data; | 269 | char *data; |
| 269 | if (!(n = hpfs_alloc_sector(s, fno, 1, 0, 1))) return; | 270 | if (!(n = hpfs_alloc_sector(s, fno, 1, 0))) return; |
| 270 | if (!(data = hpfs_get_sector(s, n, &bh))) { | 271 | if (!(data = hpfs_get_sector(s, n, &bh))) { |
| 271 | hpfs_free_sectors(s, n, 1); | 272 | hpfs_free_sectors(s, n, 1); |
| 272 | return; | 273 | return; |
| 273 | } | 274 | } |
| 274 | memcpy(data, fnode_ea(fnode), fnode->ea_size_s); | 275 | memcpy(data, fnode_ea(fnode), le16_to_cpu(fnode->ea_size_s)); |
| 275 | fnode->ea_size_l = fnode->ea_size_s; | 276 | fnode->ea_size_l = cpu_to_le32(le16_to_cpu(fnode->ea_size_s)); |
| 276 | fnode->ea_size_s = 0; | 277 | fnode->ea_size_s = cpu_to_le16(0); |
| 277 | fnode->ea_secno = n; | 278 | fnode->ea_secno = cpu_to_le32(n); |
| 278 | fnode->ea_anode = 0; | 279 | fnode->ea_anode = cpu_to_le32(0); |
| 279 | mark_buffer_dirty(bh); | 280 | mark_buffer_dirty(bh); |
| 280 | brelse(bh); | 281 | brelse(bh); |
| 281 | } | 282 | } |
| 282 | pos = fnode->ea_size_l + 5 + strlen(key) + size; | 283 | pos = le32_to_cpu(fnode->ea_size_l) + 5 + strlen(key) + size; |
| 283 | len = (fnode->ea_size_l + 511) >> 9; | 284 | len = (le32_to_cpu(fnode->ea_size_l) + 511) >> 9; |
| 284 | if (pos >= 30000) goto bail; | 285 | if (pos >= 30000) goto bail; |
| 285 | while (((pos + 511) >> 9) > len) { | 286 | while (((pos + 511) >> 9) > len) { |
| 286 | if (!len) { | 287 | if (!len) { |
| 287 | if (!(fnode->ea_secno = hpfs_alloc_sector(s, fno, 1, 0, 1))) | 288 | secno q = hpfs_alloc_sector(s, fno, 1, 0); |
| 288 | goto bail; | 289 | if (!q) goto bail; |
| 290 | fnode->ea_secno = cpu_to_le32(q); | ||
| 289 | fnode->ea_anode = 0; | 291 | fnode->ea_anode = 0; |
| 290 | len++; | 292 | len++; |
| 291 | } else if (!fnode->ea_anode) { | 293 | } else if (!fnode->ea_anode) { |
| 292 | if (hpfs_alloc_if_possible(s, fnode->ea_secno + len)) { | 294 | if (hpfs_alloc_if_possible(s, le32_to_cpu(fnode->ea_secno) + len)) { |
| 293 | len++; | 295 | len++; |
| 294 | } else { | 296 | } else { |
| 295 | /* Aargh... don't know how to create ea anodes :-( */ | 297 | /* Aargh... don't know how to create ea anodes :-( */ |
| @@ -298,26 +300,26 @@ void hpfs_set_ea(struct inode *inode, struct fnode *fnode, const char *key, | |||
| 298 | anode_secno a_s; | 300 | anode_secno a_s; |
| 299 | if (!(anode = hpfs_alloc_anode(s, fno, &a_s, &bh))) | 301 | if (!(anode = hpfs_alloc_anode(s, fno, &a_s, &bh))) |
| 300 | goto bail; | 302 | goto bail; |
| 301 | anode->up = fno; | 303 | anode->up = cpu_to_le32(fno); |
| 302 | anode->btree.fnode_parent = 1; | 304 | anode->btree.fnode_parent = 1; |
| 303 | anode->btree.n_free_nodes--; | 305 | anode->btree.n_free_nodes--; |
| 304 | anode->btree.n_used_nodes++; | 306 | anode->btree.n_used_nodes++; |
| 305 | anode->btree.first_free += 12; | 307 | anode->btree.first_free = cpu_to_le16(le16_to_cpu(anode->btree.first_free) + 12); |
| 306 | anode->u.external[0].disk_secno = fnode->ea_secno; | 308 | anode->u.external[0].disk_secno = cpu_to_le32(le32_to_cpu(fnode->ea_secno)); |
| 307 | anode->u.external[0].file_secno = 0; | 309 | anode->u.external[0].file_secno = cpu_to_le32(0); |
| 308 | anode->u.external[0].length = len; | 310 | anode->u.external[0].length = cpu_to_le32(len); |
| 309 | mark_buffer_dirty(bh); | 311 | mark_buffer_dirty(bh); |
| 310 | brelse(bh); | 312 | brelse(bh); |
| 311 | fnode->ea_anode = 1; | 313 | fnode->ea_anode = 1; |
| 312 | fnode->ea_secno = a_s;*/ | 314 | fnode->ea_secno = cpu_to_le32(a_s);*/ |
| 313 | secno new_sec; | 315 | secno new_sec; |
| 314 | int i; | 316 | int i; |
| 315 | if (!(new_sec = hpfs_alloc_sector(s, fno, 1, 1 - ((pos + 511) >> 9), 1))) | 317 | if (!(new_sec = hpfs_alloc_sector(s, fno, 1, 1 - ((pos + 511) >> 9)))) |
| 316 | goto bail; | 318 | goto bail; |
| 317 | for (i = 0; i < len; i++) { | 319 | for (i = 0; i < len; i++) { |
| 318 | struct buffer_head *bh1, *bh2; | 320 | struct buffer_head *bh1, *bh2; |
| 319 | void *b1, *b2; | 321 | void *b1, *b2; |
| 320 | if (!(b1 = hpfs_map_sector(s, fnode->ea_secno + i, &bh1, len - i - 1))) { | 322 | if (!(b1 = hpfs_map_sector(s, le32_to_cpu(fnode->ea_secno) + i, &bh1, len - i - 1))) { |
| 321 | hpfs_free_sectors(s, new_sec, (pos + 511) >> 9); | 323 | hpfs_free_sectors(s, new_sec, (pos + 511) >> 9); |
| 322 | goto bail; | 324 | goto bail; |
| 323 | } | 325 | } |
| @@ -331,13 +333,13 @@ void hpfs_set_ea(struct inode *inode, struct fnode *fnode, const char *key, | |||
| 331 | mark_buffer_dirty(bh2); | 333 | mark_buffer_dirty(bh2); |
| 332 | brelse(bh2); | 334 | brelse(bh2); |
| 333 | } | 335 | } |
| 334 | hpfs_free_sectors(s, fnode->ea_secno, len); | 336 | hpfs_free_sectors(s, le32_to_cpu(fnode->ea_secno), len); |
| 335 | fnode->ea_secno = new_sec; | 337 | fnode->ea_secno = cpu_to_le32(new_sec); |
| 336 | len = (pos + 511) >> 9; | 338 | len = (pos + 511) >> 9; |
| 337 | } | 339 | } |
| 338 | } | 340 | } |
| 339 | if (fnode->ea_anode) { | 341 | if (fnode->ea_anode) { |
| 340 | if (hpfs_add_sector_to_btree(s, fnode->ea_secno, | 342 | if (hpfs_add_sector_to_btree(s, le32_to_cpu(fnode->ea_secno), |
| 341 | 0, len) != -1) { | 343 | 0, len) != -1) { |
| 342 | len++; | 344 | len++; |
| 343 | } else { | 345 | } else { |
| @@ -349,17 +351,17 @@ void hpfs_set_ea(struct inode *inode, struct fnode *fnode, const char *key, | |||
| 349 | h[1] = strlen(key); | 351 | h[1] = strlen(key); |
| 350 | h[2] = size & 0xff; | 352 | h[2] = size & 0xff; |
| 351 | h[3] = size >> 8; | 353 | h[3] = size >> 8; |
| 352 | if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l, 4, h)) goto bail; | 354 | if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l), 4, h)) goto bail; |
| 353 | if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l + 4, h[1] + 1, key)) goto bail; | 355 | if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l) + 4, h[1] + 1, key)) goto bail; |
| 354 | if (hpfs_ea_write(s, fnode->ea_secno, fnode->ea_anode, fnode->ea_size_l + 5 + h[1], size, data)) goto bail; | 356 | if (hpfs_ea_write(s, le32_to_cpu(fnode->ea_secno), fnode->ea_anode, le32_to_cpu(fnode->ea_size_l) + 5 + h[1], size, data)) goto bail; |
| 355 | fnode->ea_size_l = pos; | 357 | fnode->ea_size_l = cpu_to_le32(pos); |
| 356 | ret: | 358 | ret: |
| 357 | hpfs_i(inode)->i_ea_size += 5 + strlen(key) + size; | 359 | hpfs_i(inode)->i_ea_size += 5 + strlen(key) + size; |
| 358 | return; | 360 | return; |
| 359 | bail: | 361 | bail: |
| 360 | if (fnode->ea_secno) | 362 | if (le32_to_cpu(fnode->ea_secno)) |
| 361 | if (fnode->ea_anode) hpfs_truncate_btree(s, fnode->ea_secno, 1, (fnode->ea_size_l + 511) >> 9); | 363 | if (fnode->ea_anode) hpfs_truncate_btree(s, le32_to_cpu(fnode->ea_secno), 1, (le32_to_cpu(fnode->ea_size_l) + 511) >> 9); |
| 362 | else hpfs_free_sectors(s, fnode->ea_secno + ((fnode->ea_size_l + 511) >> 9), len - ((fnode->ea_size_l + 511) >> 9)); | 364 | else hpfs_free_sectors(s, le32_to_cpu(fnode->ea_secno) + ((le32_to_cpu(fnode->ea_size_l) + 511) >> 9), len - ((le32_to_cpu(fnode->ea_size_l) + 511) >> 9)); |
| 363 | else fnode->ea_secno = fnode->ea_size_l = 0; | 365 | else fnode->ea_secno = fnode->ea_size_l = cpu_to_le32(0); |
| 364 | } | 366 | } |
| 365 | 367 | ||
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c index 9b9eb6933e43..89c500ee5213 100644 --- a/fs/hpfs/file.c +++ b/fs/hpfs/file.c | |||
| @@ -20,8 +20,8 @@ static int hpfs_file_release(struct inode *inode, struct file *file) | |||
| 20 | 20 | ||
| 21 | int hpfs_file_fsync(struct file *file, int datasync) | 21 | int hpfs_file_fsync(struct file *file, int datasync) |
| 22 | { | 22 | { |
| 23 | /*return file_fsync(file, datasync);*/ | 23 | struct inode *inode = file->f_mapping->host; |
| 24 | return 0; /* Don't fsync :-) */ | 24 | return sync_blockdev(inode->i_sb->s_bdev); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | /* | 27 | /* |
| @@ -48,38 +48,46 @@ static secno hpfs_bmap(struct inode *inode, unsigned file_secno) | |||
| 48 | static void hpfs_truncate(struct inode *i) | 48 | static void hpfs_truncate(struct inode *i) |
| 49 | { | 49 | { |
| 50 | if (IS_IMMUTABLE(i)) return /*-EPERM*/; | 50 | if (IS_IMMUTABLE(i)) return /*-EPERM*/; |
| 51 | hpfs_lock(i->i_sb); | 51 | hpfs_lock_assert(i->i_sb); |
| 52 | |||
| 52 | hpfs_i(i)->i_n_secs = 0; | 53 | hpfs_i(i)->i_n_secs = 0; |
| 53 | i->i_blocks = 1 + ((i->i_size + 511) >> 9); | 54 | i->i_blocks = 1 + ((i->i_size + 511) >> 9); |
| 54 | hpfs_i(i)->mmu_private = i->i_size; | 55 | hpfs_i(i)->mmu_private = i->i_size; |
| 55 | hpfs_truncate_btree(i->i_sb, i->i_ino, 1, ((i->i_size + 511) >> 9)); | 56 | hpfs_truncate_btree(i->i_sb, i->i_ino, 1, ((i->i_size + 511) >> 9)); |
| 56 | hpfs_write_inode(i); | 57 | hpfs_write_inode(i); |
| 57 | hpfs_i(i)->i_n_secs = 0; | 58 | hpfs_i(i)->i_n_secs = 0; |
| 58 | hpfs_unlock(i->i_sb); | ||
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | static int hpfs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) | 61 | static int hpfs_get_block(struct inode *inode, sector_t iblock, struct buffer_head *bh_result, int create) |
| 62 | { | 62 | { |
| 63 | int r; | ||
| 63 | secno s; | 64 | secno s; |
| 65 | hpfs_lock(inode->i_sb); | ||
| 64 | s = hpfs_bmap(inode, iblock); | 66 | s = hpfs_bmap(inode, iblock); |
| 65 | if (s) { | 67 | if (s) { |
| 66 | map_bh(bh_result, inode->i_sb, s); | 68 | map_bh(bh_result, inode->i_sb, s); |
| 67 | return 0; | 69 | goto ret_0; |
| 68 | } | 70 | } |
| 69 | if (!create) return 0; | 71 | if (!create) goto ret_0; |
| 70 | if (iblock<<9 != hpfs_i(inode)->mmu_private) { | 72 | if (iblock<<9 != hpfs_i(inode)->mmu_private) { |
| 71 | BUG(); | 73 | BUG(); |
| 72 | return -EIO; | 74 | r = -EIO; |
| 75 | goto ret_r; | ||
| 73 | } | 76 | } |
| 74 | if ((s = hpfs_add_sector_to_btree(inode->i_sb, inode->i_ino, 1, inode->i_blocks - 1)) == -1) { | 77 | if ((s = hpfs_add_sector_to_btree(inode->i_sb, inode->i_ino, 1, inode->i_blocks - 1)) == -1) { |
| 75 | hpfs_truncate_btree(inode->i_sb, inode->i_ino, 1, inode->i_blocks - 1); | 78 | hpfs_truncate_btree(inode->i_sb, inode->i_ino, 1, inode->i_blocks - 1); |
| 76 | return -ENOSPC; | 79 | r = -ENOSPC; |
| 80 | goto ret_r; | ||
| 77 | } | 81 | } |
| 78 | inode->i_blocks++; | 82 | inode->i_blocks++; |
| 79 | hpfs_i(inode)->mmu_private += 512; | 83 | hpfs_i(inode)->mmu_private += 512; |
| 80 | set_buffer_new(bh_result); | 84 | set_buffer_new(bh_result); |
| 81 | map_bh(bh_result, inode->i_sb, s); | 85 | map_bh(bh_result, inode->i_sb, s); |
| 82 | return 0; | 86 | ret_0: |
| 87 | r = 0; | ||
| 88 | ret_r: | ||
| 89 | hpfs_unlock(inode->i_sb); | ||
| 90 | return r; | ||
| 83 | } | 91 | } |
| 84 | 92 | ||
| 85 | static int hpfs_writepage(struct page *page, struct writeback_control *wbc) | 93 | static int hpfs_writepage(struct page *page, struct writeback_control *wbc) |
| @@ -130,8 +138,11 @@ static ssize_t hpfs_file_write(struct file *file, const char __user *buf, | |||
| 130 | ssize_t retval; | 138 | ssize_t retval; |
| 131 | 139 | ||
| 132 | retval = do_sync_write(file, buf, count, ppos); | 140 | retval = do_sync_write(file, buf, count, ppos); |
| 133 | if (retval > 0) | 141 | if (retval > 0) { |
| 142 | hpfs_lock(file->f_path.dentry->d_sb); | ||
| 134 | hpfs_i(file->f_path.dentry->d_inode)->i_dirty = 1; | 143 | hpfs_i(file->f_path.dentry->d_inode)->i_dirty = 1; |
| 144 | hpfs_unlock(file->f_path.dentry->d_sb); | ||
| 145 | } | ||
| 135 | return retval; | 146 | return retval; |
| 136 | } | 147 | } |
| 137 | 148 | ||
diff --git a/fs/hpfs/hpfs.h b/fs/hpfs/hpfs.h index 0e84c73cd9c4..8b0650aae328 100644 --- a/fs/hpfs/hpfs.h +++ b/fs/hpfs/hpfs.h | |||
| @@ -19,9 +19,13 @@ | |||
| 19 | For definitive information on HPFS, ask somebody else -- this is guesswork. | 19 | For definitive information on HPFS, ask somebody else -- this is guesswork. |
| 20 | There are certain to be many mistakes. */ | 20 | There are certain to be many mistakes. */ |
| 21 | 21 | ||
| 22 | #if !defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN) | ||
| 23 | #error unknown endian | ||
| 24 | #endif | ||
| 25 | |||
| 22 | /* Notation */ | 26 | /* Notation */ |
| 23 | 27 | ||
| 24 | typedef unsigned secno; /* sector number, partition relative */ | 28 | typedef u32 secno; /* sector number, partition relative */ |
| 25 | 29 | ||
| 26 | typedef secno dnode_secno; /* sector number of a dnode */ | 30 | typedef secno dnode_secno; /* sector number of a dnode */ |
| 27 | typedef secno fnode_secno; /* sector number of an fnode */ | 31 | typedef secno fnode_secno; /* sector number of an fnode */ |
| @@ -38,28 +42,28 @@ typedef u32 time32_t; /* 32-bit time_t type */ | |||
| 38 | 42 | ||
| 39 | struct hpfs_boot_block | 43 | struct hpfs_boot_block |
| 40 | { | 44 | { |
| 41 | unsigned char jmp[3]; | 45 | u8 jmp[3]; |
| 42 | unsigned char oem_id[8]; | 46 | u8 oem_id[8]; |
| 43 | unsigned char bytes_per_sector[2]; /* 512 */ | 47 | u8 bytes_per_sector[2]; /* 512 */ |
| 44 | unsigned char sectors_per_cluster; | 48 | u8 sectors_per_cluster; |
| 45 | unsigned char n_reserved_sectors[2]; | 49 | u8 n_reserved_sectors[2]; |
| 46 | unsigned char n_fats; | 50 | u8 n_fats; |
| 47 | unsigned char n_rootdir_entries[2]; | 51 | u8 n_rootdir_entries[2]; |
| 48 | unsigned char n_sectors_s[2]; | 52 | u8 n_sectors_s[2]; |
| 49 | unsigned char media_byte; | 53 | u8 media_byte; |
| 50 | unsigned short sectors_per_fat; | 54 | u16 sectors_per_fat; |
| 51 | unsigned short sectors_per_track; | 55 | u16 sectors_per_track; |
| 52 | unsigned short heads_per_cyl; | 56 | u16 heads_per_cyl; |
| 53 | unsigned int n_hidden_sectors; | 57 | u32 n_hidden_sectors; |
| 54 | unsigned int n_sectors_l; /* size of partition */ | 58 | u32 n_sectors_l; /* size of partition */ |
| 55 | unsigned char drive_number; | 59 | u8 drive_number; |
| 56 | unsigned char mbz; | 60 | u8 mbz; |
| 57 | unsigned char sig_28h; /* 28h */ | 61 | u8 sig_28h; /* 28h */ |
| 58 | unsigned char vol_serno[4]; | 62 | u8 vol_serno[4]; |
| 59 | unsigned char vol_label[11]; | 63 | u8 vol_label[11]; |
| 60 | unsigned char sig_hpfs[8]; /* "HPFS " */ | 64 | u8 sig_hpfs[8]; /* "HPFS " */ |
| 61 | unsigned char pad[448]; | 65 | u8 pad[448]; |
| 62 | unsigned short magic; /* aa55 */ | 66 | u16 magic; /* aa55 */ |
| 63 | }; | 67 | }; |
| 64 | 68 | ||
| 65 | 69 | ||
| @@ -71,31 +75,29 @@ struct hpfs_boot_block | |||
| 71 | 75 | ||
| 72 | struct hpfs_super_block | 76 | struct hpfs_super_block |
| 73 | { | 77 | { |
| 74 | unsigned magic; /* f995 e849 */ | 78 | u32 magic; /* f995 e849 */ |
| 75 | unsigned magic1; /* fa53 e9c5, more magic? */ | 79 | u32 magic1; /* fa53 e9c5, more magic? */ |
| 76 | /*unsigned huh202;*/ /* ?? 202 = N. of B. in 1.00390625 S.*/ | 80 | u8 version; /* version of a filesystem usually 2 */ |
| 77 | char version; /* version of a filesystem usually 2 */ | 81 | u8 funcversion; /* functional version - oldest version |
| 78 | char funcversion; /* functional version - oldest version | ||
| 79 | of filesystem that can understand | 82 | of filesystem that can understand |
| 80 | this disk */ | 83 | this disk */ |
| 81 | unsigned short int zero; /* 0 */ | 84 | u16 zero; /* 0 */ |
| 82 | fnode_secno root; /* fnode of root directory */ | 85 | fnode_secno root; /* fnode of root directory */ |
| 83 | secno n_sectors; /* size of filesystem */ | 86 | secno n_sectors; /* size of filesystem */ |
| 84 | unsigned n_badblocks; /* number of bad blocks */ | 87 | u32 n_badblocks; /* number of bad blocks */ |
| 85 | secno bitmaps; /* pointers to free space bit maps */ | 88 | secno bitmaps; /* pointers to free space bit maps */ |
| 86 | unsigned zero1; /* 0 */ | 89 | u32 zero1; /* 0 */ |
| 87 | secno badblocks; /* bad block list */ | 90 | secno badblocks; /* bad block list */ |
| 88 | unsigned zero3; /* 0 */ | 91 | u32 zero3; /* 0 */ |
| 89 | time32_t last_chkdsk; /* date last checked, 0 if never */ | 92 | time32_t last_chkdsk; /* date last checked, 0 if never */ |
| 90 | /*unsigned zero4;*/ /* 0 */ | 93 | time32_t last_optimize; /* date last optimized, 0 if never */ |
| 91 | time32_t last_optimize; /* date last optimized, 0 if never */ | ||
| 92 | secno n_dir_band; /* number of sectors in dir band */ | 94 | secno n_dir_band; /* number of sectors in dir band */ |
| 93 | secno dir_band_start; /* first sector in dir band */ | 95 | secno dir_band_start; /* first sector in dir band */ |
| 94 | secno dir_band_end; /* last sector in dir band */ | 96 | secno dir_band_end; /* last sector in dir band */ |
| 95 | secno dir_band_bitmap; /* free space map, 1 dnode per bit */ | 97 | secno dir_band_bitmap; /* free space map, 1 dnode per bit */ |
| 96 | char volume_name[32]; /* not used */ | 98 | u8 volume_name[32]; /* not used */ |
| 97 | secno user_id_table; /* 8 preallocated sectors - user id */ | 99 | secno user_id_table; /* 8 preallocated sectors - user id */ |
| 98 | unsigned zero6[103]; /* 0 */ | 100 | u32 zero6[103]; /* 0 */ |
| 99 | }; | 101 | }; |
| 100 | 102 | ||
| 101 | 103 | ||
| @@ -107,44 +109,65 @@ struct hpfs_super_block | |||
| 107 | 109 | ||
| 108 | struct hpfs_spare_block | 110 | struct hpfs_spare_block |
| 109 | { | 111 | { |
| 110 | unsigned magic; /* f991 1849 */ | 112 | u32 magic; /* f991 1849 */ |
| 111 | unsigned magic1; /* fa52 29c5, more magic? */ | 113 | u32 magic1; /* fa52 29c5, more magic? */ |
| 112 | 114 | ||
| 113 | unsigned dirty: 1; /* 0 clean, 1 "improperly stopped" */ | 115 | #ifdef __LITTLE_ENDIAN |
| 114 | /*unsigned flag1234: 4;*/ /* unknown flags */ | 116 | u8 dirty: 1; /* 0 clean, 1 "improperly stopped" */ |
| 115 | unsigned sparedir_used: 1; /* spare dirblks used */ | 117 | u8 sparedir_used: 1; /* spare dirblks used */ |
| 116 | unsigned hotfixes_used: 1; /* hotfixes used */ | 118 | u8 hotfixes_used: 1; /* hotfixes used */ |
| 117 | unsigned bad_sector: 1; /* bad sector, corrupted disk (???) */ | 119 | u8 bad_sector: 1; /* bad sector, corrupted disk (???) */ |
| 118 | unsigned bad_bitmap: 1; /* bad bitmap */ | 120 | u8 bad_bitmap: 1; /* bad bitmap */ |
| 119 | unsigned fast: 1; /* partition was fast formatted */ | 121 | u8 fast: 1; /* partition was fast formatted */ |
| 120 | unsigned old_wrote: 1; /* old version wrote to partion */ | 122 | u8 old_wrote: 1; /* old version wrote to partion */ |
| 121 | unsigned old_wrote_1: 1; /* old version wrote to partion (?) */ | 123 | u8 old_wrote_1: 1; /* old version wrote to partion (?) */ |
| 122 | unsigned install_dasd_limits: 1; /* HPFS386 flags */ | 124 | #else |
| 123 | unsigned resynch_dasd_limits: 1; | 125 | u8 old_wrote_1: 1; /* old version wrote to partion (?) */ |
| 124 | unsigned dasd_limits_operational: 1; | 126 | u8 old_wrote: 1; /* old version wrote to partion */ |
| 125 | unsigned multimedia_active: 1; | 127 | u8 fast: 1; /* partition was fast formatted */ |
| 126 | unsigned dce_acls_active: 1; | 128 | u8 bad_bitmap: 1; /* bad bitmap */ |
| 127 | unsigned dasd_limits_dirty: 1; | 129 | u8 bad_sector: 1; /* bad sector, corrupted disk (???) */ |
| 128 | unsigned flag67: 2; | 130 | u8 hotfixes_used: 1; /* hotfixes used */ |
| 129 | unsigned char mm_contlgulty; | 131 | u8 sparedir_used: 1; /* spare dirblks used */ |
| 130 | unsigned char unused; | 132 | u8 dirty: 1; /* 0 clean, 1 "improperly stopped" */ |
| 133 | #endif | ||
| 134 | |||
| 135 | #ifdef __LITTLE_ENDIAN | ||
| 136 | u8 install_dasd_limits: 1; /* HPFS386 flags */ | ||
| 137 | u8 resynch_dasd_limits: 1; | ||
| 138 | u8 dasd_limits_operational: 1; | ||
| 139 | u8 multimedia_active: 1; | ||
| 140 | u8 dce_acls_active: 1; | ||
| 141 | u8 dasd_limits_dirty: 1; | ||
| 142 | u8 flag67: 2; | ||
| 143 | #else | ||
| 144 | u8 flag67: 2; | ||
| 145 | u8 dasd_limits_dirty: 1; | ||
| 146 | u8 dce_acls_active: 1; | ||
| 147 | u8 multimedia_active: 1; | ||
| 148 | u8 dasd_limits_operational: 1; | ||
| 149 | u8 resynch_dasd_limits: 1; | ||
| 150 | u8 install_dasd_limits: 1; /* HPFS386 flags */ | ||
| 151 | #endif | ||
| 152 | |||
| 153 | u8 mm_contlgulty; | ||
| 154 | u8 unused; | ||
| 131 | 155 | ||
| 132 | secno hotfix_map; /* info about remapped bad sectors */ | 156 | secno hotfix_map; /* info about remapped bad sectors */ |
| 133 | unsigned n_spares_used; /* number of hotfixes */ | 157 | u32 n_spares_used; /* number of hotfixes */ |
| 134 | unsigned n_spares; /* number of spares in hotfix map */ | 158 | u32 n_spares; /* number of spares in hotfix map */ |
| 135 | unsigned n_dnode_spares_free; /* spare dnodes unused */ | 159 | u32 n_dnode_spares_free; /* spare dnodes unused */ |
| 136 | unsigned n_dnode_spares; /* length of spare_dnodes[] list, | 160 | u32 n_dnode_spares; /* length of spare_dnodes[] list, |
| 137 | follows in this block*/ | 161 | follows in this block*/ |
| 138 | secno code_page_dir; /* code page directory block */ | 162 | secno code_page_dir; /* code page directory block */ |
| 139 | unsigned n_code_pages; /* number of code pages */ | 163 | u32 n_code_pages; /* number of code pages */ |
| 140 | /*unsigned large_numbers[2];*/ /* ?? */ | 164 | u32 super_crc; /* on HPFS386 and LAN Server this is |
| 141 | unsigned super_crc; /* on HPFS386 and LAN Server this is | ||
| 142 | checksum of superblock, on normal | 165 | checksum of superblock, on normal |
| 143 | OS/2 unused */ | 166 | OS/2 unused */ |
| 144 | unsigned spare_crc; /* on HPFS386 checksum of spareblock */ | 167 | u32 spare_crc; /* on HPFS386 checksum of spareblock */ |
| 145 | unsigned zero1[15]; /* unused */ | 168 | u32 zero1[15]; /* unused */ |
| 146 | dnode_secno spare_dnodes[100]; /* emergency free dnode list */ | 169 | dnode_secno spare_dnodes[100]; /* emergency free dnode list */ |
| 147 | unsigned zero2[1]; /* room for more? */ | 170 | u32 zero2[1]; /* room for more? */ |
| 148 | }; | 171 | }; |
| 149 | 172 | ||
| 150 | /* The bad block list is 4 sectors long. The first word must be zero, | 173 | /* The bad block list is 4 sectors long. The first word must be zero, |
| @@ -179,18 +202,18 @@ struct hpfs_spare_block | |||
| 179 | 202 | ||
| 180 | struct code_page_directory | 203 | struct code_page_directory |
| 181 | { | 204 | { |
| 182 | unsigned magic; /* 4945 21f7 */ | 205 | u32 magic; /* 4945 21f7 */ |
| 183 | unsigned n_code_pages; /* number of pointers following */ | 206 | u32 n_code_pages; /* number of pointers following */ |
| 184 | unsigned zero1[2]; | 207 | u32 zero1[2]; |
| 185 | struct { | 208 | struct { |
| 186 | unsigned short ix; /* index */ | 209 | u16 ix; /* index */ |
| 187 | unsigned short code_page_number; /* code page number */ | 210 | u16 code_page_number; /* code page number */ |
| 188 | unsigned bounds; /* matches corresponding word | 211 | u32 bounds; /* matches corresponding word |
| 189 | in data block */ | 212 | in data block */ |
| 190 | secno code_page_data; /* sector number of a code_page_data | 213 | secno code_page_data; /* sector number of a code_page_data |
| 191 | containing c.p. array */ | 214 | containing c.p. array */ |
| 192 | unsigned short index; /* index in c.p. array in that sector*/ | 215 | u16 index; /* index in c.p. array in that sector*/ |
| 193 | unsigned short unknown; /* some unknown value; usually 0; | 216 | u16 unknown; /* some unknown value; usually 0; |
| 194 | 2 in Japanese version */ | 217 | 2 in Japanese version */ |
| 195 | } array[31]; /* unknown length */ | 218 | } array[31]; /* unknown length */ |
| 196 | }; | 219 | }; |
| @@ -201,21 +224,21 @@ struct code_page_directory | |||
| 201 | 224 | ||
| 202 | struct code_page_data | 225 | struct code_page_data |
| 203 | { | 226 | { |
| 204 | unsigned magic; /* 8945 21f7 */ | 227 | u32 magic; /* 8945 21f7 */ |
| 205 | unsigned n_used; /* # elements used in c_p_data[] */ | 228 | u32 n_used; /* # elements used in c_p_data[] */ |
| 206 | unsigned bounds[3]; /* looks a bit like | 229 | u32 bounds[3]; /* looks a bit like |
| 207 | (beg1,end1), (beg2,end2) | 230 | (beg1,end1), (beg2,end2) |
| 208 | one byte each */ | 231 | one byte each */ |
| 209 | unsigned short offs[3]; /* offsets from start of sector | 232 | u16 offs[3]; /* offsets from start of sector |
| 210 | to start of c_p_data[ix] */ | 233 | to start of c_p_data[ix] */ |
| 211 | struct { | 234 | struct { |
| 212 | unsigned short ix; /* index */ | 235 | u16 ix; /* index */ |
| 213 | unsigned short code_page_number; /* code page number */ | 236 | u16 code_page_number; /* code page number */ |
| 214 | unsigned short unknown; /* the same as in cp directory */ | 237 | u16 unknown; /* the same as in cp directory */ |
| 215 | unsigned char map[128]; /* upcase table for chars 80..ff */ | 238 | u8 map[128]; /* upcase table for chars 80..ff */ |
| 216 | unsigned short zero2; | 239 | u16 zero2; |
| 217 | } code_page[3]; | 240 | } code_page[3]; |
| 218 | unsigned char incognita[78]; | 241 | u8 incognita[78]; |
| 219 | }; | 242 | }; |
| 220 | 243 | ||
| 221 | 244 | ||
| @@ -255,50 +278,84 @@ struct code_page_data | |||
| 255 | #define DNODE_MAGIC 0x77e40aae | 278 | #define DNODE_MAGIC 0x77e40aae |
| 256 | 279 | ||
| 257 | struct dnode { | 280 | struct dnode { |
| 258 | unsigned magic; /* 77e4 0aae */ | 281 | u32 magic; /* 77e4 0aae */ |
| 259 | unsigned first_free; /* offset from start of dnode to | 282 | u32 first_free; /* offset from start of dnode to |
| 260 | first free dir entry */ | 283 | first free dir entry */ |
| 261 | unsigned root_dnode:1; /* Is it root dnode? */ | 284 | #ifdef __LITTLE_ENDIAN |
| 262 | unsigned increment_me:31; /* some kind of activity counter? | 285 | u8 root_dnode: 1; /* Is it root dnode? */ |
| 263 | Neither HPFS.IFS nor CHKDSK cares | 286 | u8 increment_me: 7; /* some kind of activity counter? */ |
| 287 | /* Neither HPFS.IFS nor CHKDSK cares | ||
| 288 | if you change this word */ | ||
| 289 | #else | ||
| 290 | u8 increment_me: 7; /* some kind of activity counter? */ | ||
| 291 | /* Neither HPFS.IFS nor CHKDSK cares | ||
| 264 | if you change this word */ | 292 | if you change this word */ |
| 293 | u8 root_dnode: 1; /* Is it root dnode? */ | ||
| 294 | #endif | ||
| 295 | u8 increment_me2[3]; | ||
| 265 | secno up; /* (root dnode) directory's fnode | 296 | secno up; /* (root dnode) directory's fnode |
| 266 | (nonroot) parent dnode */ | 297 | (nonroot) parent dnode */ |
| 267 | dnode_secno self; /* pointer to this dnode */ | 298 | dnode_secno self; /* pointer to this dnode */ |
| 268 | unsigned char dirent[2028]; /* one or more dirents */ | 299 | u8 dirent[2028]; /* one or more dirents */ |
| 269 | }; | 300 | }; |
| 270 | 301 | ||
| 271 | struct hpfs_dirent { | 302 | struct hpfs_dirent { |
| 272 | unsigned short length; /* offset to next dirent */ | 303 | u16 length; /* offset to next dirent */ |
| 273 | unsigned first: 1; /* set on phony ^A^A (".") entry */ | 304 | |
| 274 | unsigned has_acl: 1; | 305 | #ifdef __LITTLE_ENDIAN |
| 275 | unsigned down: 1; /* down pointer present (after name) */ | 306 | u8 first: 1; /* set on phony ^A^A (".") entry */ |
| 276 | unsigned last: 1; /* set on phony \377 entry */ | 307 | u8 has_acl: 1; |
| 277 | unsigned has_ea: 1; /* entry has EA */ | 308 | u8 down: 1; /* down pointer present (after name) */ |
| 278 | unsigned has_xtd_perm: 1; /* has extended perm list (???) */ | 309 | u8 last: 1; /* set on phony \377 entry */ |
| 279 | unsigned has_explicit_acl: 1; | 310 | u8 has_ea: 1; /* entry has EA */ |
| 280 | unsigned has_needea: 1; /* ?? some EA has NEEDEA set | 311 | u8 has_xtd_perm: 1; /* has extended perm list (???) */ |
| 312 | u8 has_explicit_acl: 1; | ||
| 313 | u8 has_needea: 1; /* ?? some EA has NEEDEA set | ||
| 314 | I have no idea why this is | ||
| 315 | interesting in a dir entry */ | ||
| 316 | #else | ||
| 317 | u8 has_needea: 1; /* ?? some EA has NEEDEA set | ||
| 281 | I have no idea why this is | 318 | I have no idea why this is |
| 282 | interesting in a dir entry */ | 319 | interesting in a dir entry */ |
| 283 | unsigned read_only: 1; /* dos attrib */ | 320 | u8 has_explicit_acl: 1; |
| 284 | unsigned hidden: 1; /* dos attrib */ | 321 | u8 has_xtd_perm: 1; /* has extended perm list (???) */ |
| 285 | unsigned system: 1; /* dos attrib */ | 322 | u8 has_ea: 1; /* entry has EA */ |
| 286 | unsigned flag11: 1; /* would be volume label dos attrib */ | 323 | u8 last: 1; /* set on phony \377 entry */ |
| 287 | unsigned directory: 1; /* dos attrib */ | 324 | u8 down: 1; /* down pointer present (after name) */ |
| 288 | unsigned archive: 1; /* dos attrib */ | 325 | u8 has_acl: 1; |
| 289 | unsigned not_8x3: 1; /* name is not 8.3 */ | 326 | u8 first: 1; /* set on phony ^A^A (".") entry */ |
| 290 | unsigned flag15: 1; | 327 | #endif |
| 328 | |||
| 329 | #ifdef __LITTLE_ENDIAN | ||
| 330 | u8 read_only: 1; /* dos attrib */ | ||
| 331 | u8 hidden: 1; /* dos attrib */ | ||
| 332 | u8 system: 1; /* dos attrib */ | ||
| 333 | u8 flag11: 1; /* would be volume label dos attrib */ | ||
| 334 | u8 directory: 1; /* dos attrib */ | ||
| 335 | u8 archive: 1; /* dos attrib */ | ||
| 336 | u8 not_8x3: 1; /* name is not 8.3 */ | ||
| 337 | u8 flag15: 1; | ||
| 338 | #else | ||
| 339 | u8 flag15: 1; | ||
| 340 | u8 not_8x3: 1; /* name is not 8.3 */ | ||
| 341 | u8 archive: 1; /* dos attrib */ | ||
| 342 | u8 directory: 1; /* dos attrib */ | ||
| 343 | u8 flag11: 1; /* would be volume label dos attrib */ | ||
| 344 | u8 system: 1; /* dos attrib */ | ||
| 345 | u8 hidden: 1; /* dos attrib */ | ||
| 346 | u8 read_only: 1; /* dos attrib */ | ||
| 347 | #endif | ||
| 348 | |||
| 291 | fnode_secno fnode; /* fnode giving allocation info */ | 349 | fnode_secno fnode; /* fnode giving allocation info */ |
| 292 | time32_t write_date; /* mtime */ | 350 | time32_t write_date; /* mtime */ |
| 293 | unsigned file_size; /* file length, bytes */ | 351 | u32 file_size; /* file length, bytes */ |
| 294 | time32_t read_date; /* atime */ | 352 | time32_t read_date; /* atime */ |
| 295 | time32_t creation_date; /* ctime */ | 353 | time32_t creation_date; /* ctime */ |
| 296 | unsigned ea_size; /* total EA length, bytes */ | 354 | u32 ea_size; /* total EA length, bytes */ |
| 297 | unsigned char no_of_acls : 3; /* number of ACL's */ | 355 | u8 no_of_acls; /* number of ACL's (low 3 bits) */ |
| 298 | unsigned char reserver : 5; | 356 | u8 ix; /* code page index (of filename), see |
| 299 | unsigned char ix; /* code page index (of filename), see | ||
| 300 | struct code_page_data */ | 357 | struct code_page_data */ |
| 301 | unsigned char namelen, name[1]; /* file name */ | 358 | u8 namelen, name[1]; /* file name */ |
| 302 | /* dnode_secno down; btree down pointer, if present, | 359 | /* dnode_secno down; btree down pointer, if present, |
| 303 | follows name on next word boundary, or maybe it | 360 | follows name on next word boundary, or maybe it |
| 304 | precedes next dirent, which is on a word boundary. */ | 361 | precedes next dirent, which is on a word boundary. */ |
| @@ -318,38 +375,50 @@ struct hpfs_dirent { | |||
| 318 | 375 | ||
| 319 | struct bplus_leaf_node | 376 | struct bplus_leaf_node |
| 320 | { | 377 | { |
| 321 | unsigned file_secno; /* first file sector in extent */ | 378 | u32 file_secno; /* first file sector in extent */ |
| 322 | unsigned length; /* length, sectors */ | 379 | u32 length; /* length, sectors */ |
| 323 | secno disk_secno; /* first corresponding disk sector */ | 380 | secno disk_secno; /* first corresponding disk sector */ |
| 324 | }; | 381 | }; |
| 325 | 382 | ||
| 326 | struct bplus_internal_node | 383 | struct bplus_internal_node |
| 327 | { | 384 | { |
| 328 | unsigned file_secno; /* subtree maps sectors < this */ | 385 | u32 file_secno; /* subtree maps sectors < this */ |
| 329 | anode_secno down; /* pointer to subtree */ | 386 | anode_secno down; /* pointer to subtree */ |
| 330 | }; | 387 | }; |
| 331 | 388 | ||
| 332 | struct bplus_header | 389 | struct bplus_header |
| 333 | { | 390 | { |
| 334 | unsigned hbff: 1; /* high bit of first free entry offset */ | 391 | #ifdef __LITTLE_ENDIAN |
| 335 | unsigned flag1: 1; | 392 | u8 hbff: 1; /* high bit of first free entry offset */ |
| 336 | unsigned flag2: 1; | 393 | u8 flag1234: 4; |
| 337 | unsigned flag3: 1; | 394 | u8 fnode_parent: 1; /* ? we're pointed to by an fnode, |
| 338 | unsigned flag4: 1; | ||
| 339 | unsigned fnode_parent: 1; /* ? we're pointed to by an fnode, | ||
| 340 | the data btree or some ea or the | 395 | the data btree or some ea or the |
| 341 | main ea bootage pointer ea_secno */ | 396 | main ea bootage pointer ea_secno */ |
| 342 | /* also can get set in fnodes, which | 397 | /* also can get set in fnodes, which |
| 343 | may be a chkdsk glitch or may mean | 398 | may be a chkdsk glitch or may mean |
| 344 | this bit is irrelevant in fnodes, | 399 | this bit is irrelevant in fnodes, |
| 345 | or this interpretation is all wet */ | 400 | or this interpretation is all wet */ |
| 346 | unsigned binary_search: 1; /* suggest binary search (unused) */ | 401 | u8 binary_search: 1; /* suggest binary search (unused) */ |
| 347 | unsigned internal: 1; /* 1 -> (internal) tree of anodes | 402 | u8 internal: 1; /* 1 -> (internal) tree of anodes |
| 403 | 0 -> (leaf) list of extents */ | ||
| 404 | #else | ||
| 405 | u8 internal: 1; /* 1 -> (internal) tree of anodes | ||
| 348 | 0 -> (leaf) list of extents */ | 406 | 0 -> (leaf) list of extents */ |
| 349 | unsigned char fill[3]; | 407 | u8 binary_search: 1; /* suggest binary search (unused) */ |
| 350 | unsigned char n_free_nodes; /* free nodes in following array */ | 408 | u8 fnode_parent: 1; /* ? we're pointed to by an fnode, |
| 351 | unsigned char n_used_nodes; /* used nodes in following array */ | 409 | the data btree or some ea or the |
| 352 | unsigned short first_free; /* offset from start of header to | 410 | main ea bootage pointer ea_secno */ |
| 411 | /* also can get set in fnodes, which | ||
| 412 | may be a chkdsk glitch or may mean | ||
| 413 | this bit is irrelevant in fnodes, | ||
| 414 | or this interpretation is all wet */ | ||
| 415 | u8 flag1234: 4; | ||
| 416 | u8 hbff: 1; /* high bit of first free entry offset */ | ||
| 417 | #endif | ||
| 418 | u8 fill[3]; | ||
| 419 | u8 n_free_nodes; /* free nodes in following array */ | ||
| 420 | u8 n_used_nodes; /* used nodes in following array */ | ||
| 421 | u16 first_free; /* offset from start of header to | ||
| 353 | first free node in array */ | 422 | first free node in array */ |
| 354 | union { | 423 | union { |
| 355 | struct bplus_internal_node internal[0]; /* (internal) 2-word entries giving | 424 | struct bplus_internal_node internal[0]; /* (internal) 2-word entries giving |
| @@ -369,37 +438,38 @@ struct bplus_header | |||
| 369 | 438 | ||
| 370 | struct fnode | 439 | struct fnode |
| 371 | { | 440 | { |
| 372 | unsigned magic; /* f7e4 0aae */ | 441 | u32 magic; /* f7e4 0aae */ |
| 373 | unsigned zero1[2]; /* read history */ | 442 | u32 zero1[2]; /* read history */ |
| 374 | unsigned char len, name[15]; /* true length, truncated name */ | 443 | u8 len, name[15]; /* true length, truncated name */ |
| 375 | fnode_secno up; /* pointer to file's directory fnode */ | 444 | fnode_secno up; /* pointer to file's directory fnode */ |
| 376 | /*unsigned zero2[3];*/ | ||
| 377 | secno acl_size_l; | 445 | secno acl_size_l; |
| 378 | secno acl_secno; | 446 | secno acl_secno; |
| 379 | unsigned short acl_size_s; | 447 | u16 acl_size_s; |
| 380 | char acl_anode; | 448 | u8 acl_anode; |
| 381 | char zero2; /* history bit count */ | 449 | u8 zero2; /* history bit count */ |
| 382 | unsigned ea_size_l; /* length of disk-resident ea's */ | 450 | u32 ea_size_l; /* length of disk-resident ea's */ |
| 383 | secno ea_secno; /* first sector of disk-resident ea's*/ | 451 | secno ea_secno; /* first sector of disk-resident ea's*/ |
| 384 | unsigned short ea_size_s; /* length of fnode-resident ea's */ | 452 | u16 ea_size_s; /* length of fnode-resident ea's */ |
| 385 | 453 | ||
| 386 | unsigned flag0: 1; | 454 | #ifdef __LITTLE_ENDIAN |
| 387 | unsigned ea_anode: 1; /* 1 -> ea_secno is an anode */ | 455 | u8 flag0: 1; |
| 388 | unsigned flag2: 1; | 456 | u8 ea_anode: 1; /* 1 -> ea_secno is an anode */ |
| 389 | unsigned flag3: 1; | 457 | u8 flag234567: 6; |
| 390 | unsigned flag4: 1; | 458 | #else |
| 391 | unsigned flag5: 1; | 459 | u8 flag234567: 6; |
| 392 | unsigned flag6: 1; | 460 | u8 ea_anode: 1; /* 1 -> ea_secno is an anode */ |
| 393 | unsigned flag7: 1; | 461 | u8 flag0: 1; |
| 394 | unsigned dirflag: 1; /* 1 -> directory. first & only extent | 462 | #endif |
| 463 | |||
| 464 | #ifdef __LITTLE_ENDIAN | ||
| 465 | u8 dirflag: 1; /* 1 -> directory. first & only extent | ||
| 395 | points to dnode. */ | 466 | points to dnode. */ |
| 396 | unsigned flag9: 1; | 467 | u8 flag9012345: 7; |
| 397 | unsigned flag10: 1; | 468 | #else |
| 398 | unsigned flag11: 1; | 469 | u8 flag9012345: 7; |
| 399 | unsigned flag12: 1; | 470 | u8 dirflag: 1; /* 1 -> directory. first & only extent |
| 400 | unsigned flag13: 1; | 471 | points to dnode. */ |
| 401 | unsigned flag14: 1; | 472 | #endif |
| 402 | unsigned flag15: 1; | ||
| 403 | 473 | ||
| 404 | struct bplus_header btree; /* b+ tree, 8 extents or 12 subtrees */ | 474 | struct bplus_header btree; /* b+ tree, 8 extents or 12 subtrees */ |
| 405 | union { | 475 | union { |
| @@ -407,17 +477,16 @@ struct fnode | |||
| 407 | struct bplus_internal_node internal[12]; | 477 | struct bplus_internal_node internal[12]; |
| 408 | } u; | 478 | } u; |
| 409 | 479 | ||
| 410 | unsigned file_size; /* file length, bytes */ | 480 | u32 file_size; /* file length, bytes */ |
| 411 | unsigned n_needea; /* number of EA's with NEEDEA set */ | 481 | u32 n_needea; /* number of EA's with NEEDEA set */ |
| 412 | char user_id[16]; /* unused */ | 482 | u8 user_id[16]; /* unused */ |
| 413 | unsigned short ea_offs; /* offset from start of fnode | 483 | u16 ea_offs; /* offset from start of fnode |
| 414 | to first fnode-resident ea */ | 484 | to first fnode-resident ea */ |
| 415 | char dasd_limit_treshhold; | 485 | u8 dasd_limit_treshhold; |
| 416 | char dasd_limit_delta; | 486 | u8 dasd_limit_delta; |
| 417 | unsigned dasd_limit; | 487 | u32 dasd_limit; |
| 418 | unsigned dasd_usage; | 488 | u32 dasd_usage; |
| 419 | /*unsigned zero5[2];*/ | 489 | u8 ea[316]; /* zero or more EA's, packed together |
| 420 | unsigned char ea[316]; /* zero or more EA's, packed together | ||
| 421 | with no alignment padding. | 490 | with no alignment padding. |
| 422 | (Do not use this name, get here | 491 | (Do not use this name, get here |
| 423 | via fnode + ea_offs. I think.) */ | 492 | via fnode + ea_offs. I think.) */ |
| @@ -430,7 +499,7 @@ struct fnode | |||
| 430 | 499 | ||
| 431 | struct anode | 500 | struct anode |
| 432 | { | 501 | { |
| 433 | unsigned magic; /* 37e4 0aae */ | 502 | u32 magic; /* 37e4 0aae */ |
| 434 | anode_secno self; /* pointer to this anode */ | 503 | anode_secno self; /* pointer to this anode */ |
| 435 | secno up; /* parent anode or fnode */ | 504 | secno up; /* parent anode or fnode */ |
| 436 | 505 | ||
| @@ -440,7 +509,7 @@ struct anode | |||
| 440 | struct bplus_internal_node internal[60]; | 509 | struct bplus_internal_node internal[60]; |
| 441 | } u; | 510 | } u; |
| 442 | 511 | ||
| 443 | unsigned fill[3]; /* unused */ | 512 | u32 fill[3]; /* unused */ |
| 444 | }; | 513 | }; |
| 445 | 514 | ||
| 446 | 515 | ||
| @@ -461,25 +530,31 @@ struct anode | |||
| 461 | 530 | ||
| 462 | struct extended_attribute | 531 | struct extended_attribute |
| 463 | { | 532 | { |
| 464 | unsigned indirect: 1; /* 1 -> value gives sector number | 533 | #ifdef __LITTLE_ENDIAN |
| 534 | u8 indirect: 1; /* 1 -> value gives sector number | ||
| 465 | where real value starts */ | 535 | where real value starts */ |
| 466 | unsigned anode: 1; /* 1 -> sector is an anode | 536 | u8 anode: 1; /* 1 -> sector is an anode |
| 537 | that points to fragmented value */ | ||
| 538 | u8 flag23456: 5; | ||
| 539 | u8 needea: 1; /* required ea */ | ||
| 540 | #else | ||
| 541 | u8 needea: 1; /* required ea */ | ||
| 542 | u8 flag23456: 5; | ||
| 543 | u8 anode: 1; /* 1 -> sector is an anode | ||
| 467 | that points to fragmented value */ | 544 | that points to fragmented value */ |
| 468 | unsigned flag2: 1; | 545 | u8 indirect: 1; /* 1 -> value gives sector number |
| 469 | unsigned flag3: 1; | 546 | where real value starts */ |
| 470 | unsigned flag4: 1; | 547 | #endif |
| 471 | unsigned flag5: 1; | 548 | u8 namelen; /* length of name, bytes */ |
| 472 | unsigned flag6: 1; | 549 | u8 valuelen_lo; /* length of value, bytes */ |
| 473 | unsigned needea: 1; /* required ea */ | 550 | u8 valuelen_hi; /* length of value, bytes */ |
| 474 | unsigned char namelen; /* length of name, bytes */ | 551 | u8 name[0]; |
| 475 | unsigned short valuelen; /* length of value, bytes */ | ||
| 476 | unsigned char name[0]; | ||
| 477 | /* | 552 | /* |
| 478 | unsigned char name[namelen]; ascii attrib name | 553 | u8 name[namelen]; ascii attrib name |
| 479 | unsigned char nul; terminating '\0', not counted | 554 | u8 nul; terminating '\0', not counted |
| 480 | unsigned char value[valuelen]; value, arbitrary | 555 | u8 value[valuelen]; value, arbitrary |
| 481 | if this.indirect, valuelen is 8 and the value is | 556 | if this.indirect, valuelen is 8 and the value is |
| 482 | unsigned length; real length of value, bytes | 557 | u32 length; real length of value, bytes |
| 483 | secno secno; sector address where it starts | 558 | secno secno; sector address where it starts |
| 484 | if this.anode, the above sector number is the root of an anode tree | 559 | if this.anode, the above sector number is the root of an anode tree |
| 485 | which points to the value. | 560 | which points to the value. |
diff --git a/fs/hpfs/hpfs_fn.h b/fs/hpfs/hpfs_fn.h index c15adbca07ff..dd552f862c8f 100644 --- a/fs/hpfs/hpfs_fn.h +++ b/fs/hpfs/hpfs_fn.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #include <linux/pagemap.h> | 13 | #include <linux/pagemap.h> |
| 14 | #include <linux/buffer_head.h> | 14 | #include <linux/buffer_head.h> |
| 15 | #include <linux/slab.h> | 15 | #include <linux/slab.h> |
| 16 | #include <asm/unaligned.h> | ||
| 16 | 17 | ||
| 17 | #include "hpfs.h" | 18 | #include "hpfs.h" |
| 18 | 19 | ||
| @@ -51,18 +52,16 @@ struct hpfs_inode_info { | |||
| 51 | unsigned i_disk_sec; /* (files) minimalist cache of alloc info */ | 52 | unsigned i_disk_sec; /* (files) minimalist cache of alloc info */ |
| 52 | unsigned i_n_secs; /* (files) minimalist cache of alloc info */ | 53 | unsigned i_n_secs; /* (files) minimalist cache of alloc info */ |
| 53 | unsigned i_ea_size; /* size of extended attributes */ | 54 | unsigned i_ea_size; /* size of extended attributes */ |
| 54 | unsigned i_conv : 2; /* (files) crlf->newline hackery */ | ||
| 55 | unsigned i_ea_mode : 1; /* file's permission is stored in ea */ | 55 | unsigned i_ea_mode : 1; /* file's permission is stored in ea */ |
| 56 | unsigned i_ea_uid : 1; /* file's uid is stored in ea */ | 56 | unsigned i_ea_uid : 1; /* file's uid is stored in ea */ |
| 57 | unsigned i_ea_gid : 1; /* file's gid is stored in ea */ | 57 | unsigned i_ea_gid : 1; /* file's gid is stored in ea */ |
| 58 | unsigned i_dirty : 1; | 58 | unsigned i_dirty : 1; |
| 59 | struct mutex i_mutex; | ||
| 60 | struct mutex i_parent_mutex; | ||
| 61 | loff_t **i_rddir_off; | 59 | loff_t **i_rddir_off; |
| 62 | struct inode vfs_inode; | 60 | struct inode vfs_inode; |
| 63 | }; | 61 | }; |
| 64 | 62 | ||
| 65 | struct hpfs_sb_info { | 63 | struct hpfs_sb_info { |
| 64 | struct mutex hpfs_mutex; /* global hpfs lock */ | ||
| 66 | ino_t sb_root; /* inode number of root dir */ | 65 | ino_t sb_root; /* inode number of root dir */ |
| 67 | unsigned sb_fs_size; /* file system size, sectors */ | 66 | unsigned sb_fs_size; /* file system size, sectors */ |
| 68 | unsigned sb_bitmaps; /* sector number of bitmap list */ | 67 | unsigned sb_bitmaps; /* sector number of bitmap list */ |
| @@ -74,7 +73,6 @@ struct hpfs_sb_info { | |||
| 74 | uid_t sb_uid; /* uid from mount options */ | 73 | uid_t sb_uid; /* uid from mount options */ |
| 75 | gid_t sb_gid; /* gid from mount options */ | 74 | gid_t sb_gid; /* gid from mount options */ |
| 76 | umode_t sb_mode; /* mode from mount options */ | 75 | umode_t sb_mode; /* mode from mount options */ |
| 77 | unsigned sb_conv : 2; /* crlf->newline hackery */ | ||
| 78 | unsigned sb_eas : 2; /* eas: 0-ignore, 1-ro, 2-rw */ | 76 | unsigned sb_eas : 2; /* eas: 0-ignore, 1-ro, 2-rw */ |
| 79 | unsigned sb_err : 2; /* on errs: 0-cont, 1-ro, 2-panic */ | 77 | unsigned sb_err : 2; /* on errs: 0-cont, 1-ro, 2-panic */ |
| 80 | unsigned sb_chk : 2; /* checks: 0-no, 1-normal, 2-strict */ | 78 | unsigned sb_chk : 2; /* checks: 0-no, 1-normal, 2-strict */ |
| @@ -87,20 +85,9 @@ struct hpfs_sb_info { | |||
| 87 | unsigned *sb_bmp_dir; /* main bitmap directory */ | 85 | unsigned *sb_bmp_dir; /* main bitmap directory */ |
| 88 | unsigned sb_c_bitmap; /* current bitmap */ | 86 | unsigned sb_c_bitmap; /* current bitmap */ |
| 89 | unsigned sb_max_fwd_alloc; /* max forwad allocation */ | 87 | unsigned sb_max_fwd_alloc; /* max forwad allocation */ |
| 90 | struct mutex hpfs_creation_de; /* when creating dirents, nobody else | ||
| 91 | can alloc blocks */ | ||
| 92 | /*unsigned sb_mounting : 1;*/ | ||
| 93 | int sb_timeshift; | 88 | int sb_timeshift; |
| 94 | }; | 89 | }; |
| 95 | 90 | ||
| 96 | /* | ||
| 97 | * conv= options | ||
| 98 | */ | ||
| 99 | |||
| 100 | #define CONV_BINARY 0 /* no conversion */ | ||
| 101 | #define CONV_TEXT 1 /* crlf->newline */ | ||
| 102 | #define CONV_AUTO 2 /* decide based on file contents */ | ||
| 103 | |||
| 104 | /* Four 512-byte buffers and the 2k block obtained by concatenating them */ | 91 | /* Four 512-byte buffers and the 2k block obtained by concatenating them */ |
| 105 | 92 | ||
| 106 | struct quad_buffer_head { | 93 | struct quad_buffer_head { |
| @@ -113,7 +100,7 @@ struct quad_buffer_head { | |||
| 113 | static inline dnode_secno de_down_pointer (struct hpfs_dirent *de) | 100 | static inline dnode_secno de_down_pointer (struct hpfs_dirent *de) |
| 114 | { | 101 | { |
| 115 | CHKCOND(de->down,("HPFS: de_down_pointer: !de->down\n")); | 102 | CHKCOND(de->down,("HPFS: de_down_pointer: !de->down\n")); |
| 116 | return *(dnode_secno *) ((void *) de + de->length - 4); | 103 | return le32_to_cpu(*(dnode_secno *) ((void *) de + le16_to_cpu(de->length) - 4)); |
| 117 | } | 104 | } |
| 118 | 105 | ||
| 119 | /* The first dir entry in a dnode */ | 106 | /* The first dir entry in a dnode */ |
| @@ -127,41 +114,46 @@ static inline struct hpfs_dirent *dnode_first_de (struct dnode *dnode) | |||
| 127 | 114 | ||
| 128 | static inline struct hpfs_dirent *dnode_end_de (struct dnode *dnode) | 115 | static inline struct hpfs_dirent *dnode_end_de (struct dnode *dnode) |
| 129 | { | 116 | { |
| 130 | CHKCOND(dnode->first_free>=0x14 && dnode->first_free<=0xa00,("HPFS: dnode_end_de: dnode->first_free = %d\n",(int)dnode->first_free)); | 117 | CHKCOND(le32_to_cpu(dnode->first_free)>=0x14 && le32_to_cpu(dnode->first_free)<=0xa00,("HPFS: dnode_end_de: dnode->first_free = %x\n",(unsigned)le32_to_cpu(dnode->first_free))); |
| 131 | return (void *) dnode + dnode->first_free; | 118 | return (void *) dnode + le32_to_cpu(dnode->first_free); |
| 132 | } | 119 | } |
| 133 | 120 | ||
| 134 | /* The dir entry after dir entry de */ | 121 | /* The dir entry after dir entry de */ |
| 135 | 122 | ||
| 136 | static inline struct hpfs_dirent *de_next_de (struct hpfs_dirent *de) | 123 | static inline struct hpfs_dirent *de_next_de (struct hpfs_dirent *de) |
| 137 | { | 124 | { |
| 138 | CHKCOND(de->length>=0x20 && de->length<0x800,("HPFS: de_next_de: de->length = %d\n",(int)de->length)); | 125 | CHKCOND(le16_to_cpu(de->length)>=0x20 && le16_to_cpu(de->length)<0x800,("HPFS: de_next_de: de->length = %x\n",(unsigned)le16_to_cpu(de->length))); |
| 139 | return (void *) de + de->length; | 126 | return (void *) de + le16_to_cpu(de->length); |
| 140 | } | 127 | } |
| 141 | 128 | ||
| 142 | static inline struct extended_attribute *fnode_ea(struct fnode *fnode) | 129 | static inline struct extended_attribute *fnode_ea(struct fnode *fnode) |
| 143 | { | 130 | { |
| 144 | return (struct extended_attribute *)((char *)fnode + fnode->ea_offs + fnode->acl_size_s); | 131 | return (struct extended_attribute *)((char *)fnode + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s)); |
| 145 | } | 132 | } |
| 146 | 133 | ||
| 147 | static inline struct extended_attribute *fnode_end_ea(struct fnode *fnode) | 134 | static inline struct extended_attribute *fnode_end_ea(struct fnode *fnode) |
| 148 | { | 135 | { |
| 149 | return (struct extended_attribute *)((char *)fnode + fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s); | 136 | return (struct extended_attribute *)((char *)fnode + le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s)); |
| 137 | } | ||
| 138 | |||
| 139 | static unsigned ea_valuelen(struct extended_attribute *ea) | ||
| 140 | { | ||
| 141 | return ea->valuelen_lo + 256 * ea->valuelen_hi; | ||
| 150 | } | 142 | } |
| 151 | 143 | ||
| 152 | static inline struct extended_attribute *next_ea(struct extended_attribute *ea) | 144 | static inline struct extended_attribute *next_ea(struct extended_attribute *ea) |
| 153 | { | 145 | { |
| 154 | return (struct extended_attribute *)((char *)ea + 5 + ea->namelen + ea->valuelen); | 146 | return (struct extended_attribute *)((char *)ea + 5 + ea->namelen + ea_valuelen(ea)); |
| 155 | } | 147 | } |
| 156 | 148 | ||
| 157 | static inline secno ea_sec(struct extended_attribute *ea) | 149 | static inline secno ea_sec(struct extended_attribute *ea) |
| 158 | { | 150 | { |
| 159 | return *(secno *)((char *)ea + 9 + ea->namelen); | 151 | return le32_to_cpu(get_unaligned((secno *)((char *)ea + 9 + ea->namelen))); |
| 160 | } | 152 | } |
| 161 | 153 | ||
| 162 | static inline secno ea_len(struct extended_attribute *ea) | 154 | static inline secno ea_len(struct extended_attribute *ea) |
| 163 | { | 155 | { |
| 164 | return *(secno *)((char *)ea + 5 + ea->namelen); | 156 | return le32_to_cpu(get_unaligned((secno *)((char *)ea + 5 + ea->namelen))); |
| 165 | } | 157 | } |
| 166 | 158 | ||
| 167 | static inline char *ea_data(struct extended_attribute *ea) | 159 | static inline char *ea_data(struct extended_attribute *ea) |
| @@ -186,13 +178,13 @@ static inline void copy_de(struct hpfs_dirent *dst, struct hpfs_dirent *src) | |||
| 186 | dst->not_8x3 = n; | 178 | dst->not_8x3 = n; |
| 187 | } | 179 | } |
| 188 | 180 | ||
| 189 | static inline unsigned tstbits(unsigned *bmp, unsigned b, unsigned n) | 181 | static inline unsigned tstbits(u32 *bmp, unsigned b, unsigned n) |
| 190 | { | 182 | { |
| 191 | int i; | 183 | int i; |
| 192 | if ((b >= 0x4000) || (b + n - 1 >= 0x4000)) return n; | 184 | if ((b >= 0x4000) || (b + n - 1 >= 0x4000)) return n; |
| 193 | if (!((bmp[(b & 0x3fff) >> 5] >> (b & 0x1f)) & 1)) return 1; | 185 | if (!((le32_to_cpu(bmp[(b & 0x3fff) >> 5]) >> (b & 0x1f)) & 1)) return 1; |
| 194 | for (i = 1; i < n; i++) | 186 | for (i = 1; i < n; i++) |
| 195 | if (/*b+i < 0x4000 &&*/ !((bmp[((b+i) & 0x3fff) >> 5] >> ((b+i) & 0x1f)) & 1)) | 187 | if (!((le32_to_cpu(bmp[((b+i) & 0x3fff) >> 5]) >> ((b+i) & 0x1f)) & 1)) |
| 196 | return i + 1; | 188 | return i + 1; |
| 197 | return 0; | 189 | return 0; |
| 198 | } | 190 | } |
| @@ -200,12 +192,12 @@ static inline unsigned tstbits(unsigned *bmp, unsigned b, unsigned n) | |||
| 200 | /* alloc.c */ | 192 | /* alloc.c */ |
| 201 | 193 | ||
| 202 | int hpfs_chk_sectors(struct super_block *, secno, int, char *); | 194 | int hpfs_chk_sectors(struct super_block *, secno, int, char *); |
| 203 | secno hpfs_alloc_sector(struct super_block *, secno, unsigned, int, int); | 195 | secno hpfs_alloc_sector(struct super_block *, secno, unsigned, int); |
| 204 | int hpfs_alloc_if_possible(struct super_block *, secno); | 196 | int hpfs_alloc_if_possible(struct super_block *, secno); |
| 205 | void hpfs_free_sectors(struct super_block *, secno, unsigned); | 197 | void hpfs_free_sectors(struct super_block *, secno, unsigned); |
| 206 | int hpfs_check_free_dnodes(struct super_block *, int); | 198 | int hpfs_check_free_dnodes(struct super_block *, int); |
| 207 | void hpfs_free_dnode(struct super_block *, secno); | 199 | void hpfs_free_dnode(struct super_block *, secno); |
| 208 | struct dnode *hpfs_alloc_dnode(struct super_block *, secno, dnode_secno *, struct quad_buffer_head *, int); | 200 | struct dnode *hpfs_alloc_dnode(struct super_block *, secno, dnode_secno *, struct quad_buffer_head *); |
| 209 | struct fnode *hpfs_alloc_fnode(struct super_block *, secno, fnode_secno *, struct buffer_head **); | 201 | struct fnode *hpfs_alloc_fnode(struct super_block *, secno, fnode_secno *, struct buffer_head **); |
| 210 | struct anode *hpfs_alloc_anode(struct super_block *, secno, anode_secno *, struct buffer_head **); | 202 | struct anode *hpfs_alloc_anode(struct super_block *, secno, anode_secno *, struct buffer_head **); |
| 211 | 203 | ||
| @@ -222,8 +214,6 @@ void hpfs_remove_fnode(struct super_block *, fnode_secno fno); | |||
| 222 | 214 | ||
| 223 | /* buffer.c */ | 215 | /* buffer.c */ |
| 224 | 216 | ||
| 225 | void hpfs_lock_creation(struct super_block *); | ||
| 226 | void hpfs_unlock_creation(struct super_block *); | ||
| 227 | void *hpfs_map_sector(struct super_block *, unsigned, struct buffer_head **, int); | 217 | void *hpfs_map_sector(struct super_block *, unsigned, struct buffer_head **, int); |
| 228 | void *hpfs_get_sector(struct super_block *, unsigned, struct buffer_head **); | 218 | void *hpfs_get_sector(struct super_block *, unsigned, struct buffer_head **); |
| 229 | void *hpfs_map_4sectors(struct super_block *, unsigned, struct quad_buffer_head *, int); | 219 | void *hpfs_map_4sectors(struct super_block *, unsigned, struct quad_buffer_head *, int); |
| @@ -247,7 +237,7 @@ void hpfs_del_pos(struct inode *, loff_t *); | |||
| 247 | struct hpfs_dirent *hpfs_add_de(struct super_block *, struct dnode *, | 237 | struct hpfs_dirent *hpfs_add_de(struct super_block *, struct dnode *, |
| 248 | const unsigned char *, unsigned, secno); | 238 | const unsigned char *, unsigned, secno); |
| 249 | int hpfs_add_dirent(struct inode *, const unsigned char *, unsigned, | 239 | int hpfs_add_dirent(struct inode *, const unsigned char *, unsigned, |
| 250 | struct hpfs_dirent *, int); | 240 | struct hpfs_dirent *); |
| 251 | int hpfs_remove_dirent(struct inode *, dnode_secno, struct hpfs_dirent *, struct quad_buffer_head *, int); | 241 | int hpfs_remove_dirent(struct inode *, dnode_secno, struct hpfs_dirent *, struct quad_buffer_head *, int); |
| 252 | void hpfs_count_dnodes(struct super_block *, dnode_secno, int *, int *, int *); | 242 | void hpfs_count_dnodes(struct super_block *, dnode_secno, int *, int *, int *); |
| 253 | dnode_secno hpfs_de_as_down_as_possible(struct super_block *, dnode_secno dno); | 243 | dnode_secno hpfs_de_as_down_as_possible(struct super_block *, dnode_secno dno); |
| @@ -303,7 +293,6 @@ int hpfs_compare_names(struct super_block *, const unsigned char *, unsigned, | |||
| 303 | const unsigned char *, unsigned, int); | 293 | const unsigned char *, unsigned, int); |
| 304 | int hpfs_is_name_long(const unsigned char *, unsigned); | 294 | int hpfs_is_name_long(const unsigned char *, unsigned); |
| 305 | void hpfs_adjust_length(const unsigned char *, unsigned *); | 295 | void hpfs_adjust_length(const unsigned char *, unsigned *); |
| 306 | void hpfs_decide_conv(struct inode *, const unsigned char *, unsigned); | ||
| 307 | 296 | ||
| 308 | /* namei.c */ | 297 | /* namei.c */ |
| 309 | 298 | ||
| @@ -346,21 +335,26 @@ static inline time32_t gmt_to_local(struct super_block *s, time_t t) | |||
| 346 | /* | 335 | /* |
| 347 | * Locking: | 336 | * Locking: |
| 348 | * | 337 | * |
| 349 | * hpfs_lock() is a leftover from the big kernel lock. | 338 | * hpfs_lock() locks the whole filesystem. It must be taken |
| 350 | * Right now, these functions are empty and only left | 339 | * on any method called by the VFS. |
| 351 | * for documentation purposes. The file system no longer | ||
| 352 | * works on SMP systems, so the lock is not needed | ||
| 353 | * any more. | ||
| 354 | * | 340 | * |
| 355 | * If someone is interested in making it work again, this | 341 | * We don't do any per-file locking anymore, it is hard to |
| 356 | * would be the place to start by adding a per-superblock | 342 | * review and HPFS is not performance-sensitive anyway. |
| 357 | * mutex and fixing all the bugs and performance issues | ||
| 358 | * caused by that. | ||
| 359 | */ | 343 | */ |
| 360 | static inline void hpfs_lock(struct super_block *s) | 344 | static inline void hpfs_lock(struct super_block *s) |
| 361 | { | 345 | { |
| 346 | struct hpfs_sb_info *sbi = hpfs_sb(s); | ||
| 347 | mutex_lock(&sbi->hpfs_mutex); | ||
| 362 | } | 348 | } |
| 363 | 349 | ||
| 364 | static inline void hpfs_unlock(struct super_block *s) | 350 | static inline void hpfs_unlock(struct super_block *s) |
| 365 | { | 351 | { |
| 352 | struct hpfs_sb_info *sbi = hpfs_sb(s); | ||
| 353 | mutex_unlock(&sbi->hpfs_mutex); | ||
| 354 | } | ||
| 355 | |||
| 356 | static inline void hpfs_lock_assert(struct super_block *s) | ||
| 357 | { | ||
| 358 | struct hpfs_sb_info *sbi = hpfs_sb(s); | ||
| 359 | WARN_ON(!mutex_is_locked(&sbi->hpfs_mutex)); | ||
| 366 | } | 360 | } |
diff --git a/fs/hpfs/inode.c b/fs/hpfs/inode.c index 87f1f787e767..338cd8368451 100644 --- a/fs/hpfs/inode.c +++ b/fs/hpfs/inode.c | |||
| @@ -17,7 +17,6 @@ void hpfs_init_inode(struct inode *i) | |||
| 17 | i->i_uid = hpfs_sb(sb)->sb_uid; | 17 | i->i_uid = hpfs_sb(sb)->sb_uid; |
| 18 | i->i_gid = hpfs_sb(sb)->sb_gid; | 18 | i->i_gid = hpfs_sb(sb)->sb_gid; |
| 19 | i->i_mode = hpfs_sb(sb)->sb_mode; | 19 | i->i_mode = hpfs_sb(sb)->sb_mode; |
| 20 | hpfs_inode->i_conv = hpfs_sb(sb)->sb_conv; | ||
| 21 | i->i_size = -1; | 20 | i->i_size = -1; |
| 22 | i->i_blocks = -1; | 21 | i->i_blocks = -1; |
| 23 | 22 | ||
| @@ -116,8 +115,8 @@ void hpfs_read_inode(struct inode *i) | |||
| 116 | i->i_mode |= S_IFDIR; | 115 | i->i_mode |= S_IFDIR; |
| 117 | i->i_op = &hpfs_dir_iops; | 116 | i->i_op = &hpfs_dir_iops; |
| 118 | i->i_fop = &hpfs_dir_ops; | 117 | i->i_fop = &hpfs_dir_ops; |
| 119 | hpfs_inode->i_parent_dir = fnode->up; | 118 | hpfs_inode->i_parent_dir = le32_to_cpu(fnode->up); |
| 120 | hpfs_inode->i_dno = fnode->u.external[0].disk_secno; | 119 | hpfs_inode->i_dno = le32_to_cpu(fnode->u.external[0].disk_secno); |
| 121 | if (hpfs_sb(sb)->sb_chk >= 2) { | 120 | if (hpfs_sb(sb)->sb_chk >= 2) { |
| 122 | struct buffer_head *bh0; | 121 | struct buffer_head *bh0; |
| 123 | if (hpfs_map_fnode(sb, hpfs_inode->i_parent_dir, &bh0)) brelse(bh0); | 122 | if (hpfs_map_fnode(sb, hpfs_inode->i_parent_dir, &bh0)) brelse(bh0); |
| @@ -133,7 +132,7 @@ void hpfs_read_inode(struct inode *i) | |||
| 133 | i->i_op = &hpfs_file_iops; | 132 | i->i_op = &hpfs_file_iops; |
| 134 | i->i_fop = &hpfs_file_ops; | 133 | i->i_fop = &hpfs_file_ops; |
| 135 | i->i_nlink = 1; | 134 | i->i_nlink = 1; |
| 136 | i->i_size = fnode->file_size; | 135 | i->i_size = le32_to_cpu(fnode->file_size); |
| 137 | i->i_blocks = ((i->i_size + 511) >> 9) + 1; | 136 | i->i_blocks = ((i->i_size + 511) >> 9) + 1; |
| 138 | i->i_data.a_ops = &hpfs_aops; | 137 | i->i_data.a_ops = &hpfs_aops; |
| 139 | hpfs_i(i)->mmu_private = i->i_size; | 138 | hpfs_i(i)->mmu_private = i->i_size; |
| @@ -144,7 +143,7 @@ void hpfs_read_inode(struct inode *i) | |||
| 144 | static void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) | 143 | static void hpfs_write_inode_ea(struct inode *i, struct fnode *fnode) |
| 145 | { | 144 | { |
| 146 | struct hpfs_inode_info *hpfs_inode = hpfs_i(i); | 145 | struct hpfs_inode_info *hpfs_inode = hpfs_i(i); |
| 147 | /*if (fnode->acl_size_l || fnode->acl_size_s) { | 146 | /*if (le32_to_cpu(fnode->acl_size_l) || le16_to_cpu(fnode->acl_size_s)) { |
| 148 | Some unknown structures like ACL may be in fnode, | 147 | Some unknown structures like ACL may be in fnode, |
| 149 | we'd better not overwrite them | 148 | we'd better not overwrite them |
| 150 | hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino); | 149 | hpfs_error(i->i_sb, "fnode %08x has some unknown HPFS386 stuctures", i->i_ino); |
| @@ -187,9 +186,7 @@ void hpfs_write_inode(struct inode *i) | |||
| 187 | kfree(hpfs_inode->i_rddir_off); | 186 | kfree(hpfs_inode->i_rddir_off); |
| 188 | hpfs_inode->i_rddir_off = NULL; | 187 | hpfs_inode->i_rddir_off = NULL; |
| 189 | } | 188 | } |
| 190 | mutex_lock(&hpfs_inode->i_parent_mutex); | ||
| 191 | if (!i->i_nlink) { | 189 | if (!i->i_nlink) { |
| 192 | mutex_unlock(&hpfs_inode->i_parent_mutex); | ||
| 193 | return; | 190 | return; |
| 194 | } | 191 | } |
| 195 | parent = iget_locked(i->i_sb, hpfs_inode->i_parent_dir); | 192 | parent = iget_locked(i->i_sb, hpfs_inode->i_parent_dir); |
| @@ -200,14 +197,9 @@ void hpfs_write_inode(struct inode *i) | |||
| 200 | hpfs_read_inode(parent); | 197 | hpfs_read_inode(parent); |
| 201 | unlock_new_inode(parent); | 198 | unlock_new_inode(parent); |
| 202 | } | 199 | } |
| 203 | mutex_lock(&hpfs_inode->i_mutex); | ||
| 204 | hpfs_write_inode_nolock(i); | 200 | hpfs_write_inode_nolock(i); |
| 205 | mutex_unlock(&hpfs_inode->i_mutex); | ||
| 206 | iput(parent); | 201 | iput(parent); |
| 207 | } else { | ||
| 208 | mark_inode_dirty(i); | ||
| 209 | } | 202 | } |
| 210 | mutex_unlock(&hpfs_inode->i_parent_mutex); | ||
| 211 | } | 203 | } |
| 212 | 204 | ||
| 213 | void hpfs_write_inode_nolock(struct inode *i) | 205 | void hpfs_write_inode_nolock(struct inode *i) |
| @@ -226,30 +218,30 @@ void hpfs_write_inode_nolock(struct inode *i) | |||
| 226 | } | 218 | } |
| 227 | } else de = NULL; | 219 | } else de = NULL; |
| 228 | if (S_ISREG(i->i_mode)) { | 220 | if (S_ISREG(i->i_mode)) { |
| 229 | fnode->file_size = i->i_size; | 221 | fnode->file_size = cpu_to_le32(i->i_size); |
| 230 | if (de) de->file_size = i->i_size; | 222 | if (de) de->file_size = cpu_to_le32(i->i_size); |
| 231 | } else if (S_ISDIR(i->i_mode)) { | 223 | } else if (S_ISDIR(i->i_mode)) { |
| 232 | fnode->file_size = 0; | 224 | fnode->file_size = cpu_to_le32(0); |
| 233 | if (de) de->file_size = 0; | 225 | if (de) de->file_size = cpu_to_le32(0); |
| 234 | } | 226 | } |
| 235 | hpfs_write_inode_ea(i, fnode); | 227 | hpfs_write_inode_ea(i, fnode); |
| 236 | if (de) { | 228 | if (de) { |
| 237 | de->write_date = gmt_to_local(i->i_sb, i->i_mtime.tv_sec); | 229 | de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); |
| 238 | de->read_date = gmt_to_local(i->i_sb, i->i_atime.tv_sec); | 230 | de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); |
| 239 | de->creation_date = gmt_to_local(i->i_sb, i->i_ctime.tv_sec); | 231 | de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); |
| 240 | de->read_only = !(i->i_mode & 0222); | 232 | de->read_only = !(i->i_mode & 0222); |
| 241 | de->ea_size = hpfs_inode->i_ea_size; | 233 | de->ea_size = cpu_to_le32(hpfs_inode->i_ea_size); |
| 242 | hpfs_mark_4buffers_dirty(&qbh); | 234 | hpfs_mark_4buffers_dirty(&qbh); |
| 243 | hpfs_brelse4(&qbh); | 235 | hpfs_brelse4(&qbh); |
| 244 | } | 236 | } |
| 245 | if (S_ISDIR(i->i_mode)) { | 237 | if (S_ISDIR(i->i_mode)) { |
| 246 | if ((de = map_dirent(i, hpfs_inode->i_dno, "\001\001", 2, NULL, &qbh))) { | 238 | if ((de = map_dirent(i, hpfs_inode->i_dno, "\001\001", 2, NULL, &qbh))) { |
| 247 | de->write_date = gmt_to_local(i->i_sb, i->i_mtime.tv_sec); | 239 | de->write_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_mtime.tv_sec)); |
| 248 | de->read_date = gmt_to_local(i->i_sb, i->i_atime.tv_sec); | 240 | de->read_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_atime.tv_sec)); |
| 249 | de->creation_date = gmt_to_local(i->i_sb, i->i_ctime.tv_sec); | 241 | de->creation_date = cpu_to_le32(gmt_to_local(i->i_sb, i->i_ctime.tv_sec)); |
| 250 | de->read_only = !(i->i_mode & 0222); | 242 | de->read_only = !(i->i_mode & 0222); |
| 251 | de->ea_size = /*hpfs_inode->i_ea_size*/0; | 243 | de->ea_size = cpu_to_le32(/*hpfs_inode->i_ea_size*/0); |
| 252 | de->file_size = 0; | 244 | de->file_size = cpu_to_le32(0); |
| 253 | hpfs_mark_4buffers_dirty(&qbh); | 245 | hpfs_mark_4buffers_dirty(&qbh); |
| 254 | hpfs_brelse4(&qbh); | 246 | hpfs_brelse4(&qbh); |
| 255 | } else | 247 | } else |
| @@ -269,6 +261,10 @@ int hpfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 269 | hpfs_lock(inode->i_sb); | 261 | hpfs_lock(inode->i_sb); |
| 270 | if (inode->i_ino == hpfs_sb(inode->i_sb)->sb_root) | 262 | if (inode->i_ino == hpfs_sb(inode->i_sb)->sb_root) |
| 271 | goto out_unlock; | 263 | goto out_unlock; |
| 264 | if ((attr->ia_valid & ATTR_UID) && attr->ia_uid >= 0x10000) | ||
| 265 | goto out_unlock; | ||
| 266 | if ((attr->ia_valid & ATTR_GID) && attr->ia_gid >= 0x10000) | ||
| 267 | goto out_unlock; | ||
| 272 | if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size) | 268 | if ((attr->ia_valid & ATTR_SIZE) && attr->ia_size > inode->i_size) |
| 273 | goto out_unlock; | 269 | goto out_unlock; |
| 274 | 270 | ||
| @@ -284,7 +280,6 @@ int hpfs_setattr(struct dentry *dentry, struct iattr *attr) | |||
| 284 | } | 280 | } |
| 285 | 281 | ||
| 286 | setattr_copy(inode, attr); | 282 | setattr_copy(inode, attr); |
| 287 | mark_inode_dirty(inode); | ||
| 288 | 283 | ||
| 289 | hpfs_write_inode(inode); | 284 | hpfs_write_inode(inode); |
| 290 | 285 | ||
diff --git a/fs/hpfs/map.c b/fs/hpfs/map.c index 840d033ecee8..a790821366a7 100644 --- a/fs/hpfs/map.c +++ b/fs/hpfs/map.c | |||
| @@ -21,7 +21,7 @@ unsigned int *hpfs_map_bitmap(struct super_block *s, unsigned bmp_block, | |||
| 21 | hpfs_error(s, "hpfs_map_bitmap called with bad parameter: %08x at %s", bmp_block, id); | 21 | hpfs_error(s, "hpfs_map_bitmap called with bad parameter: %08x at %s", bmp_block, id); |
| 22 | return NULL; | 22 | return NULL; |
| 23 | } | 23 | } |
| 24 | sec = hpfs_sb(s)->sb_bmp_dir[bmp_block]; | 24 | sec = le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[bmp_block]); |
| 25 | if (!sec || sec > hpfs_sb(s)->sb_fs_size-4) { | 25 | if (!sec || sec > hpfs_sb(s)->sb_fs_size-4) { |
| 26 | hpfs_error(s, "invalid bitmap block pointer %08x -> %08x at %s", bmp_block, sec, id); | 26 | hpfs_error(s, "invalid bitmap block pointer %08x -> %08x at %s", bmp_block, sec, id); |
| 27 | return NULL; | 27 | return NULL; |
| @@ -46,18 +46,18 @@ unsigned char *hpfs_load_code_page(struct super_block *s, secno cps) | |||
| 46 | struct code_page_data *cpd; | 46 | struct code_page_data *cpd; |
| 47 | struct code_page_directory *cp = hpfs_map_sector(s, cps, &bh, 0); | 47 | struct code_page_directory *cp = hpfs_map_sector(s, cps, &bh, 0); |
| 48 | if (!cp) return NULL; | 48 | if (!cp) return NULL; |
| 49 | if (cp->magic != CP_DIR_MAGIC) { | 49 | if (le32_to_cpu(cp->magic) != CP_DIR_MAGIC) { |
| 50 | printk("HPFS: Code page directory magic doesn't match (magic = %08x)\n", cp->magic); | 50 | printk("HPFS: Code page directory magic doesn't match (magic = %08x)\n", le32_to_cpu(cp->magic)); |
| 51 | brelse(bh); | 51 | brelse(bh); |
| 52 | return NULL; | 52 | return NULL; |
| 53 | } | 53 | } |
| 54 | if (!cp->n_code_pages) { | 54 | if (!le32_to_cpu(cp->n_code_pages)) { |
| 55 | printk("HPFS: n_code_pages == 0\n"); | 55 | printk("HPFS: n_code_pages == 0\n"); |
| 56 | brelse(bh); | 56 | brelse(bh); |
| 57 | return NULL; | 57 | return NULL; |
| 58 | } | 58 | } |
| 59 | cpds = cp->array[0].code_page_data; | 59 | cpds = le32_to_cpu(cp->array[0].code_page_data); |
| 60 | cpi = cp->array[0].index; | 60 | cpi = le16_to_cpu(cp->array[0].index); |
| 61 | brelse(bh); | 61 | brelse(bh); |
| 62 | 62 | ||
| 63 | if (cpi >= 3) { | 63 | if (cpi >= 3) { |
| @@ -66,12 +66,12 @@ unsigned char *hpfs_load_code_page(struct super_block *s, secno cps) | |||
| 66 | } | 66 | } |
| 67 | 67 | ||
| 68 | if (!(cpd = hpfs_map_sector(s, cpds, &bh, 0))) return NULL; | 68 | if (!(cpd = hpfs_map_sector(s, cpds, &bh, 0))) return NULL; |
| 69 | if ((unsigned)cpd->offs[cpi] > 0x178) { | 69 | if (le16_to_cpu(cpd->offs[cpi]) > 0x178) { |
| 70 | printk("HPFS: Code page index out of sector\n"); | 70 | printk("HPFS: Code page index out of sector\n"); |
| 71 | brelse(bh); | 71 | brelse(bh); |
| 72 | return NULL; | 72 | return NULL; |
| 73 | } | 73 | } |
| 74 | ptr = (unsigned char *)cpd + cpd->offs[cpi] + 6; | 74 | ptr = (unsigned char *)cpd + le16_to_cpu(cpd->offs[cpi]) + 6; |
| 75 | if (!(cp_table = kmalloc(256, GFP_KERNEL))) { | 75 | if (!(cp_table = kmalloc(256, GFP_KERNEL))) { |
| 76 | printk("HPFS: out of memory for code page table\n"); | 76 | printk("HPFS: out of memory for code page table\n"); |
| 77 | brelse(bh); | 77 | brelse(bh); |
| @@ -125,7 +125,7 @@ struct fnode *hpfs_map_fnode(struct super_block *s, ino_t ino, struct buffer_hea | |||
| 125 | if (hpfs_sb(s)->sb_chk) { | 125 | if (hpfs_sb(s)->sb_chk) { |
| 126 | struct extended_attribute *ea; | 126 | struct extended_attribute *ea; |
| 127 | struct extended_attribute *ea_end; | 127 | struct extended_attribute *ea_end; |
| 128 | if (fnode->magic != FNODE_MAGIC) { | 128 | if (le32_to_cpu(fnode->magic) != FNODE_MAGIC) { |
| 129 | hpfs_error(s, "bad magic on fnode %08lx", | 129 | hpfs_error(s, "bad magic on fnode %08lx", |
| 130 | (unsigned long)ino); | 130 | (unsigned long)ino); |
| 131 | goto bail; | 131 | goto bail; |
| @@ -138,7 +138,7 @@ struct fnode *hpfs_map_fnode(struct super_block *s, ino_t ino, struct buffer_hea | |||
| 138 | (unsigned long)ino); | 138 | (unsigned long)ino); |
| 139 | goto bail; | 139 | goto bail; |
| 140 | } | 140 | } |
| 141 | if (fnode->btree.first_free != | 141 | if (le16_to_cpu(fnode->btree.first_free) != |
| 142 | 8 + fnode->btree.n_used_nodes * (fnode->btree.internal ? 8 : 12)) { | 142 | 8 + fnode->btree.n_used_nodes * (fnode->btree.internal ? 8 : 12)) { |
| 143 | hpfs_error(s, | 143 | hpfs_error(s, |
| 144 | "bad first_free pointer in fnode %08lx", | 144 | "bad first_free pointer in fnode %08lx", |
| @@ -146,12 +146,12 @@ struct fnode *hpfs_map_fnode(struct super_block *s, ino_t ino, struct buffer_hea | |||
| 146 | goto bail; | 146 | goto bail; |
| 147 | } | 147 | } |
| 148 | } | 148 | } |
| 149 | if (fnode->ea_size_s && ((signed int)fnode->ea_offs < 0xc4 || | 149 | if (le16_to_cpu(fnode->ea_size_s) && (le16_to_cpu(fnode->ea_offs) < 0xc4 || |
| 150 | (signed int)fnode->ea_offs + fnode->acl_size_s + fnode->ea_size_s > 0x200)) { | 150 | le16_to_cpu(fnode->ea_offs) + le16_to_cpu(fnode->acl_size_s) + le16_to_cpu(fnode->ea_size_s) > 0x200)) { |
| 151 | hpfs_error(s, | 151 | hpfs_error(s, |
| 152 | "bad EA info in fnode %08lx: ea_offs == %04x ea_size_s == %04x", | 152 | "bad EA info in fnode %08lx: ea_offs == %04x ea_size_s == %04x", |
| 153 | (unsigned long)ino, | 153 | (unsigned long)ino, |
| 154 | fnode->ea_offs, fnode->ea_size_s); | 154 | le16_to_cpu(fnode->ea_offs), le16_to_cpu(fnode->ea_size_s)); |
| 155 | goto bail; | 155 | goto bail; |
| 156 | } | 156 | } |
| 157 | ea = fnode_ea(fnode); | 157 | ea = fnode_ea(fnode); |
| @@ -178,16 +178,20 @@ struct anode *hpfs_map_anode(struct super_block *s, anode_secno ano, struct buff | |||
| 178 | if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, ano, 1, "anode")) return NULL; | 178 | if (hpfs_sb(s)->sb_chk) if (hpfs_chk_sectors(s, ano, 1, "anode")) return NULL; |
| 179 | if ((anode = hpfs_map_sector(s, ano, bhp, ANODE_RD_AHEAD))) | 179 | if ((anode = hpfs_map_sector(s, ano, bhp, ANODE_RD_AHEAD))) |
| 180 | if (hpfs_sb(s)->sb_chk) { | 180 | if (hpfs_sb(s)->sb_chk) { |
| 181 | if (anode->magic != ANODE_MAGIC || anode->self != ano) { | 181 | if (le32_to_cpu(anode->magic) != ANODE_MAGIC) { |
| 182 | hpfs_error(s, "bad magic on anode %08x", ano); | 182 | hpfs_error(s, "bad magic on anode %08x", ano); |
| 183 | goto bail; | 183 | goto bail; |
| 184 | } | 184 | } |
| 185 | if (le32_to_cpu(anode->self) != ano) { | ||
| 186 | hpfs_error(s, "self pointer invalid on anode %08x", ano); | ||
| 187 | goto bail; | ||
| 188 | } | ||
| 185 | if ((unsigned)anode->btree.n_used_nodes + (unsigned)anode->btree.n_free_nodes != | 189 | if ((unsigned)anode->btree.n_used_nodes + (unsigned)anode->btree.n_free_nodes != |
| 186 | (anode->btree.internal ? 60 : 40)) { | 190 | (anode->btree.internal ? 60 : 40)) { |
| 187 | hpfs_error(s, "bad number of nodes in anode %08x", ano); | 191 | hpfs_error(s, "bad number of nodes in anode %08x", ano); |
| 188 | goto bail; | 192 | goto bail; |
| 189 | } | 193 | } |
| 190 | if (anode->btree.first_free != | 194 | if (le16_to_cpu(anode->btree.first_free) != |
| 191 | 8 + anode->btree.n_used_nodes * (anode->btree.internal ? 8 : 12)) { | 195 | 8 + anode->btree.n_used_nodes * (anode->btree.internal ? 8 : 12)) { |
| 192 | hpfs_error(s, "bad first_free pointer in anode %08x", ano); | 196 | hpfs_error(s, "bad first_free pointer in anode %08x", ano); |
| 193 | goto bail; | 197 | goto bail; |
| @@ -219,26 +223,26 @@ struct dnode *hpfs_map_dnode(struct super_block *s, unsigned secno, | |||
| 219 | unsigned p, pp = 0; | 223 | unsigned p, pp = 0; |
| 220 | unsigned char *d = (unsigned char *)dnode; | 224 | unsigned char *d = (unsigned char *)dnode; |
| 221 | int b = 0; | 225 | int b = 0; |
| 222 | if (dnode->magic != DNODE_MAGIC) { | 226 | if (le32_to_cpu(dnode->magic) != DNODE_MAGIC) { |
| 223 | hpfs_error(s, "bad magic on dnode %08x", secno); | 227 | hpfs_error(s, "bad magic on dnode %08x", secno); |
| 224 | goto bail; | 228 | goto bail; |
| 225 | } | 229 | } |
| 226 | if (dnode->self != secno) | 230 | if (le32_to_cpu(dnode->self) != secno) |
| 227 | hpfs_error(s, "bad self pointer on dnode %08x self = %08x", secno, dnode->self); | 231 | hpfs_error(s, "bad self pointer on dnode %08x self = %08x", secno, le32_to_cpu(dnode->self)); |
| 228 | /* Check dirents - bad dirents would cause infinite | 232 | /* Check dirents - bad dirents would cause infinite |
| 229 | loops or shooting to memory */ | 233 | loops or shooting to memory */ |
| 230 | if (dnode->first_free > 2048/* || dnode->first_free < 84*/) { | 234 | if (le32_to_cpu(dnode->first_free) > 2048) { |
| 231 | hpfs_error(s, "dnode %08x has first_free == %08x", secno, dnode->first_free); | 235 | hpfs_error(s, "dnode %08x has first_free == %08x", secno, le32_to_cpu(dnode->first_free)); |
| 232 | goto bail; | 236 | goto bail; |
| 233 | } | 237 | } |
| 234 | for (p = 20; p < dnode->first_free; p += d[p] + (d[p+1] << 8)) { | 238 | for (p = 20; p < le32_to_cpu(dnode->first_free); p += d[p] + (d[p+1] << 8)) { |
| 235 | struct hpfs_dirent *de = (struct hpfs_dirent *)((char *)dnode + p); | 239 | struct hpfs_dirent *de = (struct hpfs_dirent *)((char *)dnode + p); |
| 236 | if (de->length > 292 || (de->length < 32) || (de->length & 3) || p + de->length > 2048) { | 240 | if (le16_to_cpu(de->length) > 292 || (le16_to_cpu(de->length) < 32) || (le16_to_cpu(de->length) & 3) || p + le16_to_cpu(de->length) > 2048) { |
| 237 | hpfs_error(s, "bad dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); | 241 | hpfs_error(s, "bad dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); |
| 238 | goto bail; | 242 | goto bail; |
| 239 | } | 243 | } |
| 240 | if (((31 + de->namelen + de->down*4 + 3) & ~3) != de->length) { | 244 | if (((31 + de->namelen + de->down*4 + 3) & ~3) != le16_to_cpu(de->length)) { |
| 241 | if (((31 + de->namelen + de->down*4 + 3) & ~3) < de->length && s->s_flags & MS_RDONLY) goto ok; | 245 | if (((31 + de->namelen + de->down*4 + 3) & ~3) < le16_to_cpu(de->length) && s->s_flags & MS_RDONLY) goto ok; |
| 242 | hpfs_error(s, "namelen does not match dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); | 246 | hpfs_error(s, "namelen does not match dirent size in dnode %08x, dirent %03x, last %03x", secno, p, pp); |
| 243 | goto bail; | 247 | goto bail; |
| 244 | } | 248 | } |
| @@ -251,7 +255,7 @@ struct dnode *hpfs_map_dnode(struct super_block *s, unsigned secno, | |||
| 251 | pp = p; | 255 | pp = p; |
| 252 | 256 | ||
| 253 | } | 257 | } |
| 254 | if (p != dnode->first_free) { | 258 | if (p != le32_to_cpu(dnode->first_free)) { |
| 255 | hpfs_error(s, "size on last dirent does not match first_free; dnode %08x", secno); | 259 | hpfs_error(s, "size on last dirent does not match first_free; dnode %08x", secno); |
| 256 | goto bail; | 260 | goto bail; |
| 257 | } | 261 | } |
| @@ -277,7 +281,7 @@ dnode_secno hpfs_fnode_dno(struct super_block *s, ino_t ino) | |||
| 277 | if (!fnode) | 281 | if (!fnode) |
| 278 | return 0; | 282 | return 0; |
| 279 | 283 | ||
| 280 | dno = fnode->u.external[0].disk_secno; | 284 | dno = le32_to_cpu(fnode->u.external[0].disk_secno); |
| 281 | brelse(bh); | 285 | brelse(bh); |
| 282 | return dno; | 286 | return dno; |
| 283 | } | 287 | } |
diff --git a/fs/hpfs/name.c b/fs/hpfs/name.c index f24736d7a439..9acdf338def0 100644 --- a/fs/hpfs/name.c +++ b/fs/hpfs/name.c | |||
| @@ -8,39 +8,6 @@ | |||
| 8 | 8 | ||
| 9 | #include "hpfs_fn.h" | 9 | #include "hpfs_fn.h" |
| 10 | 10 | ||
| 11 | static const char *text_postfix[]={ | ||
| 12 | ".ASM", ".BAS", ".BAT", ".C", ".CC", ".CFG", ".CMD", ".CON", ".CPP", ".DEF", | ||
| 13 | ".DOC", ".DPR", ".ERX", ".H", ".HPP", ".HTM", ".HTML", ".JAVA", ".LOG", ".PAS", | ||
| 14 | ".RC", ".TEX", ".TXT", ".Y", ""}; | ||
| 15 | |||
| 16 | static const char *text_prefix[]={ | ||
| 17 | "AUTOEXEC.", "CHANGES", "COPYING", "CONFIG.", "CREDITS", "FAQ", "FILE_ID.DIZ", | ||
| 18 | "MAKEFILE", "READ.ME", "README", "TERMCAP", ""}; | ||
| 19 | |||
| 20 | void hpfs_decide_conv(struct inode *inode, const unsigned char *name, unsigned len) | ||
| 21 | { | ||
| 22 | struct hpfs_inode_info *hpfs_inode = hpfs_i(inode); | ||
| 23 | int i; | ||
| 24 | if (hpfs_inode->i_conv != CONV_AUTO) return; | ||
| 25 | for (i = 0; *text_postfix[i]; i++) { | ||
| 26 | int l = strlen(text_postfix[i]); | ||
| 27 | if (l <= len) | ||
| 28 | if (!hpfs_compare_names(inode->i_sb, text_postfix[i], l, name + len - l, l, 0)) | ||
| 29 | goto text; | ||
| 30 | } | ||
| 31 | for (i = 0; *text_prefix[i]; i++) { | ||
| 32 | int l = strlen(text_prefix[i]); | ||
| 33 | if (l <= len) | ||
| 34 | if (!hpfs_compare_names(inode->i_sb, text_prefix[i], l, name, l, 0)) | ||
| 35 | goto text; | ||
| 36 | } | ||
| 37 | hpfs_inode->i_conv = CONV_BINARY; | ||
| 38 | return; | ||
| 39 | text: | ||
| 40 | hpfs_inode->i_conv = CONV_TEXT; | ||
| 41 | return; | ||
| 42 | } | ||
| 43 | |||
| 44 | static inline int not_allowed_char(unsigned char c) | 11 | static inline int not_allowed_char(unsigned char c) |
| 45 | { | 12 | { |
| 46 | return c<' ' || c=='"' || c=='*' || c=='/' || c==':' || c=='<' || | 13 | return c<' ' || c=='"' || c=='*' || c=='/' || c==':' || c=='<' || |
diff --git a/fs/hpfs/namei.c b/fs/hpfs/namei.c index d5f8c8a19023..1f05839c27a7 100644 --- a/fs/hpfs/namei.c +++ b/fs/hpfs/namei.c | |||
| @@ -29,7 +29,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 29 | fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh); | 29 | fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh); |
| 30 | if (!fnode) | 30 | if (!fnode) |
| 31 | goto bail; | 31 | goto bail; |
| 32 | dnode = hpfs_alloc_dnode(dir->i_sb, fno, &dno, &qbh0, 1); | 32 | dnode = hpfs_alloc_dnode(dir->i_sb, fno, &dno, &qbh0); |
| 33 | if (!dnode) | 33 | if (!dnode) |
| 34 | goto bail1; | 34 | goto bail1; |
| 35 | memset(&dee, 0, sizeof dee); | 35 | memset(&dee, 0, sizeof dee); |
| @@ -37,8 +37,8 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 37 | if (!(mode & 0222)) dee.read_only = 1; | 37 | if (!(mode & 0222)) dee.read_only = 1; |
| 38 | /*dee.archive = 0;*/ | 38 | /*dee.archive = 0;*/ |
| 39 | dee.hidden = name[0] == '.'; | 39 | dee.hidden = name[0] == '.'; |
| 40 | dee.fnode = fno; | 40 | dee.fnode = cpu_to_le32(fno); |
| 41 | dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); | 41 | dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); |
| 42 | result = new_inode(dir->i_sb); | 42 | result = new_inode(dir->i_sb); |
| 43 | if (!result) | 43 | if (!result) |
| 44 | goto bail2; | 44 | goto bail2; |
| @@ -46,7 +46,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 46 | result->i_ino = fno; | 46 | result->i_ino = fno; |
| 47 | hpfs_i(result)->i_parent_dir = dir->i_ino; | 47 | hpfs_i(result)->i_parent_dir = dir->i_ino; |
| 48 | hpfs_i(result)->i_dno = dno; | 48 | hpfs_i(result)->i_dno = dno; |
| 49 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); | 49 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); |
| 50 | result->i_ctime.tv_nsec = 0; | 50 | result->i_ctime.tv_nsec = 0; |
| 51 | result->i_mtime.tv_nsec = 0; | 51 | result->i_mtime.tv_nsec = 0; |
| 52 | result->i_atime.tv_nsec = 0; | 52 | result->i_atime.tv_nsec = 0; |
| @@ -60,8 +60,7 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 60 | if (dee.read_only) | 60 | if (dee.read_only) |
| 61 | result->i_mode &= ~0222; | 61 | result->i_mode &= ~0222; |
| 62 | 62 | ||
| 63 | mutex_lock(&hpfs_i(dir)->i_mutex); | 63 | r = hpfs_add_dirent(dir, name, len, &dee); |
| 64 | r = hpfs_add_dirent(dir, name, len, &dee, 0); | ||
| 65 | if (r == 1) | 64 | if (r == 1) |
| 66 | goto bail3; | 65 | goto bail3; |
| 67 | if (r == -1) { | 66 | if (r == -1) { |
| @@ -70,21 +69,21 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 70 | } | 69 | } |
| 71 | fnode->len = len; | 70 | fnode->len = len; |
| 72 | memcpy(fnode->name, name, len > 15 ? 15 : len); | 71 | memcpy(fnode->name, name, len > 15 ? 15 : len); |
| 73 | fnode->up = dir->i_ino; | 72 | fnode->up = cpu_to_le32(dir->i_ino); |
| 74 | fnode->dirflag = 1; | 73 | fnode->dirflag = 1; |
| 75 | fnode->btree.n_free_nodes = 7; | 74 | fnode->btree.n_free_nodes = 7; |
| 76 | fnode->btree.n_used_nodes = 1; | 75 | fnode->btree.n_used_nodes = 1; |
| 77 | fnode->btree.first_free = 0x14; | 76 | fnode->btree.first_free = cpu_to_le16(0x14); |
| 78 | fnode->u.external[0].disk_secno = dno; | 77 | fnode->u.external[0].disk_secno = cpu_to_le32(dno); |
| 79 | fnode->u.external[0].file_secno = -1; | 78 | fnode->u.external[0].file_secno = cpu_to_le32(-1); |
| 80 | dnode->root_dnode = 1; | 79 | dnode->root_dnode = 1; |
| 81 | dnode->up = fno; | 80 | dnode->up = cpu_to_le32(fno); |
| 82 | de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0); | 81 | de = hpfs_add_de(dir->i_sb, dnode, "\001\001", 2, 0); |
| 83 | de->creation_date = de->write_date = de->read_date = gmt_to_local(dir->i_sb, get_seconds()); | 82 | de->creation_date = de->write_date = de->read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); |
| 84 | if (!(mode & 0222)) de->read_only = 1; | 83 | if (!(mode & 0222)) de->read_only = 1; |
| 85 | de->first = de->directory = 1; | 84 | de->first = de->directory = 1; |
| 86 | /*de->hidden = de->system = 0;*/ | 85 | /*de->hidden = de->system = 0;*/ |
| 87 | de->fnode = fno; | 86 | de->fnode = cpu_to_le32(fno); |
| 88 | mark_buffer_dirty(bh); | 87 | mark_buffer_dirty(bh); |
| 89 | brelse(bh); | 88 | brelse(bh); |
| 90 | hpfs_mark_4buffers_dirty(&qbh0); | 89 | hpfs_mark_4buffers_dirty(&qbh0); |
| @@ -101,11 +100,9 @@ static int hpfs_mkdir(struct inode *dir, struct dentry *dentry, int mode) | |||
| 101 | hpfs_write_inode_nolock(result); | 100 | hpfs_write_inode_nolock(result); |
| 102 | } | 101 | } |
| 103 | d_instantiate(dentry, result); | 102 | d_instantiate(dentry, result); |
| 104 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 105 | hpfs_unlock(dir->i_sb); | 103 | hpfs_unlock(dir->i_sb); |
| 106 | return 0; | 104 | return 0; |
| 107 | bail3: | 105 | bail3: |
| 108 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 109 | iput(result); | 106 | iput(result); |
| 110 | bail2: | 107 | bail2: |
| 111 | hpfs_brelse4(&qbh0); | 108 | hpfs_brelse4(&qbh0); |
| @@ -140,8 +137,8 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc | |||
| 140 | if (!(mode & 0222)) dee.read_only = 1; | 137 | if (!(mode & 0222)) dee.read_only = 1; |
| 141 | dee.archive = 1; | 138 | dee.archive = 1; |
| 142 | dee.hidden = name[0] == '.'; | 139 | dee.hidden = name[0] == '.'; |
| 143 | dee.fnode = fno; | 140 | dee.fnode = cpu_to_le32(fno); |
| 144 | dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); | 141 | dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); |
| 145 | 142 | ||
| 146 | result = new_inode(dir->i_sb); | 143 | result = new_inode(dir->i_sb); |
| 147 | if (!result) | 144 | if (!result) |
| @@ -154,9 +151,8 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc | |||
| 154 | result->i_op = &hpfs_file_iops; | 151 | result->i_op = &hpfs_file_iops; |
| 155 | result->i_fop = &hpfs_file_ops; | 152 | result->i_fop = &hpfs_file_ops; |
| 156 | result->i_nlink = 1; | 153 | result->i_nlink = 1; |
| 157 | hpfs_decide_conv(result, name, len); | ||
| 158 | hpfs_i(result)->i_parent_dir = dir->i_ino; | 154 | hpfs_i(result)->i_parent_dir = dir->i_ino; |
| 159 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); | 155 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); |
| 160 | result->i_ctime.tv_nsec = 0; | 156 | result->i_ctime.tv_nsec = 0; |
| 161 | result->i_mtime.tv_nsec = 0; | 157 | result->i_mtime.tv_nsec = 0; |
| 162 | result->i_atime.tv_nsec = 0; | 158 | result->i_atime.tv_nsec = 0; |
| @@ -168,8 +164,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc | |||
| 168 | result->i_data.a_ops = &hpfs_aops; | 164 | result->i_data.a_ops = &hpfs_aops; |
| 169 | hpfs_i(result)->mmu_private = 0; | 165 | hpfs_i(result)->mmu_private = 0; |
| 170 | 166 | ||
| 171 | mutex_lock(&hpfs_i(dir)->i_mutex); | 167 | r = hpfs_add_dirent(dir, name, len, &dee); |
| 172 | r = hpfs_add_dirent(dir, name, len, &dee, 0); | ||
| 173 | if (r == 1) | 168 | if (r == 1) |
| 174 | goto bail2; | 169 | goto bail2; |
| 175 | if (r == -1) { | 170 | if (r == -1) { |
| @@ -178,7 +173,7 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc | |||
| 178 | } | 173 | } |
| 179 | fnode->len = len; | 174 | fnode->len = len; |
| 180 | memcpy(fnode->name, name, len > 15 ? 15 : len); | 175 | memcpy(fnode->name, name, len > 15 ? 15 : len); |
| 181 | fnode->up = dir->i_ino; | 176 | fnode->up = cpu_to_le32(dir->i_ino); |
| 182 | mark_buffer_dirty(bh); | 177 | mark_buffer_dirty(bh); |
| 183 | brelse(bh); | 178 | brelse(bh); |
| 184 | 179 | ||
| @@ -193,12 +188,10 @@ static int hpfs_create(struct inode *dir, struct dentry *dentry, int mode, struc | |||
| 193 | hpfs_write_inode_nolock(result); | 188 | hpfs_write_inode_nolock(result); |
| 194 | } | 189 | } |
| 195 | d_instantiate(dentry, result); | 190 | d_instantiate(dentry, result); |
| 196 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 197 | hpfs_unlock(dir->i_sb); | 191 | hpfs_unlock(dir->i_sb); |
| 198 | return 0; | 192 | return 0; |
| 199 | 193 | ||
| 200 | bail2: | 194 | bail2: |
| 201 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 202 | iput(result); | 195 | iput(result); |
| 203 | bail1: | 196 | bail1: |
| 204 | brelse(bh); | 197 | brelse(bh); |
| @@ -232,8 +225,8 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t | |||
| 232 | if (!(mode & 0222)) dee.read_only = 1; | 225 | if (!(mode & 0222)) dee.read_only = 1; |
| 233 | dee.archive = 1; | 226 | dee.archive = 1; |
| 234 | dee.hidden = name[0] == '.'; | 227 | dee.hidden = name[0] == '.'; |
| 235 | dee.fnode = fno; | 228 | dee.fnode = cpu_to_le32(fno); |
| 236 | dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); | 229 | dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); |
| 237 | 230 | ||
| 238 | result = new_inode(dir->i_sb); | 231 | result = new_inode(dir->i_sb); |
| 239 | if (!result) | 232 | if (!result) |
| @@ -242,7 +235,7 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t | |||
| 242 | hpfs_init_inode(result); | 235 | hpfs_init_inode(result); |
| 243 | result->i_ino = fno; | 236 | result->i_ino = fno; |
| 244 | hpfs_i(result)->i_parent_dir = dir->i_ino; | 237 | hpfs_i(result)->i_parent_dir = dir->i_ino; |
| 245 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); | 238 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); |
| 246 | result->i_ctime.tv_nsec = 0; | 239 | result->i_ctime.tv_nsec = 0; |
| 247 | result->i_mtime.tv_nsec = 0; | 240 | result->i_mtime.tv_nsec = 0; |
| 248 | result->i_atime.tv_nsec = 0; | 241 | result->i_atime.tv_nsec = 0; |
| @@ -254,8 +247,7 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t | |||
| 254 | result->i_blocks = 1; | 247 | result->i_blocks = 1; |
| 255 | init_special_inode(result, mode, rdev); | 248 | init_special_inode(result, mode, rdev); |
| 256 | 249 | ||
| 257 | mutex_lock(&hpfs_i(dir)->i_mutex); | 250 | r = hpfs_add_dirent(dir, name, len, &dee); |
| 258 | r = hpfs_add_dirent(dir, name, len, &dee, 0); | ||
| 259 | if (r == 1) | 251 | if (r == 1) |
| 260 | goto bail2; | 252 | goto bail2; |
| 261 | if (r == -1) { | 253 | if (r == -1) { |
| @@ -264,19 +256,17 @@ static int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t | |||
| 264 | } | 256 | } |
| 265 | fnode->len = len; | 257 | fnode->len = len; |
| 266 | memcpy(fnode->name, name, len > 15 ? 15 : len); | 258 | memcpy(fnode->name, name, len > 15 ? 15 : len); |
| 267 | fnode->up = dir->i_ino; | 259 | fnode->up = cpu_to_le32(dir->i_ino); |
| 268 | mark_buffer_dirty(bh); | 260 | mark_buffer_dirty(bh); |
| 269 | 261 | ||
| 270 | insert_inode_hash(result); | 262 | insert_inode_hash(result); |
| 271 | 263 | ||
| 272 | hpfs_write_inode_nolock(result); | 264 | hpfs_write_inode_nolock(result); |
| 273 | d_instantiate(dentry, result); | 265 | d_instantiate(dentry, result); |
| 274 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 275 | brelse(bh); | 266 | brelse(bh); |
| 276 | hpfs_unlock(dir->i_sb); | 267 | hpfs_unlock(dir->i_sb); |
| 277 | return 0; | 268 | return 0; |
| 278 | bail2: | 269 | bail2: |
| 279 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 280 | iput(result); | 270 | iput(result); |
| 281 | bail1: | 271 | bail1: |
| 282 | brelse(bh); | 272 | brelse(bh); |
| @@ -310,8 +300,8 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
| 310 | memset(&dee, 0, sizeof dee); | 300 | memset(&dee, 0, sizeof dee); |
| 311 | dee.archive = 1; | 301 | dee.archive = 1; |
| 312 | dee.hidden = name[0] == '.'; | 302 | dee.hidden = name[0] == '.'; |
| 313 | dee.fnode = fno; | 303 | dee.fnode = cpu_to_le32(fno); |
| 314 | dee.creation_date = dee.write_date = dee.read_date = gmt_to_local(dir->i_sb, get_seconds()); | 304 | dee.creation_date = dee.write_date = dee.read_date = cpu_to_le32(gmt_to_local(dir->i_sb, get_seconds())); |
| 315 | 305 | ||
| 316 | result = new_inode(dir->i_sb); | 306 | result = new_inode(dir->i_sb); |
| 317 | if (!result) | 307 | if (!result) |
| @@ -319,7 +309,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
| 319 | result->i_ino = fno; | 309 | result->i_ino = fno; |
| 320 | hpfs_init_inode(result); | 310 | hpfs_init_inode(result); |
| 321 | hpfs_i(result)->i_parent_dir = dir->i_ino; | 311 | hpfs_i(result)->i_parent_dir = dir->i_ino; |
| 322 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, dee.creation_date); | 312 | result->i_ctime.tv_sec = result->i_mtime.tv_sec = result->i_atime.tv_sec = local_to_gmt(dir->i_sb, le32_to_cpu(dee.creation_date)); |
| 323 | result->i_ctime.tv_nsec = 0; | 313 | result->i_ctime.tv_nsec = 0; |
| 324 | result->i_mtime.tv_nsec = 0; | 314 | result->i_mtime.tv_nsec = 0; |
| 325 | result->i_atime.tv_nsec = 0; | 315 | result->i_atime.tv_nsec = 0; |
| @@ -333,8 +323,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
| 333 | result->i_op = &page_symlink_inode_operations; | 323 | result->i_op = &page_symlink_inode_operations; |
| 334 | result->i_data.a_ops = &hpfs_symlink_aops; | 324 | result->i_data.a_ops = &hpfs_symlink_aops; |
| 335 | 325 | ||
| 336 | mutex_lock(&hpfs_i(dir)->i_mutex); | 326 | r = hpfs_add_dirent(dir, name, len, &dee); |
| 337 | r = hpfs_add_dirent(dir, name, len, &dee, 0); | ||
| 338 | if (r == 1) | 327 | if (r == 1) |
| 339 | goto bail2; | 328 | goto bail2; |
| 340 | if (r == -1) { | 329 | if (r == -1) { |
| @@ -343,7 +332,7 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
| 343 | } | 332 | } |
| 344 | fnode->len = len; | 333 | fnode->len = len; |
| 345 | memcpy(fnode->name, name, len > 15 ? 15 : len); | 334 | memcpy(fnode->name, name, len > 15 ? 15 : len); |
| 346 | fnode->up = dir->i_ino; | 335 | fnode->up = cpu_to_le32(dir->i_ino); |
| 347 | hpfs_set_ea(result, fnode, "SYMLINK", symlink, strlen(symlink)); | 336 | hpfs_set_ea(result, fnode, "SYMLINK", symlink, strlen(symlink)); |
| 348 | mark_buffer_dirty(bh); | 337 | mark_buffer_dirty(bh); |
| 349 | brelse(bh); | 338 | brelse(bh); |
| @@ -352,11 +341,9 @@ static int hpfs_symlink(struct inode *dir, struct dentry *dentry, const char *sy | |||
| 352 | 341 | ||
| 353 | hpfs_write_inode_nolock(result); | 342 | hpfs_write_inode_nolock(result); |
| 354 | d_instantiate(dentry, result); | 343 | d_instantiate(dentry, result); |
| 355 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 356 | hpfs_unlock(dir->i_sb); | 344 | hpfs_unlock(dir->i_sb); |
| 357 | return 0; | 345 | return 0; |
| 358 | bail2: | 346 | bail2: |
| 359 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 360 | iput(result); | 347 | iput(result); |
| 361 | bail1: | 348 | bail1: |
| 362 | brelse(bh); | 349 | brelse(bh); |
| @@ -374,7 +361,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry) | |||
| 374 | struct hpfs_dirent *de; | 361 | struct hpfs_dirent *de; |
| 375 | struct inode *inode = dentry->d_inode; | 362 | struct inode *inode = dentry->d_inode; |
| 376 | dnode_secno dno; | 363 | dnode_secno dno; |
| 377 | fnode_secno fno; | ||
| 378 | int r; | 364 | int r; |
| 379 | int rep = 0; | 365 | int rep = 0; |
| 380 | int err; | 366 | int err; |
| @@ -382,8 +368,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry) | |||
| 382 | hpfs_lock(dir->i_sb); | 368 | hpfs_lock(dir->i_sb); |
| 383 | hpfs_adjust_length(name, &len); | 369 | hpfs_adjust_length(name, &len); |
| 384 | again: | 370 | again: |
| 385 | mutex_lock(&hpfs_i(inode)->i_parent_mutex); | ||
| 386 | mutex_lock(&hpfs_i(dir)->i_mutex); | ||
| 387 | err = -ENOENT; | 371 | err = -ENOENT; |
| 388 | de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); | 372 | de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); |
| 389 | if (!de) | 373 | if (!de) |
| @@ -397,7 +381,6 @@ again: | |||
| 397 | if (de->directory) | 381 | if (de->directory) |
| 398 | goto out1; | 382 | goto out1; |
| 399 | 383 | ||
| 400 | fno = de->fnode; | ||
| 401 | r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); | 384 | r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); |
| 402 | switch (r) { | 385 | switch (r) { |
| 403 | case 1: | 386 | case 1: |
| @@ -410,8 +393,6 @@ again: | |||
| 410 | if (rep++) | 393 | if (rep++) |
| 411 | break; | 394 | break; |
| 412 | 395 | ||
| 413 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 414 | mutex_unlock(&hpfs_i(inode)->i_parent_mutex); | ||
| 415 | dentry_unhash(dentry); | 396 | dentry_unhash(dentry); |
| 416 | if (!d_unhashed(dentry)) { | 397 | if (!d_unhashed(dentry)) { |
| 417 | dput(dentry); | 398 | dput(dentry); |
| @@ -445,8 +426,6 @@ again: | |||
| 445 | out1: | 426 | out1: |
| 446 | hpfs_brelse4(&qbh); | 427 | hpfs_brelse4(&qbh); |
| 447 | out: | 428 | out: |
| 448 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 449 | mutex_unlock(&hpfs_i(inode)->i_parent_mutex); | ||
| 450 | hpfs_unlock(dir->i_sb); | 429 | hpfs_unlock(dir->i_sb); |
| 451 | return err; | 430 | return err; |
| 452 | } | 431 | } |
| @@ -459,15 +438,12 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 459 | struct hpfs_dirent *de; | 438 | struct hpfs_dirent *de; |
| 460 | struct inode *inode = dentry->d_inode; | 439 | struct inode *inode = dentry->d_inode; |
| 461 | dnode_secno dno; | 440 | dnode_secno dno; |
| 462 | fnode_secno fno; | ||
| 463 | int n_items = 0; | 441 | int n_items = 0; |
| 464 | int err; | 442 | int err; |
| 465 | int r; | 443 | int r; |
| 466 | 444 | ||
| 467 | hpfs_adjust_length(name, &len); | 445 | hpfs_adjust_length(name, &len); |
| 468 | hpfs_lock(dir->i_sb); | 446 | hpfs_lock(dir->i_sb); |
| 469 | mutex_lock(&hpfs_i(inode)->i_parent_mutex); | ||
| 470 | mutex_lock(&hpfs_i(dir)->i_mutex); | ||
| 471 | err = -ENOENT; | 447 | err = -ENOENT; |
| 472 | de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); | 448 | de = map_dirent(dir, hpfs_i(dir)->i_dno, name, len, &dno, &qbh); |
| 473 | if (!de) | 449 | if (!de) |
| @@ -486,7 +462,6 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 486 | if (n_items) | 462 | if (n_items) |
| 487 | goto out1; | 463 | goto out1; |
| 488 | 464 | ||
| 489 | fno = de->fnode; | ||
| 490 | r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); | 465 | r = hpfs_remove_dirent(dir, dno, de, &qbh, 1); |
| 491 | switch (r) { | 466 | switch (r) { |
| 492 | case 1: | 467 | case 1: |
| @@ -505,8 +480,6 @@ static int hpfs_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 505 | out1: | 480 | out1: |
| 506 | hpfs_brelse4(&qbh); | 481 | hpfs_brelse4(&qbh); |
| 507 | out: | 482 | out: |
| 508 | mutex_unlock(&hpfs_i(dir)->i_mutex); | ||
| 509 | mutex_unlock(&hpfs_i(inode)->i_parent_mutex); | ||
| 510 | hpfs_unlock(dir->i_sb); | 483 | hpfs_unlock(dir->i_sb); |
| 511 | return err; | 484 | return err; |
| 512 | } | 485 | } |
| @@ -568,12 +541,6 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 568 | 541 | ||
| 569 | hpfs_lock(i->i_sb); | 542 | hpfs_lock(i->i_sb); |
| 570 | /* order doesn't matter, due to VFS exclusion */ | 543 | /* order doesn't matter, due to VFS exclusion */ |
| 571 | mutex_lock(&hpfs_i(i)->i_parent_mutex); | ||
| 572 | if (new_inode) | ||
| 573 | mutex_lock(&hpfs_i(new_inode)->i_parent_mutex); | ||
| 574 | mutex_lock(&hpfs_i(old_dir)->i_mutex); | ||
| 575 | if (new_dir != old_dir) | ||
| 576 | mutex_lock(&hpfs_i(new_dir)->i_mutex); | ||
| 577 | 544 | ||
| 578 | /* Erm? Moving over the empty non-busy directory is perfectly legal */ | 545 | /* Erm? Moving over the empty non-busy directory is perfectly legal */ |
| 579 | if (new_inode && S_ISDIR(new_inode->i_mode)) { | 546 | if (new_inode && S_ISDIR(new_inode->i_mode)) { |
| @@ -610,9 +577,7 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 610 | 577 | ||
| 611 | if (new_dir == old_dir) hpfs_brelse4(&qbh); | 578 | if (new_dir == old_dir) hpfs_brelse4(&qbh); |
| 612 | 579 | ||
| 613 | hpfs_lock_creation(i->i_sb); | 580 | if ((r = hpfs_add_dirent(new_dir, new_name, new_len, &de))) { |
| 614 | if ((r = hpfs_add_dirent(new_dir, new_name, new_len, &de, 1))) { | ||
| 615 | hpfs_unlock_creation(i->i_sb); | ||
| 616 | if (r == -1) hpfs_error(new_dir->i_sb, "hpfs_rename: dirent already exists!"); | 581 | if (r == -1) hpfs_error(new_dir->i_sb, "hpfs_rename: dirent already exists!"); |
| 617 | err = r == 1 ? -ENOSPC : -EFSERROR; | 582 | err = r == 1 ? -ENOSPC : -EFSERROR; |
| 618 | if (new_dir != old_dir) hpfs_brelse4(&qbh); | 583 | if (new_dir != old_dir) hpfs_brelse4(&qbh); |
| @@ -621,20 +586,17 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 621 | 586 | ||
| 622 | if (new_dir == old_dir) | 587 | if (new_dir == old_dir) |
| 623 | if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) { | 588 | if (!(dep = map_dirent(old_dir, hpfs_i(old_dir)->i_dno, old_name, old_len, &dno, &qbh))) { |
| 624 | hpfs_unlock_creation(i->i_sb); | ||
| 625 | hpfs_error(i->i_sb, "lookup succeeded but map dirent failed at #2"); | 589 | hpfs_error(i->i_sb, "lookup succeeded but map dirent failed at #2"); |
| 626 | err = -ENOENT; | 590 | err = -ENOENT; |
| 627 | goto end1; | 591 | goto end1; |
| 628 | } | 592 | } |
| 629 | 593 | ||
| 630 | if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 0))) { | 594 | if ((r = hpfs_remove_dirent(old_dir, dno, dep, &qbh, 0))) { |
| 631 | hpfs_unlock_creation(i->i_sb); | ||
| 632 | hpfs_error(i->i_sb, "hpfs_rename: could not remove dirent"); | 595 | hpfs_error(i->i_sb, "hpfs_rename: could not remove dirent"); |
| 633 | err = r == 2 ? -ENOSPC : -EFSERROR; | 596 | err = r == 2 ? -ENOSPC : -EFSERROR; |
| 634 | goto end1; | 597 | goto end1; |
| 635 | } | 598 | } |
| 636 | hpfs_unlock_creation(i->i_sb); | 599 | |
| 637 | |||
| 638 | end: | 600 | end: |
| 639 | hpfs_i(i)->i_parent_dir = new_dir->i_ino; | 601 | hpfs_i(i)->i_parent_dir = new_dir->i_ino; |
| 640 | if (S_ISDIR(i->i_mode)) { | 602 | if (S_ISDIR(i->i_mode)) { |
| @@ -642,22 +604,14 @@ static int hpfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 642 | drop_nlink(old_dir); | 604 | drop_nlink(old_dir); |
| 643 | } | 605 | } |
| 644 | if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) { | 606 | if ((fnode = hpfs_map_fnode(i->i_sb, i->i_ino, &bh))) { |
| 645 | fnode->up = new_dir->i_ino; | 607 | fnode->up = cpu_to_le32(new_dir->i_ino); |
| 646 | fnode->len = new_len; | 608 | fnode->len = new_len; |
| 647 | memcpy(fnode->name, new_name, new_len>15?15:new_len); | 609 | memcpy(fnode->name, new_name, new_len>15?15:new_len); |
| 648 | if (new_len < 15) memset(&fnode->name[new_len], 0, 15 - new_len); | 610 | if (new_len < 15) memset(&fnode->name[new_len], 0, 15 - new_len); |
| 649 | mark_buffer_dirty(bh); | 611 | mark_buffer_dirty(bh); |
| 650 | brelse(bh); | 612 | brelse(bh); |
| 651 | } | 613 | } |
| 652 | hpfs_i(i)->i_conv = hpfs_sb(i->i_sb)->sb_conv; | ||
| 653 | hpfs_decide_conv(i, new_name, new_len); | ||
| 654 | end1: | 614 | end1: |
| 655 | if (old_dir != new_dir) | ||
| 656 | mutex_unlock(&hpfs_i(new_dir)->i_mutex); | ||
| 657 | mutex_unlock(&hpfs_i(old_dir)->i_mutex); | ||
| 658 | mutex_unlock(&hpfs_i(i)->i_parent_mutex); | ||
| 659 | if (new_inode) | ||
| 660 | mutex_unlock(&hpfs_i(new_inode)->i_parent_mutex); | ||
| 661 | hpfs_unlock(i->i_sb); | 615 | hpfs_unlock(i->i_sb); |
| 662 | return err; | 616 | return err; |
| 663 | } | 617 | } |
diff --git a/fs/hpfs/super.c b/fs/hpfs/super.c index c89b40808587..98580a3b5005 100644 --- a/fs/hpfs/super.c +++ b/fs/hpfs/super.c | |||
| @@ -18,15 +18,16 @@ | |||
| 18 | 18 | ||
| 19 | /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ | 19 | /* Mark the filesystem dirty, so that chkdsk checks it when os/2 booted */ |
| 20 | 20 | ||
| 21 | static void mark_dirty(struct super_block *s) | 21 | static void mark_dirty(struct super_block *s, int remount) |
| 22 | { | 22 | { |
| 23 | if (hpfs_sb(s)->sb_chkdsk && !(s->s_flags & MS_RDONLY)) { | 23 | if (hpfs_sb(s)->sb_chkdsk && (remount || !(s->s_flags & MS_RDONLY))) { |
| 24 | struct buffer_head *bh; | 24 | struct buffer_head *bh; |
| 25 | struct hpfs_spare_block *sb; | 25 | struct hpfs_spare_block *sb; |
| 26 | if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { | 26 | if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { |
| 27 | sb->dirty = 1; | 27 | sb->dirty = 1; |
| 28 | sb->old_wrote = 0; | 28 | sb->old_wrote = 0; |
| 29 | mark_buffer_dirty(bh); | 29 | mark_buffer_dirty(bh); |
| 30 | sync_dirty_buffer(bh); | ||
| 30 | brelse(bh); | 31 | brelse(bh); |
| 31 | } | 32 | } |
| 32 | } | 33 | } |
| @@ -40,10 +41,12 @@ static void unmark_dirty(struct super_block *s) | |||
| 40 | struct buffer_head *bh; | 41 | struct buffer_head *bh; |
| 41 | struct hpfs_spare_block *sb; | 42 | struct hpfs_spare_block *sb; |
| 42 | if (s->s_flags & MS_RDONLY) return; | 43 | if (s->s_flags & MS_RDONLY) return; |
| 44 | sync_blockdev(s->s_bdev); | ||
| 43 | if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { | 45 | if ((sb = hpfs_map_sector(s, 17, &bh, 0))) { |
| 44 | sb->dirty = hpfs_sb(s)->sb_chkdsk > 1 - hpfs_sb(s)->sb_was_error; | 46 | sb->dirty = hpfs_sb(s)->sb_chkdsk > 1 - hpfs_sb(s)->sb_was_error; |
| 45 | sb->old_wrote = hpfs_sb(s)->sb_chkdsk >= 2 && !hpfs_sb(s)->sb_was_error; | 47 | sb->old_wrote = hpfs_sb(s)->sb_chkdsk >= 2 && !hpfs_sb(s)->sb_was_error; |
| 46 | mark_buffer_dirty(bh); | 48 | mark_buffer_dirty(bh); |
| 49 | sync_dirty_buffer(bh); | ||
| 47 | brelse(bh); | 50 | brelse(bh); |
| 48 | } | 51 | } |
| 49 | } | 52 | } |
| @@ -63,13 +66,13 @@ void hpfs_error(struct super_block *s, const char *fmt, ...) | |||
| 63 | if (!hpfs_sb(s)->sb_was_error) { | 66 | if (!hpfs_sb(s)->sb_was_error) { |
| 64 | if (hpfs_sb(s)->sb_err == 2) { | 67 | if (hpfs_sb(s)->sb_err == 2) { |
| 65 | printk("; crashing the system because you wanted it\n"); | 68 | printk("; crashing the system because you wanted it\n"); |
| 66 | mark_dirty(s); | 69 | mark_dirty(s, 0); |
| 67 | panic("HPFS panic"); | 70 | panic("HPFS panic"); |
| 68 | } else if (hpfs_sb(s)->sb_err == 1) { | 71 | } else if (hpfs_sb(s)->sb_err == 1) { |
| 69 | if (s->s_flags & MS_RDONLY) printk("; already mounted read-only\n"); | 72 | if (s->s_flags & MS_RDONLY) printk("; already mounted read-only\n"); |
| 70 | else { | 73 | else { |
| 71 | printk("; remounting read-only\n"); | 74 | printk("; remounting read-only\n"); |
| 72 | mark_dirty(s); | 75 | mark_dirty(s, 0); |
| 73 | s->s_flags |= MS_RDONLY; | 76 | s->s_flags |= MS_RDONLY; |
| 74 | } | 77 | } |
| 75 | } else if (s->s_flags & MS_RDONLY) printk("; going on - but anything won't be destroyed because it's read-only\n"); | 78 | } else if (s->s_flags & MS_RDONLY) printk("; going on - but anything won't be destroyed because it's read-only\n"); |
| @@ -102,9 +105,12 @@ static void hpfs_put_super(struct super_block *s) | |||
| 102 | { | 105 | { |
| 103 | struct hpfs_sb_info *sbi = hpfs_sb(s); | 106 | struct hpfs_sb_info *sbi = hpfs_sb(s); |
| 104 | 107 | ||
| 108 | hpfs_lock(s); | ||
| 109 | unmark_dirty(s); | ||
| 110 | hpfs_unlock(s); | ||
| 111 | |||
| 105 | kfree(sbi->sb_cp_table); | 112 | kfree(sbi->sb_cp_table); |
| 106 | kfree(sbi->sb_bmp_dir); | 113 | kfree(sbi->sb_bmp_dir); |
| 107 | unmark_dirty(s); | ||
| 108 | s->s_fs_info = NULL; | 114 | s->s_fs_info = NULL; |
| 109 | kfree(sbi); | 115 | kfree(sbi); |
| 110 | } | 116 | } |
| @@ -129,7 +135,7 @@ static unsigned count_bitmaps(struct super_block *s) | |||
| 129 | n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14; | 135 | n_bands = (hpfs_sb(s)->sb_fs_size + 0x3fff) >> 14; |
| 130 | count = 0; | 136 | count = 0; |
| 131 | for (n = 0; n < n_bands; n++) | 137 | for (n = 0; n < n_bands; n++) |
| 132 | count += hpfs_count_one_bitmap(s, hpfs_sb(s)->sb_bmp_dir[n]); | 138 | count += hpfs_count_one_bitmap(s, le32_to_cpu(hpfs_sb(s)->sb_bmp_dir[n])); |
| 133 | return count; | 139 | return count; |
| 134 | } | 140 | } |
| 135 | 141 | ||
| @@ -188,8 +194,6 @@ static void init_once(void *foo) | |||
| 188 | { | 194 | { |
| 189 | struct hpfs_inode_info *ei = (struct hpfs_inode_info *) foo; | 195 | struct hpfs_inode_info *ei = (struct hpfs_inode_info *) foo; |
| 190 | 196 | ||
| 191 | mutex_init(&ei->i_mutex); | ||
| 192 | mutex_init(&ei->i_parent_mutex); | ||
| 193 | inode_init_once(&ei->vfs_inode); | 197 | inode_init_once(&ei->vfs_inode); |
| 194 | } | 198 | } |
| 195 | 199 | ||
| @@ -218,7 +222,6 @@ static void destroy_inodecache(void) | |||
| 218 | 222 | ||
| 219 | enum { | 223 | enum { |
| 220 | Opt_help, Opt_uid, Opt_gid, Opt_umask, Opt_case_lower, Opt_case_asis, | 224 | Opt_help, Opt_uid, Opt_gid, Opt_umask, Opt_case_lower, Opt_case_asis, |
| 221 | Opt_conv_binary, Opt_conv_text, Opt_conv_auto, | ||
| 222 | Opt_check_none, Opt_check_normal, Opt_check_strict, | 225 | Opt_check_none, Opt_check_normal, Opt_check_strict, |
| 223 | Opt_err_cont, Opt_err_ro, Opt_err_panic, | 226 | Opt_err_cont, Opt_err_ro, Opt_err_panic, |
| 224 | Opt_eas_no, Opt_eas_ro, Opt_eas_rw, | 227 | Opt_eas_no, Opt_eas_ro, Opt_eas_rw, |
| @@ -233,9 +236,6 @@ static const match_table_t tokens = { | |||
| 233 | {Opt_umask, "umask=%o"}, | 236 | {Opt_umask, "umask=%o"}, |
| 234 | {Opt_case_lower, "case=lower"}, | 237 | {Opt_case_lower, "case=lower"}, |
| 235 | {Opt_case_asis, "case=asis"}, | 238 | {Opt_case_asis, "case=asis"}, |
| 236 | {Opt_conv_binary, "conv=binary"}, | ||
| 237 | {Opt_conv_text, "conv=text"}, | ||
| 238 | {Opt_conv_auto, "conv=auto"}, | ||
| 239 | {Opt_check_none, "check=none"}, | 239 | {Opt_check_none, "check=none"}, |
| 240 | {Opt_check_normal, "check=normal"}, | 240 | {Opt_check_normal, "check=normal"}, |
| 241 | {Opt_check_strict, "check=strict"}, | 241 | {Opt_check_strict, "check=strict"}, |
| @@ -253,7 +253,7 @@ static const match_table_t tokens = { | |||
| 253 | }; | 253 | }; |
| 254 | 254 | ||
| 255 | static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, | 255 | static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, |
| 256 | int *lowercase, int *conv, int *eas, int *chk, int *errs, | 256 | int *lowercase, int *eas, int *chk, int *errs, |
| 257 | int *chkdsk, int *timeshift) | 257 | int *chkdsk, int *timeshift) |
| 258 | { | 258 | { |
| 259 | char *p; | 259 | char *p; |
| @@ -295,15 +295,6 @@ static int parse_opts(char *opts, uid_t *uid, gid_t *gid, umode_t *umask, | |||
| 295 | case Opt_case_asis: | 295 | case Opt_case_asis: |
| 296 | *lowercase = 0; | 296 | *lowercase = 0; |
| 297 | break; | 297 | break; |
| 298 | case Opt_conv_binary: | ||
| 299 | *conv = CONV_BINARY; | ||
| 300 | break; | ||
| 301 | case Opt_conv_text: | ||
| 302 | *conv = CONV_TEXT; | ||
| 303 | break; | ||
| 304 | case Opt_conv_auto: | ||
| 305 | *conv = CONV_AUTO; | ||
| 306 | break; | ||
| 307 | case Opt_check_none: | 298 | case Opt_check_none: |
| 308 | *chk = 0; | 299 | *chk = 0; |
| 309 | break; | 300 | break; |
| @@ -370,9 +361,6 @@ HPFS filesystem options:\n\ | |||
| 370 | umask=xxx set mode of files that don't have mode specified in eas\n\ | 361 | umask=xxx set mode of files that don't have mode specified in eas\n\ |
| 371 | case=lower lowercase all files\n\ | 362 | case=lower lowercase all files\n\ |
| 372 | case=asis do not lowercase files (default)\n\ | 363 | case=asis do not lowercase files (default)\n\ |
| 373 | conv=binary do not convert CR/LF -> LF (default)\n\ | ||
| 374 | conv=auto convert only files with known text extensions\n\ | ||
| 375 | conv=text convert all files\n\ | ||
| 376 | check=none no fs checks - kernel may crash on corrupted filesystem\n\ | 364 | check=none no fs checks - kernel may crash on corrupted filesystem\n\ |
| 377 | check=normal do some checks - it should not crash (default)\n\ | 365 | check=normal do some checks - it should not crash (default)\n\ |
| 378 | check=strict do extra time-consuming checks, used for debugging\n\ | 366 | check=strict do extra time-consuming checks, used for debugging\n\ |
| @@ -394,7 +382,7 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
| 394 | uid_t uid; | 382 | uid_t uid; |
| 395 | gid_t gid; | 383 | gid_t gid; |
| 396 | umode_t umask; | 384 | umode_t umask; |
| 397 | int lowercase, conv, eas, chk, errs, chkdsk, timeshift; | 385 | int lowercase, eas, chk, errs, chkdsk, timeshift; |
| 398 | int o; | 386 | int o; |
| 399 | struct hpfs_sb_info *sbi = hpfs_sb(s); | 387 | struct hpfs_sb_info *sbi = hpfs_sb(s); |
| 400 | char *new_opts = kstrdup(data, GFP_KERNEL); | 388 | char *new_opts = kstrdup(data, GFP_KERNEL); |
| @@ -405,11 +393,11 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
| 405 | lock_super(s); | 393 | lock_super(s); |
| 406 | uid = sbi->sb_uid; gid = sbi->sb_gid; | 394 | uid = sbi->sb_uid; gid = sbi->sb_gid; |
| 407 | umask = 0777 & ~sbi->sb_mode; | 395 | umask = 0777 & ~sbi->sb_mode; |
| 408 | lowercase = sbi->sb_lowercase; conv = sbi->sb_conv; | 396 | lowercase = sbi->sb_lowercase; |
| 409 | eas = sbi->sb_eas; chk = sbi->sb_chk; chkdsk = sbi->sb_chkdsk; | 397 | eas = sbi->sb_eas; chk = sbi->sb_chk; chkdsk = sbi->sb_chkdsk; |
| 410 | errs = sbi->sb_err; timeshift = sbi->sb_timeshift; | 398 | errs = sbi->sb_err; timeshift = sbi->sb_timeshift; |
| 411 | 399 | ||
| 412 | if (!(o = parse_opts(data, &uid, &gid, &umask, &lowercase, &conv, | 400 | if (!(o = parse_opts(data, &uid, &gid, &umask, &lowercase, |
| 413 | &eas, &chk, &errs, &chkdsk, ×hift))) { | 401 | &eas, &chk, &errs, &chkdsk, ×hift))) { |
| 414 | printk("HPFS: bad mount options.\n"); | 402 | printk("HPFS: bad mount options.\n"); |
| 415 | goto out_err; | 403 | goto out_err; |
| @@ -427,11 +415,11 @@ static int hpfs_remount_fs(struct super_block *s, int *flags, char *data) | |||
| 427 | 415 | ||
| 428 | sbi->sb_uid = uid; sbi->sb_gid = gid; | 416 | sbi->sb_uid = uid; sbi->sb_gid = gid; |
| 429 | sbi->sb_mode = 0777 & ~umask; | 417 | sbi->sb_mode = 0777 & ~umask; |
| 430 | sbi->sb_lowercase = lowercase; sbi->sb_conv = conv; | 418 | sbi->sb_lowercase = lowercase; |
| 431 | sbi->sb_eas = eas; sbi->sb_chk = chk; sbi->sb_chkdsk = chkdsk; | 419 | sbi->sb_eas = eas; sbi->sb_chk = chk; sbi->sb_chkdsk = chkdsk; |
| 432 | sbi->sb_err = errs; sbi->sb_timeshift = timeshift; | 420 | sbi->sb_err = errs; sbi->sb_timeshift = timeshift; |
| 433 | 421 | ||
| 434 | if (!(*flags & MS_RDONLY)) mark_dirty(s); | 422 | if (!(*flags & MS_RDONLY)) mark_dirty(s, 1); |
| 435 | 423 | ||
| 436 | replace_mount_options(s, new_opts); | 424 | replace_mount_options(s, new_opts); |
| 437 | 425 | ||
| @@ -471,7 +459,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 471 | uid_t uid; | 459 | uid_t uid; |
| 472 | gid_t gid; | 460 | gid_t gid; |
| 473 | umode_t umask; | 461 | umode_t umask; |
| 474 | int lowercase, conv, eas, chk, errs, chkdsk, timeshift; | 462 | int lowercase, eas, chk, errs, chkdsk, timeshift; |
| 475 | 463 | ||
| 476 | dnode_secno root_dno; | 464 | dnode_secno root_dno; |
| 477 | struct hpfs_dirent *de = NULL; | 465 | struct hpfs_dirent *de = NULL; |
| @@ -479,11 +467,6 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 479 | 467 | ||
| 480 | int o; | 468 | int o; |
| 481 | 469 | ||
| 482 | if (num_possible_cpus() > 1) { | ||
| 483 | printk(KERN_ERR "HPFS is not SMP safe\n"); | ||
| 484 | return -EINVAL; | ||
| 485 | } | ||
| 486 | |||
| 487 | save_mount_options(s, options); | 470 | save_mount_options(s, options); |
| 488 | 471 | ||
| 489 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); | 472 | sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); |
| @@ -495,20 +478,20 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 495 | sbi->sb_bmp_dir = NULL; | 478 | sbi->sb_bmp_dir = NULL; |
| 496 | sbi->sb_cp_table = NULL; | 479 | sbi->sb_cp_table = NULL; |
| 497 | 480 | ||
| 498 | mutex_init(&sbi->hpfs_creation_de); | 481 | mutex_init(&sbi->hpfs_mutex); |
| 482 | hpfs_lock(s); | ||
| 499 | 483 | ||
| 500 | uid = current_uid(); | 484 | uid = current_uid(); |
| 501 | gid = current_gid(); | 485 | gid = current_gid(); |
| 502 | umask = current_umask(); | 486 | umask = current_umask(); |
| 503 | lowercase = 0; | 487 | lowercase = 0; |
| 504 | conv = CONV_BINARY; | ||
| 505 | eas = 2; | 488 | eas = 2; |
| 506 | chk = 1; | 489 | chk = 1; |
| 507 | errs = 1; | 490 | errs = 1; |
| 508 | chkdsk = 1; | 491 | chkdsk = 1; |
| 509 | timeshift = 0; | 492 | timeshift = 0; |
| 510 | 493 | ||
| 511 | if (!(o = parse_opts(options, &uid, &gid, &umask, &lowercase, &conv, | 494 | if (!(o = parse_opts(options, &uid, &gid, &umask, &lowercase, |
| 512 | &eas, &chk, &errs, &chkdsk, ×hift))) { | 495 | &eas, &chk, &errs, &chkdsk, ×hift))) { |
| 513 | printk("HPFS: bad mount options.\n"); | 496 | printk("HPFS: bad mount options.\n"); |
| 514 | goto bail0; | 497 | goto bail0; |
| @@ -526,9 +509,9 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 526 | if (!(spareblock = hpfs_map_sector(s, 17, &bh2, 0))) goto bail3; | 509 | if (!(spareblock = hpfs_map_sector(s, 17, &bh2, 0))) goto bail3; |
| 527 | 510 | ||
| 528 | /* Check magics */ | 511 | /* Check magics */ |
| 529 | if (/*bootblock->magic != BB_MAGIC | 512 | if (/*le16_to_cpu(bootblock->magic) != BB_MAGIC |
| 530 | ||*/ superblock->magic != SB_MAGIC | 513 | ||*/ le32_to_cpu(superblock->magic) != SB_MAGIC |
| 531 | || spareblock->magic != SP_MAGIC) { | 514 | || le32_to_cpu(spareblock->magic) != SP_MAGIC) { |
| 532 | if (!silent) printk("HPFS: Bad magic ... probably not HPFS\n"); | 515 | if (!silent) printk("HPFS: Bad magic ... probably not HPFS\n"); |
| 533 | goto bail4; | 516 | goto bail4; |
| 534 | } | 517 | } |
| @@ -549,19 +532,18 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 549 | s->s_op = &hpfs_sops; | 532 | s->s_op = &hpfs_sops; |
| 550 | s->s_d_op = &hpfs_dentry_operations; | 533 | s->s_d_op = &hpfs_dentry_operations; |
| 551 | 534 | ||
| 552 | sbi->sb_root = superblock->root; | 535 | sbi->sb_root = le32_to_cpu(superblock->root); |
| 553 | sbi->sb_fs_size = superblock->n_sectors; | 536 | sbi->sb_fs_size = le32_to_cpu(superblock->n_sectors); |
| 554 | sbi->sb_bitmaps = superblock->bitmaps; | 537 | sbi->sb_bitmaps = le32_to_cpu(superblock->bitmaps); |
| 555 | sbi->sb_dirband_start = superblock->dir_band_start; | 538 | sbi->sb_dirband_start = le32_to_cpu(superblock->dir_band_start); |
| 556 | sbi->sb_dirband_size = superblock->n_dir_band; | 539 | sbi->sb_dirband_size = le32_to_cpu(superblock->n_dir_band); |
| 557 | sbi->sb_dmap = superblock->dir_band_bitmap; | 540 | sbi->sb_dmap = le32_to_cpu(superblock->dir_band_bitmap); |
| 558 | sbi->sb_uid = uid; | 541 | sbi->sb_uid = uid; |
| 559 | sbi->sb_gid = gid; | 542 | sbi->sb_gid = gid; |
| 560 | sbi->sb_mode = 0777 & ~umask; | 543 | sbi->sb_mode = 0777 & ~umask; |
| 561 | sbi->sb_n_free = -1; | 544 | sbi->sb_n_free = -1; |
| 562 | sbi->sb_n_free_dnodes = -1; | 545 | sbi->sb_n_free_dnodes = -1; |
| 563 | sbi->sb_lowercase = lowercase; | 546 | sbi->sb_lowercase = lowercase; |
| 564 | sbi->sb_conv = conv; | ||
| 565 | sbi->sb_eas = eas; | 547 | sbi->sb_eas = eas; |
| 566 | sbi->sb_chk = chk; | 548 | sbi->sb_chk = chk; |
| 567 | sbi->sb_chkdsk = chkdsk; | 549 | sbi->sb_chkdsk = chkdsk; |
| @@ -573,7 +555,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 573 | sbi->sb_max_fwd_alloc = 0xffffff; | 555 | sbi->sb_max_fwd_alloc = 0xffffff; |
| 574 | 556 | ||
| 575 | /* Load bitmap directory */ | 557 | /* Load bitmap directory */ |
| 576 | if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, superblock->bitmaps))) | 558 | if (!(sbi->sb_bmp_dir = hpfs_load_bitmap_directory(s, le32_to_cpu(superblock->bitmaps)))) |
| 577 | goto bail4; | 559 | goto bail4; |
| 578 | 560 | ||
| 579 | /* Check for general fs errors*/ | 561 | /* Check for general fs errors*/ |
| @@ -591,20 +573,20 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 591 | mark_buffer_dirty(bh2); | 573 | mark_buffer_dirty(bh2); |
| 592 | } | 574 | } |
| 593 | 575 | ||
| 594 | if (spareblock->hotfixes_used || spareblock->n_spares_used) { | 576 | if (le32_to_cpu(spareblock->hotfixes_used) || le32_to_cpu(spareblock->n_spares_used)) { |
| 595 | if (errs >= 2) { | 577 | if (errs >= 2) { |
| 596 | printk("HPFS: Hotfixes not supported here, try chkdsk\n"); | 578 | printk("HPFS: Hotfixes not supported here, try chkdsk\n"); |
| 597 | mark_dirty(s); | 579 | mark_dirty(s, 0); |
| 598 | goto bail4; | 580 | goto bail4; |
| 599 | } | 581 | } |
| 600 | hpfs_error(s, "hotfixes not supported here, try chkdsk"); | 582 | hpfs_error(s, "hotfixes not supported here, try chkdsk"); |
| 601 | if (errs == 0) printk("HPFS: Proceeding, but your filesystem will be probably corrupted by this driver...\n"); | 583 | if (errs == 0) printk("HPFS: Proceeding, but your filesystem will be probably corrupted by this driver...\n"); |
| 602 | else printk("HPFS: This driver may read bad files or crash when operating on disk with hotfixes.\n"); | 584 | else printk("HPFS: This driver may read bad files or crash when operating on disk with hotfixes.\n"); |
| 603 | } | 585 | } |
| 604 | if (spareblock->n_dnode_spares != spareblock->n_dnode_spares_free) { | 586 | if (le32_to_cpu(spareblock->n_dnode_spares) != le32_to_cpu(spareblock->n_dnode_spares_free)) { |
| 605 | if (errs >= 2) { | 587 | if (errs >= 2) { |
| 606 | printk("HPFS: Spare dnodes used, try chkdsk\n"); | 588 | printk("HPFS: Spare dnodes used, try chkdsk\n"); |
| 607 | mark_dirty(s); | 589 | mark_dirty(s, 0); |
| 608 | goto bail4; | 590 | goto bail4; |
| 609 | } | 591 | } |
| 610 | hpfs_error(s, "warning: spare dnodes used, try chkdsk"); | 592 | hpfs_error(s, "warning: spare dnodes used, try chkdsk"); |
| @@ -612,26 +594,26 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 612 | } | 594 | } |
| 613 | if (chk) { | 595 | if (chk) { |
| 614 | unsigned a; | 596 | unsigned a; |
| 615 | if (superblock->dir_band_end - superblock->dir_band_start + 1 != superblock->n_dir_band || | 597 | if (le32_to_cpu(superblock->dir_band_end) - le32_to_cpu(superblock->dir_band_start) + 1 != le32_to_cpu(superblock->n_dir_band) || |
| 616 | superblock->dir_band_end < superblock->dir_band_start || superblock->n_dir_band > 0x4000) { | 598 | le32_to_cpu(superblock->dir_band_end) < le32_to_cpu(superblock->dir_band_start) || le32_to_cpu(superblock->n_dir_band) > 0x4000) { |
| 617 | hpfs_error(s, "dir band size mismatch: dir_band_start==%08x, dir_band_end==%08x, n_dir_band==%08x", | 599 | hpfs_error(s, "dir band size mismatch: dir_band_start==%08x, dir_band_end==%08x, n_dir_band==%08x", |
| 618 | superblock->dir_band_start, superblock->dir_band_end, superblock->n_dir_band); | 600 | le32_to_cpu(superblock->dir_band_start), le32_to_cpu(superblock->dir_band_end), le32_to_cpu(superblock->n_dir_band)); |
| 619 | goto bail4; | 601 | goto bail4; |
| 620 | } | 602 | } |
| 621 | a = sbi->sb_dirband_size; | 603 | a = sbi->sb_dirband_size; |
| 622 | sbi->sb_dirband_size = 0; | 604 | sbi->sb_dirband_size = 0; |
| 623 | if (hpfs_chk_sectors(s, superblock->dir_band_start, superblock->n_dir_band, "dir_band") || | 605 | if (hpfs_chk_sectors(s, le32_to_cpu(superblock->dir_band_start), le32_to_cpu(superblock->n_dir_band), "dir_band") || |
| 624 | hpfs_chk_sectors(s, superblock->dir_band_bitmap, 4, "dir_band_bitmap") || | 606 | hpfs_chk_sectors(s, le32_to_cpu(superblock->dir_band_bitmap), 4, "dir_band_bitmap") || |
| 625 | hpfs_chk_sectors(s, superblock->bitmaps, 4, "bitmaps")) { | 607 | hpfs_chk_sectors(s, le32_to_cpu(superblock->bitmaps), 4, "bitmaps")) { |
| 626 | mark_dirty(s); | 608 | mark_dirty(s, 0); |
| 627 | goto bail4; | 609 | goto bail4; |
| 628 | } | 610 | } |
| 629 | sbi->sb_dirband_size = a; | 611 | sbi->sb_dirband_size = a; |
| 630 | } else printk("HPFS: You really don't want any checks? You are crazy...\n"); | 612 | } else printk("HPFS: You really don't want any checks? You are crazy...\n"); |
| 631 | 613 | ||
| 632 | /* Load code page table */ | 614 | /* Load code page table */ |
| 633 | if (spareblock->n_code_pages) | 615 | if (le32_to_cpu(spareblock->n_code_pages)) |
| 634 | if (!(sbi->sb_cp_table = hpfs_load_code_page(s, spareblock->code_page_dir))) | 616 | if (!(sbi->sb_cp_table = hpfs_load_code_page(s, le32_to_cpu(spareblock->code_page_dir)))) |
| 635 | printk("HPFS: Warning: code page support is disabled\n"); | 617 | printk("HPFS: Warning: code page support is disabled\n"); |
| 636 | 618 | ||
| 637 | brelse(bh2); | 619 | brelse(bh2); |
| @@ -660,13 +642,13 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 660 | if (!de) | 642 | if (!de) |
| 661 | hpfs_error(s, "unable to find root dir"); | 643 | hpfs_error(s, "unable to find root dir"); |
| 662 | else { | 644 | else { |
| 663 | root->i_atime.tv_sec = local_to_gmt(s, de->read_date); | 645 | root->i_atime.tv_sec = local_to_gmt(s, le32_to_cpu(de->read_date)); |
| 664 | root->i_atime.tv_nsec = 0; | 646 | root->i_atime.tv_nsec = 0; |
| 665 | root->i_mtime.tv_sec = local_to_gmt(s, de->write_date); | 647 | root->i_mtime.tv_sec = local_to_gmt(s, le32_to_cpu(de->write_date)); |
| 666 | root->i_mtime.tv_nsec = 0; | 648 | root->i_mtime.tv_nsec = 0; |
| 667 | root->i_ctime.tv_sec = local_to_gmt(s, de->creation_date); | 649 | root->i_ctime.tv_sec = local_to_gmt(s, le32_to_cpu(de->creation_date)); |
| 668 | root->i_ctime.tv_nsec = 0; | 650 | root->i_ctime.tv_nsec = 0; |
| 669 | hpfs_i(root)->i_ea_size = de->ea_size; | 651 | hpfs_i(root)->i_ea_size = le16_to_cpu(de->ea_size); |
| 670 | hpfs_i(root)->i_parent_dir = root->i_ino; | 652 | hpfs_i(root)->i_parent_dir = root->i_ino; |
| 671 | if (root->i_size == -1) | 653 | if (root->i_size == -1) |
| 672 | root->i_size = 2048; | 654 | root->i_size = 2048; |
| @@ -674,6 +656,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent) | |||
| 674 | root->i_blocks = 5; | 656 | root->i_blocks = 5; |
| 675 | hpfs_brelse4(&qbh); | 657 | hpfs_brelse4(&qbh); |
| 676 | } | 658 | } |
| 659 | hpfs_unlock(s); | ||
| 677 | return 0; | 660 | return 0; |
| 678 | 661 | ||
| 679 | bail4: brelse(bh2); | 662 | bail4: brelse(bh2); |
| @@ -681,6 +664,7 @@ bail3: brelse(bh1); | |||
| 681 | bail2: brelse(bh0); | 664 | bail2: brelse(bh0); |
| 682 | bail1: | 665 | bail1: |
| 683 | bail0: | 666 | bail0: |
| 667 | hpfs_unlock(s); | ||
| 684 | kfree(sbi->sb_bmp_dir); | 668 | kfree(sbi->sb_bmp_dir); |
| 685 | kfree(sbi->sb_cp_table); | 669 | kfree(sbi->sb_cp_table); |
| 686 | s->s_fs_info = NULL; | 670 | s->s_fs_info = NULL; |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index c2f93a8ae2e1..564b14aa7e16 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
| @@ -86,7 +86,7 @@ static inline bool drm_mm_initialized(struct drm_mm *mm) | |||
| 86 | } | 86 | } |
| 87 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ | 87 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ |
| 88 | &(mm)->head_node.node_list, \ | 88 | &(mm)->head_node.node_list, \ |
| 89 | node_list); | 89 | node_list) |
| 90 | #define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ | 90 | #define drm_mm_for_each_scanned_node_reverse(entry, n, mm) \ |
| 91 | for (entry = (mm)->prev_scanned_node, \ | 91 | for (entry = (mm)->prev_scanned_node, \ |
| 92 | next = entry ? list_entry(entry->node_list.next, \ | 92 | next = entry ? list_entry(entry->node_list.next, \ |
diff --git a/sound/soc/davinci/davinci-mcasp.c b/sound/soc/davinci/davinci-mcasp.c index a5af834c8ef5..4ddc6d3b6678 100644 --- a/sound/soc/davinci/davinci-mcasp.c +++ b/sound/soc/davinci/davinci-mcasp.c | |||
| @@ -434,17 +434,21 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 434 | mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); | 434 | mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); |
| 435 | mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); | 435 | mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); |
| 436 | 436 | ||
| 437 | mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, (0x7 << 26)); | 437 | mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, |
| 438 | ACLKX | AHCLKX | AFSX); | ||
| 438 | break; | 439 | break; |
| 439 | case SND_SOC_DAIFMT_CBM_CFS: | 440 | case SND_SOC_DAIFMT_CBM_CFS: |
| 440 | /* codec is clock master and frame slave */ | 441 | /* codec is clock master and frame slave */ |
| 441 | mcasp_set_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE); | 442 | mcasp_clr_bits(base + DAVINCI_MCASP_ACLKXCTL_REG, ACLKXE); |
| 442 | mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE); | 443 | mcasp_set_bits(base + DAVINCI_MCASP_TXFMCTL_REG, AFSXE); |
| 443 | 444 | ||
| 444 | mcasp_set_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); | 445 | mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); |
| 445 | mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); | 446 | mcasp_set_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); |
| 446 | 447 | ||
| 447 | mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, (0x2d << 26)); | 448 | mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG, |
| 449 | ACLKX | ACLKR); | ||
| 450 | mcasp_set_bits(base + DAVINCI_MCASP_PDIR_REG, | ||
| 451 | AFSX | AFSR); | ||
| 448 | break; | 452 | break; |
| 449 | case SND_SOC_DAIFMT_CBM_CFM: | 453 | case SND_SOC_DAIFMT_CBM_CFM: |
| 450 | /* codec is clock and frame master */ | 454 | /* codec is clock and frame master */ |
| @@ -454,7 +458,8 @@ static int davinci_mcasp_set_dai_fmt(struct snd_soc_dai *cpu_dai, | |||
| 454 | mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); | 458 | mcasp_clr_bits(base + DAVINCI_MCASP_ACLKRCTL_REG, ACLKRE); |
| 455 | mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); | 459 | mcasp_clr_bits(base + DAVINCI_MCASP_RXFMCTL_REG, AFSRE); |
| 456 | 460 | ||
| 457 | mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG, (0x3f << 26)); | 461 | mcasp_clr_bits(base + DAVINCI_MCASP_PDIR_REG, |
| 462 | ACLKX | AHCLKX | AFSX | ACLKR | AHCLKR | AFSR); | ||
| 458 | break; | 463 | break; |
| 459 | 464 | ||
| 460 | default: | 465 | default: |
| @@ -644,7 +649,7 @@ static void davinci_hw_param(struct davinci_audio_dev *dev, int stream) | |||
| 644 | mcasp_set_reg(dev->base + DAVINCI_MCASP_TXTDM_REG, mask); | 649 | mcasp_set_reg(dev->base + DAVINCI_MCASP_TXTDM_REG, mask); |
| 645 | mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, TXORD); | 650 | mcasp_set_bits(dev->base + DAVINCI_MCASP_TXFMT_REG, TXORD); |
| 646 | 651 | ||
| 647 | if ((dev->tdm_slots >= 2) || (dev->tdm_slots <= 32)) | 652 | if ((dev->tdm_slots >= 2) && (dev->tdm_slots <= 32)) |
| 648 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG, | 653 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_TXFMCTL_REG, |
| 649 | FSXMOD(dev->tdm_slots), FSXMOD(0x1FF)); | 654 | FSXMOD(dev->tdm_slots), FSXMOD(0x1FF)); |
| 650 | else | 655 | else |
| @@ -660,7 +665,7 @@ static void davinci_hw_param(struct davinci_audio_dev *dev, int stream) | |||
| 660 | AHCLKRE); | 665 | AHCLKRE); |
| 661 | mcasp_set_reg(dev->base + DAVINCI_MCASP_RXTDM_REG, mask); | 666 | mcasp_set_reg(dev->base + DAVINCI_MCASP_RXTDM_REG, mask); |
| 662 | 667 | ||
| 663 | if ((dev->tdm_slots >= 2) || (dev->tdm_slots <= 32)) | 668 | if ((dev->tdm_slots >= 2) && (dev->tdm_slots <= 32)) |
| 664 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, | 669 | mcasp_mod_bits(dev->base + DAVINCI_MCASP_RXFMCTL_REG, |
| 665 | FSRMOD(dev->tdm_slots), FSRMOD(0x1FF)); | 670 | FSRMOD(dev->tdm_slots), FSRMOD(0x1FF)); |
| 666 | else | 671 | else |
diff --git a/sound/soc/samsung/goni_wm8994.c b/sound/soc/samsung/goni_wm8994.c index f6b3a3ce5919..0e80daee8b6f 100644 --- a/sound/soc/samsung/goni_wm8994.c +++ b/sound/soc/samsung/goni_wm8994.c | |||
| @@ -236,18 +236,18 @@ static struct snd_soc_dai_link goni_dai[] = { | |||
| 236 | .name = "WM8994", | 236 | .name = "WM8994", |
| 237 | .stream_name = "WM8994 HiFi", | 237 | .stream_name = "WM8994 HiFi", |
| 238 | .cpu_dai_name = "samsung-i2s.0", | 238 | .cpu_dai_name = "samsung-i2s.0", |
| 239 | .codec_dai_name = "wm8994-hifi", | 239 | .codec_dai_name = "wm8994-aif1", |
| 240 | .platform_name = "samsung-audio", | 240 | .platform_name = "samsung-audio", |
| 241 | .codec_name = "wm8994-codec.0-0x1a", | 241 | .codec_name = "wm8994-codec.0-001a", |
| 242 | .init = goni_wm8994_init, | 242 | .init = goni_wm8994_init, |
| 243 | .ops = &goni_hifi_ops, | 243 | .ops = &goni_hifi_ops, |
| 244 | }, { | 244 | }, { |
| 245 | .name = "WM8994 Voice", | 245 | .name = "WM8994 Voice", |
| 246 | .stream_name = "Voice", | 246 | .stream_name = "Voice", |
| 247 | .cpu_dai_name = "goni-voice-dai", | 247 | .cpu_dai_name = "goni-voice-dai", |
| 248 | .codec_dai_name = "wm8994-voice", | 248 | .codec_dai_name = "wm8994-aif2", |
| 249 | .platform_name = "samsung-audio", | 249 | .platform_name = "samsung-audio", |
| 250 | .codec_name = "wm8994-codec.0-0x1a", | 250 | .codec_name = "wm8994-codec.0-001a", |
| 251 | .ops = &goni_voice_ops, | 251 | .ops = &goni_voice_ops, |
| 252 | }, | 252 | }, |
| 253 | }; | 253 | }; |
