#include <linux/backing-dev.h>
#include <linux/buffer_head.h>
#include <linux/smp_lock.h>
-#include <linux/blktrace_api.h>
#include <asm/uaccess.h>
static int blkpg_ioctl(struct block_device *bdev, struct blkpg_ioctl_arg __user *arg)
return -EINVAL;
}
/* partition number in use? */
- mutex_lock(&bdev->bd_mutex);
+ down(&bdev->bd_sem);
if (disk->part[part - 1]) {
- mutex_unlock(&bdev->bd_mutex);
+ up(&bdev->bd_sem);
return -EBUSY;
}
/* overlap? */
continue;
if (!(start+length <= s->start_sect ||
start >= s->start_sect + s->nr_sects)) {
- mutex_unlock(&bdev->bd_mutex);
+ up(&bdev->bd_sem);
return -EBUSY;
}
}
/* all seems OK */
add_partition(disk, part, start, length);
- mutex_unlock(&bdev->bd_mutex);
+ up(&bdev->bd_sem);
return 0;
case BLKPG_DEL_PARTITION:
if (!disk->part[part-1])
bdevp = bdget_disk(disk, part);
if (!bdevp)
return -ENOMEM;
- mutex_lock(&bdevp->bd_mutex);
+ down(&bdevp->bd_sem);
if (bdevp->bd_openers) {
- mutex_unlock(&bdevp->bd_mutex);
+ up(&bdevp->bd_sem);
bdput(bdevp);
return -EBUSY;
}
fsync_bdev(bdevp);
invalidate_bdev(bdevp, 0);
- mutex_lock(&bdev->bd_mutex);
+ down(&bdev->bd_sem);
delete_partition(disk, part);
- mutex_unlock(&bdev->bd_mutex);
- mutex_unlock(&bdevp->bd_mutex);
+ up(&bdev->bd_sem);
+ up(&bdevp->bd_sem);
bdput(bdevp);
return 0;
return -EINVAL;
if (!capable(CAP_SYS_ADMIN))
return -EACCES;
- if (!mutex_trylock(&bdev->bd_mutex))
+ if (down_trylock(&bdev->bd_sem))
return -EBUSY;
res = rescan_partitions(disk, bdev);
- mutex_unlock(&bdev->bd_mutex);
+ up(&bdev->bd_sem);
return res;
}
return put_ulong(arg, bdev->bd_inode->i_size >> 9);
case BLKGETSIZE64:
return put_u64(arg, bdev->bd_inode->i_size);
- case BLKTRACESTART:
- case BLKTRACESTOP:
- case BLKTRACESETUP:
- case BLKTRACETEARDOWN:
- return blk_trace_ioctl(bdev, cmd, (char __user *) arg);
}
return -ENOIOCTLCMD;
}