diff options
Diffstat (limited to 'fs/fat')
-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) |