diff options
| -rw-r--r-- | fs/fat/fatent.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/fs/fat/fatent.c b/fs/fat/fatent.c index ab171ea8e869..2c1b73fb82ae 100644 --- a/fs/fat/fatent.c +++ b/fs/fat/fatent.c | |||
| @@ -17,6 +17,8 @@ struct fatent_operations { | |||
| 17 | int (*ent_next)(struct fat_entry *); | 17 | int (*ent_next)(struct fat_entry *); |
| 18 | }; | 18 | }; |
| 19 | 19 | ||
| 20 | static DEFINE_SPINLOCK(fat12_entry_lock); | ||
| 21 | |||
| 20 | static void fat12_ent_blocknr(struct super_block *sb, int entry, | 22 | static void fat12_ent_blocknr(struct super_block *sb, int entry, |
| 21 | int *offset, sector_t *blocknr) | 23 | int *offset, sector_t *blocknr) |
| 22 | { | 24 | { |
| @@ -116,10 +118,13 @@ static int fat12_ent_get(struct fat_entry *fatent) | |||
| 116 | u8 **ent12_p = fatent->u.ent12_p; | 118 | u8 **ent12_p = fatent->u.ent12_p; |
| 117 | int next; | 119 | int next; |
| 118 | 120 | ||
| 121 | spin_lock(&fat12_entry_lock); | ||
| 119 | if (fatent->entry & 1) | 122 | if (fatent->entry & 1) |
| 120 | next = (*ent12_p[0] >> 4) | (*ent12_p[1] << 4); | 123 | next = (*ent12_p[0] >> 4) | (*ent12_p[1] << 4); |
| 121 | else | 124 | else |
| 122 | next = (*ent12_p[1] << 8) | *ent12_p[0]; | 125 | next = (*ent12_p[1] << 8) | *ent12_p[0]; |
| 126 | spin_unlock(&fat12_entry_lock); | ||
| 127 | |||
| 123 | next &= 0x0fff; | 128 | next &= 0x0fff; |
| 124 | if (next >= BAD_FAT12) | 129 | if (next >= BAD_FAT12) |
| 125 | next = FAT_ENT_EOF; | 130 | next = FAT_ENT_EOF; |
| @@ -151,6 +156,7 @@ static void fat12_ent_put(struct fat_entry *fatent, int new) | |||
| 151 | if (new == FAT_ENT_EOF) | 156 | if (new == FAT_ENT_EOF) |
| 152 | new = EOF_FAT12; | 157 | new = EOF_FAT12; |
| 153 | 158 | ||
| 159 | spin_lock(&fat12_entry_lock); | ||
| 154 | if (fatent->entry & 1) { | 160 | if (fatent->entry & 1) { |
| 155 | *ent12_p[0] = (new << 4) | (*ent12_p[0] & 0x0f); | 161 | *ent12_p[0] = (new << 4) | (*ent12_p[0] & 0x0f); |
| 156 | *ent12_p[1] = new >> 4; | 162 | *ent12_p[1] = new >> 4; |
| @@ -158,6 +164,7 @@ static void fat12_ent_put(struct fat_entry *fatent, int new) | |||
| 158 | *ent12_p[0] = new & 0xff; | 164 | *ent12_p[0] = new & 0xff; |
| 159 | *ent12_p[1] = (*ent12_p[1] & 0xf0) | (new >> 8); | 165 | *ent12_p[1] = (*ent12_p[1] & 0xf0) | (new >> 8); |
| 160 | } | 166 | } |
| 167 | spin_unlock(&fat12_entry_lock); | ||
| 161 | 168 | ||
| 162 | mark_buffer_dirty(fatent->bhs[0]); | 169 | mark_buffer_dirty(fatent->bhs[0]); |
| 163 | if (fatent->nr_bhs == 2) | 170 | if (fatent->nr_bhs == 2) |
