Skip to content

Commit 1b1dcc1

Browse files
Jes SorensenIngo Molnar
authored andcommitted
[PATCH] mutex subsystem, semaphore to mutex: VFS, ->i_sem
This patch converts the inode semaphore to a mutex. I have tested it on XFS and compiled as much as one can consider on an ia64. Anyway your luck with it might be different. Modified-by: Ingo Molnar <[email protected]> (finished the conversion) Signed-off-by: Jes Sorensen <[email protected]> Signed-off-by: Ingo Molnar <[email protected]>
1 parent 794ee1b commit 1b1dcc1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+563
-573
lines changed

arch/powerpc/platforms/cell/spufs/inode.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ spufs_delete_inode(struct inode *inode)
137137
static void spufs_prune_dir(struct dentry *dir)
138138
{
139139
struct dentry *dentry, *tmp;
140-
down(&dir->d_inode->i_sem);
140+
mutex_lock(&dir->d_inode->i_mutex);
141141
list_for_each_entry_safe(dentry, tmp, &dir->d_subdirs, d_child) {
142142
spin_lock(&dcache_lock);
143143
spin_lock(&dentry->d_lock);
@@ -154,23 +154,23 @@ static void spufs_prune_dir(struct dentry *dir)
154154
}
155155
}
156156
shrink_dcache_parent(dir);
157-
up(&dir->d_inode->i_sem);
157+
mutex_unlock(&dir->d_inode->i_mutex);
158158
}
159159

160160
static int spufs_rmdir(struct inode *root, struct dentry *dir_dentry)
161161
{
162162
struct spu_context *ctx;
163163

164164
/* remove all entries */
165-
down(&root->i_sem);
165+
mutex_lock(&root->i_mutex);
166166
spufs_prune_dir(dir_dentry);
167-
up(&root->i_sem);
167+
mutex_unlock(&root->i_mutex);
168168

169169
/* We have to give up the mm_struct */
170170
ctx = SPUFS_I(dir_dentry->d_inode)->i_ctx;
171171
spu_forget(ctx);
172172

173-
/* XXX Do we need to hold i_sem here ? */
173+
/* XXX Do we need to hold i_mutex here ? */
174174
return simple_rmdir(root, dir_dentry);
175175
}
176176

@@ -330,7 +330,7 @@ long spufs_create_thread(struct nameidata *nd,
330330
out_dput:
331331
dput(dentry);
332332
out_dir:
333-
up(&nd->dentry->d_inode->i_sem);
333+
mutex_unlock(&nd->dentry->d_inode->i_mutex);
334334
out:
335335
return ret;
336336
}

drivers/block/loop.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ static int do_lo_send_aops(struct loop_device *lo, struct bio_vec *bvec,
215215
unsigned offset, bv_offs;
216216
int len, ret;
217217

218-
down(&mapping->host->i_sem);
218+
mutex_lock(&mapping->host->i_mutex);
219219
index = pos >> PAGE_CACHE_SHIFT;
220220
offset = pos & ((pgoff_t)PAGE_CACHE_SIZE - 1);
221221
bv_offs = bvec->bv_offset;
@@ -278,7 +278,7 @@ static int do_lo_send_aops(struct loop_device *lo, struct bio_vec *bvec,
278278
}
279279
ret = 0;
280280
out:
281-
up(&mapping->host->i_sem);
281+
mutex_unlock(&mapping->host->i_mutex);
282282
return ret;
283283
unlock:
284284
unlock_page(page);

drivers/char/mem.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,7 @@ static loff_t memory_lseek(struct file * file, loff_t offset, int orig)
741741
{
742742
loff_t ret;
743743

744-
down(&file->f_dentry->d_inode->i_sem);
744+
mutex_lock(&file->f_dentry->d_inode->i_mutex);
745745
switch (orig) {
746746
case 0:
747747
file->f_pos = offset;
@@ -756,7 +756,7 @@ static loff_t memory_lseek(struct file * file, loff_t offset, int orig)
756756
default:
757757
ret = -EINVAL;
758758
}
759-
up(&file->f_dentry->d_inode->i_sem);
759+
mutex_unlock(&file->f_dentry->d_inode->i_mutex);
760760
return ret;
761761
}
762762

drivers/isdn/capi/capifs.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ static struct dentry *get_node(int num)
138138
{
139139
char s[10];
140140
struct dentry *root = capifs_root;
141-
down(&root->d_inode->i_sem);
141+
mutex_lock(&root->d_inode->i_mutex);
142142
return lookup_one_len(s, root, sprintf(s, "%d", num));
143143
}
144144

@@ -159,7 +159,7 @@ void capifs_new_ncci(unsigned int number, dev_t device)
159159
dentry = get_node(number);
160160
if (!IS_ERR(dentry) && !dentry->d_inode)
161161
d_instantiate(dentry, inode);
162-
up(&capifs_root->d_inode->i_sem);
162+
mutex_unlock(&capifs_root->d_inode->i_mutex);
163163
}
164164

165165
void capifs_free_ncci(unsigned int number)
@@ -175,7 +175,7 @@ void capifs_free_ncci(unsigned int number)
175175
}
176176
dput(dentry);
177177
}
178-
up(&capifs_root->d_inode->i_sem);
178+
mutex_unlock(&capifs_root->d_inode->i_mutex);
179179
}
180180

181181
static int __init capifs_init(void)

drivers/md/dm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -837,9 +837,9 @@ static void __set_size(struct mapped_device *md, sector_t size)
837837
{
838838
set_capacity(md->disk, size);
839839

840-
down(&md->suspended_bdev->bd_inode->i_sem);
840+
mutex_lock(&md->suspended_bdev->bd_inode->i_mutex);
841841
i_size_write(md->suspended_bdev->bd_inode, (loff_t)size << SECTOR_SHIFT);
842-
up(&md->suspended_bdev->bd_inode->i_sem);
842+
mutex_unlock(&md->suspended_bdev->bd_inode->i_mutex);
843843
}
844844

845845
static int __bind(struct mapped_device *md, struct dm_table *t)

drivers/md/md.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3460,9 +3460,9 @@ static int update_size(mddev_t *mddev, unsigned long size)
34603460

34613461
bdev = bdget_disk(mddev->gendisk, 0);
34623462
if (bdev) {
3463-
down(&bdev->bd_inode->i_sem);
3463+
mutex_lock(&bdev->bd_inode->i_mutex);
34643464
i_size_write(bdev->bd_inode, mddev->array_size << 10);
3465-
up(&bdev->bd_inode->i_sem);
3465+
mutex_unlock(&bdev->bd_inode->i_mutex);
34663466
bdput(bdev);
34673467
}
34683468
}
@@ -3486,9 +3486,9 @@ static int update_raid_disks(mddev_t *mddev, int raid_disks)
34863486

34873487
bdev = bdget_disk(mddev->gendisk, 0);
34883488
if (bdev) {
3489-
down(&bdev->bd_inode->i_sem);
3489+
mutex_lock(&bdev->bd_inode->i_mutex);
34903490
i_size_write(bdev->bd_inode, mddev->array_size << 10);
3491-
up(&bdev->bd_inode->i_sem);
3491+
mutex_unlock(&bdev->bd_inode->i_mutex);
34923492
bdput(bdev);
34933493
}
34943494
}

drivers/pci/proc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ proc_bus_pci_lseek(struct file *file, loff_t off, int whence)
2525
loff_t new = -1;
2626
struct inode *inode = file->f_dentry->d_inode;
2727

28-
down(&inode->i_sem);
28+
mutex_lock(&inode->i_mutex);
2929
switch (whence) {
3030
case 0:
3131
new = off;
@@ -41,7 +41,7 @@ proc_bus_pci_lseek(struct file *file, loff_t off, int whence)
4141
new = -EINVAL;
4242
else
4343
file->f_pos = new;
44-
up(&inode->i_sem);
44+
mutex_unlock(&inode->i_mutex);
4545
return new;
4646
}
4747

drivers/usb/core/inode.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,13 @@ static void update_bus(struct dentry *bus)
184184
bus->d_inode->i_gid = busgid;
185185
bus->d_inode->i_mode = S_IFDIR | busmode;
186186

187-
down(&bus->d_inode->i_sem);
187+
mutex_lock(&bus->d_inode->i_mutex);
188188

189189
list_for_each_entry(dev, &bus->d_subdirs, d_u.d_child)
190190
if (dev->d_inode)
191191
update_dev(dev);
192192

193-
up(&bus->d_inode->i_sem);
193+
mutex_unlock(&bus->d_inode->i_mutex);
194194
}
195195

196196
static void update_sb(struct super_block *sb)
@@ -201,7 +201,7 @@ static void update_sb(struct super_block *sb)
201201
if (!root)
202202
return;
203203

204-
down(&root->d_inode->i_sem);
204+
mutex_lock(&root->d_inode->i_mutex);
205205

206206
list_for_each_entry(bus, &root->d_subdirs, d_u.d_child) {
207207
if (bus->d_inode) {
@@ -219,7 +219,7 @@ static void update_sb(struct super_block *sb)
219219
}
220220
}
221221

222-
up(&root->d_inode->i_sem);
222+
mutex_unlock(&root->d_inode->i_mutex);
223223
}
224224

225225
static int remount(struct super_block *sb, int *flags, char *data)
@@ -333,10 +333,10 @@ static int usbfs_empty (struct dentry *dentry)
333333
static int usbfs_unlink (struct inode *dir, struct dentry *dentry)
334334
{
335335
struct inode *inode = dentry->d_inode;
336-
down(&inode->i_sem);
336+
mutex_lock(&inode->i_mutex);
337337
dentry->d_inode->i_nlink--;
338338
dput(dentry);
339-
up(&inode->i_sem);
339+
mutex_unlock(&inode->i_mutex);
340340
d_delete(dentry);
341341
return 0;
342342
}
@@ -346,7 +346,7 @@ static int usbfs_rmdir(struct inode *dir, struct dentry *dentry)
346346
int error = -ENOTEMPTY;
347347
struct inode * inode = dentry->d_inode;
348348

349-
down(&inode->i_sem);
349+
mutex_lock(&inode->i_mutex);
350350
dentry_unhash(dentry);
351351
if (usbfs_empty(dentry)) {
352352
dentry->d_inode->i_nlink -= 2;
@@ -355,7 +355,7 @@ static int usbfs_rmdir(struct inode *dir, struct dentry *dentry)
355355
dir->i_nlink--;
356356
error = 0;
357357
}
358-
up(&inode->i_sem);
358+
mutex_unlock(&inode->i_mutex);
359359
if (!error)
360360
d_delete(dentry);
361361
dput(dentry);
@@ -380,7 +380,7 @@ static loff_t default_file_lseek (struct file *file, loff_t offset, int orig)
380380
{
381381
loff_t retval = -EINVAL;
382382

383-
down(&file->f_dentry->d_inode->i_sem);
383+
mutex_lock(&file->f_dentry->d_inode->i_mutex);
384384
switch(orig) {
385385
case 0:
386386
if (offset > 0) {
@@ -397,7 +397,7 @@ static loff_t default_file_lseek (struct file *file, loff_t offset, int orig)
397397
default:
398398
break;
399399
}
400-
up(&file->f_dentry->d_inode->i_sem);
400+
mutex_unlock(&file->f_dentry->d_inode->i_mutex);
401401
return retval;
402402
}
403403

@@ -480,7 +480,7 @@ static int fs_create_by_name (const char *name, mode_t mode,
480480
}
481481

482482
*dentry = NULL;
483-
down(&parent->d_inode->i_sem);
483+
mutex_lock(&parent->d_inode->i_mutex);
484484
*dentry = lookup_one_len(name, parent, strlen(name));
485485
if (!IS_ERR(dentry)) {
486486
if ((mode & S_IFMT) == S_IFDIR)
@@ -489,7 +489,7 @@ static int fs_create_by_name (const char *name, mode_t mode,
489489
error = usbfs_create (parent->d_inode, *dentry, mode);
490490
} else
491491
error = PTR_ERR(dentry);
492-
up(&parent->d_inode->i_sem);
492+
mutex_unlock(&parent->d_inode->i_mutex);
493493

494494
return error;
495495
}
@@ -528,7 +528,7 @@ static void fs_remove_file (struct dentry *dentry)
528528
if (!parent || !parent->d_inode)
529529
return;
530530

531-
down(&parent->d_inode->i_sem);
531+
mutex_lock(&parent->d_inode->i_mutex);
532532
if (usbfs_positive(dentry)) {
533533
if (dentry->d_inode) {
534534
if (S_ISDIR(dentry->d_inode->i_mode))
@@ -538,7 +538,7 @@ static void fs_remove_file (struct dentry *dentry)
538538
dput(dentry);
539539
}
540540
}
541-
up(&parent->d_inode->i_sem);
541+
mutex_unlock(&parent->d_inode->i_mutex);
542542
}
543543

544544
/* --------------------------------------------------------------------- */

drivers/usb/gadget/file_storage.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1891,7 +1891,7 @@ static int fsync_sub(struct lun *curlun)
18911891
return -EINVAL;
18921892

18931893
inode = filp->f_dentry->d_inode;
1894-
down(&inode->i_sem);
1894+
mutex_lock(&inode->i_mutex);
18951895
current->flags |= PF_SYNCWRITE;
18961896
rc = filemap_fdatawrite(inode->i_mapping);
18971897
err = filp->f_op->fsync(filp, filp->f_dentry, 1);
@@ -1901,7 +1901,7 @@ static int fsync_sub(struct lun *curlun)
19011901
if (!rc)
19021902
rc = err;
19031903
current->flags &= ~PF_SYNCWRITE;
1904-
up(&inode->i_sem);
1904+
mutex_unlock(&inode->i_mutex);
19051905
VLDBG(curlun, "fdatasync -> %d\n", rc);
19061906
return rc;
19071907
}

drivers/usb/gadget/inode.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1562,10 +1562,10 @@ static void destroy_ep_files (struct dev_data *dev)
15621562
spin_unlock_irq (&dev->lock);
15631563

15641564
/* break link to dcache */
1565-
down (&parent->i_sem);
1565+
mutex_lock (&parent->i_mutex);
15661566
d_delete (dentry);
15671567
dput (dentry);
1568-
up (&parent->i_sem);
1568+
mutex_unlock (&parent->i_mutex);
15691569

15701570
/* fds may still be open */
15711571
goto restart;

fs/affs/inode.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,10 @@ affs_put_inode(struct inode *inode)
244244
pr_debug("AFFS: put_inode(ino=%lu, nlink=%u)\n", inode->i_ino, inode->i_nlink);
245245
affs_free_prealloc(inode);
246246
if (atomic_read(&inode->i_count) == 1) {
247-
down(&inode->i_sem);
247+
mutex_lock(&inode->i_mutex);
248248
if (inode->i_size != AFFS_I(inode)->mmu_private)
249249
affs_truncate(inode);
250-
up(&inode->i_sem);
250+
mutex_unlock(&inode->i_mutex);
251251
}
252252
}
253253

fs/autofs/root.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,9 @@ static struct dentry *autofs_root_lookup(struct inode *dir, struct dentry *dentr
229229
dentry->d_flags |= DCACHE_AUTOFS_PENDING;
230230
d_add(dentry, NULL);
231231

232-
up(&dir->i_sem);
232+
mutex_unlock(&dir->i_mutex);
233233
autofs_revalidate(dentry, nd);
234-
down(&dir->i_sem);
234+
mutex_lock(&dir->i_mutex);
235235

236236
/*
237237
* If we are still pending, check if we had to handle

fs/autofs4/root.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -489,9 +489,9 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
489489
d_add(dentry, NULL);
490490

491491
if (dentry->d_op && dentry->d_op->d_revalidate) {
492-
up(&dir->i_sem);
492+
mutex_unlock(&dir->i_mutex);
493493
(dentry->d_op->d_revalidate)(dentry, nd);
494-
down(&dir->i_sem);
494+
mutex_lock(&dir->i_mutex);
495495
}
496496

497497
/*

fs/binfmt_misc.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -588,11 +588,11 @@ static ssize_t bm_entry_write(struct file *file, const char __user *buffer,
588588
case 2: set_bit(Enabled, &e->flags);
589589
break;
590590
case 3: root = dget(file->f_vfsmnt->mnt_sb->s_root);
591-
down(&root->d_inode->i_sem);
591+
mutex_lock(&root->d_inode->i_mutex);
592592

593593
kill_node(e);
594594

595-
up(&root->d_inode->i_sem);
595+
mutex_unlock(&root->d_inode->i_mutex);
596596
dput(root);
597597
break;
598598
default: return res;
@@ -622,7 +622,7 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer,
622622
return PTR_ERR(e);
623623

624624
root = dget(sb->s_root);
625-
down(&root->d_inode->i_sem);
625+
mutex_lock(&root->d_inode->i_mutex);
626626
dentry = lookup_one_len(e->name, root, strlen(e->name));
627627
err = PTR_ERR(dentry);
628628
if (IS_ERR(dentry))
@@ -658,7 +658,7 @@ static ssize_t bm_register_write(struct file *file, const char __user *buffer,
658658
out2:
659659
dput(dentry);
660660
out:
661-
up(&root->d_inode->i_sem);
661+
mutex_unlock(&root->d_inode->i_mutex);
662662
dput(root);
663663

664664
if (err) {
@@ -703,12 +703,12 @@ static ssize_t bm_status_write(struct file * file, const char __user * buffer,
703703
case 1: enabled = 0; break;
704704
case 2: enabled = 1; break;
705705
case 3: root = dget(file->f_vfsmnt->mnt_sb->s_root);
706-
down(&root->d_inode->i_sem);
706+
mutex_lock(&root->d_inode->i_mutex);
707707

708708
while (!list_empty(&entries))
709709
kill_node(list_entry(entries.next, Node, list));
710710

711-
up(&root->d_inode->i_sem);
711+
mutex_unlock(&root->d_inode->i_mutex);
712712
dput(root);
713713
default: return res;
714714
}

0 commit comments

Comments
 (0)