X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Flloop.c;h=93525761db9053ac5f4536e98000544dd40b5771;hb=8f2dbe8765d585895eabdfe0646ed0794c057426;hp=31fcb4b6b3507b24bc647ed0f50a2f99e9584ff1;hpb=6aea71f39238f370c02a2f293a01555cc653bd01;p=fs%2Flustre-release.git diff --git a/lustre/llite/lloop.c b/lustre/llite/lloop.c index 31fcb4b..9352576 100644 --- a/lustre/llite/lloop.c +++ b/lustre/llite/lloop.c @@ -28,6 +28,8 @@ /* * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. + * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -141,7 +143,7 @@ struct lloop_device { struct bio *lo_biotail; int lo_state; cfs_semaphore_t lo_sem; - cfs_semaphore_t lo_ctl_mutex; + cfs_mutex_t lo_ctl_mutex; cfs_atomic_t lo_pending; cfs_waitq_t lo_bh_wait; @@ -170,7 +172,7 @@ static int lloop_major; static int max_loop = MAX_LOOP_DEFAULT; static struct lloop_device *loop_dev; static struct gendisk **disks; -static cfs_semaphore_t lloop_mutex; +static cfs_mutex_t lloop_mutex; static void *ll_iocontrol_magic = NULL; static loff_t get_loop_size(struct lloop_device *lo, struct file *file) @@ -376,6 +378,7 @@ err: return 0; } +#ifdef HAVE_REQUEST_QUEUE_UNPLUG_FN /* * kick off io on the underlying address space */ @@ -386,6 +389,7 @@ static void loop_unplug(struct request_queue *q) clear_bit(QUEUE_FLAG_PLUGGED, &q->queue_flags); blk_run_address_space(lo->lo_backing_file->f_mapping); } +#endif static inline void loop_handle_bio(struct lloop_device *lo, struct bio *bio) { @@ -538,7 +542,9 @@ static int loop_set_fd(struct lloop_device *lo, struct file *unused, */ blk_queue_make_request(lo->lo_queue, loop_make_request); lo->lo_queue->queuedata = lo; +#ifdef HAVE_REQUEST_QUEUE_UNPLUG_FN lo->lo_queue->unplug_fn = loop_unplug; +#endif /* queue parameters */ CLASSERT(CFS_PAGE_SIZE < (1 << (sizeof(unsigned short) * 8))); @@ -611,9 +617,9 @@ static int lo_open(struct inode *inode, struct file *file) struct lloop_device *lo = inode->i_bdev->bd_disk->private_data; #endif - cfs_down(&lo->lo_ctl_mutex); + cfs_mutex_lock(&lo->lo_ctl_mutex); lo->lo_refcnt++; - cfs_up(&lo->lo_ctl_mutex); + cfs_mutex_unlock(&lo->lo_ctl_mutex); return 0; } @@ -628,9 +634,9 @@ static int lo_release(struct inode *inode, struct file *file) struct lloop_device *lo = inode->i_bdev->bd_disk->private_data; #endif - cfs_down(&lo->lo_ctl_mutex); + cfs_mutex_lock(&lo->lo_ctl_mutex); --lo->lo_refcnt; - cfs_up(&lo->lo_ctl_mutex); + cfs_mutex_unlock(&lo->lo_ctl_mutex); return 0; } @@ -641,17 +647,18 @@ static int lo_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, unsigned long arg) { struct lloop_device *lo = bdev->bd_disk->private_data; - struct inode *inode = lo->lo_backing_file->f_dentry->d_inode; + struct inode *inode = NULL; + int err = 0; #else static int lo_ioctl(struct inode *inode, struct file *unused, unsigned int cmd, unsigned long arg) { struct lloop_device *lo = inode->i_bdev->bd_disk->private_data; struct block_device *bdev = inode->i_bdev; -#endif int err = 0; +#endif - cfs_down(&lloop_mutex); + cfs_mutex_lock(&lloop_mutex); switch (cmd) { case LL_IOC_LLOOP_DETACH: { err = loop_clr_fd(lo, bdev, 2); @@ -663,6 +670,9 @@ static int lo_ioctl(struct inode *inode, struct file *unused, case LL_IOC_LLOOP_INFO: { struct lu_fid fid; + LASSERT(lo->lo_backing_file != NULL); + if (inode == NULL) + inode = lo->lo_backing_file->f_dentry->d_inode; if (lo->lo_state == LLOOP_BOUND) fid = ll_i2info(inode)->lli_fid; else @@ -677,7 +687,7 @@ static int lo_ioctl(struct inode *inode, struct file *unused, err = -EINVAL; break; } - cfs_up(&lloop_mutex); + cfs_mutex_unlock(&lloop_mutex); return err; } @@ -713,7 +723,7 @@ static enum llioc_iter lloop_ioctl(struct inode *unused, struct file *file, CWARN("Enter llop_ioctl\n"); - cfs_down(&lloop_mutex); + cfs_mutex_lock(&lloop_mutex); switch (cmd) { case LL_IOC_LLOOP_ATTACH: { struct lloop_device *lo_free = NULL; @@ -740,7 +750,7 @@ static enum llioc_iter lloop_ioctl(struct inode *unused, struct file *file, if (put_user((long)old_encode_dev(dev), (long*)arg)) GOTO(out, err = -EFAULT); - bdev = open_by_devnum(dev, file->f_mode); + bdev = blkdev_get_by_dev(dev, file->f_mode, NULL); if (IS_ERR(bdev)) GOTO(out, err = PTR_ERR(bdev)); @@ -783,7 +793,7 @@ static enum llioc_iter lloop_ioctl(struct inode *unused, struct file *file, } out: - cfs_up(&lloop_mutex); + cfs_mutex_unlock(&lloop_mutex); out1: if (rcp) *rcp = err; @@ -829,7 +839,7 @@ static int __init lloop_init(void) goto out_mem3; } - cfs_init_mutex(&lloop_mutex); + cfs_mutex_init(&lloop_mutex); for (i = 0; i < max_loop; i++) { struct lloop_device *lo = &loop_dev[i]; @@ -839,8 +849,8 @@ static int __init lloop_init(void) if (!lo->lo_queue) goto out_mem4; - cfs_init_mutex(&lo->lo_ctl_mutex); - cfs_init_mutex_locked(&lo->lo_sem); + cfs_mutex_init(&lo->lo_ctl_mutex); + cfs_sema_init(&lo->lo_sem, 0); cfs_waitq_init(&lo->lo_bh_wait); lo->lo_number = i; cfs_spin_lock_init(&lo->lo_lock);