X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Flloop.c;h=15e4314b20cbb6126dc2955e6f141315e55bcd1b;hb=da94c5388a4e4344e86b837ff35c2c693569fc77;hp=fa98a4942692a352661477ce9a5bd12c06bc7d1a;hpb=f2a9374170e4522b9d2ac3b7096cf2912339d480;p=fs%2Flustre-release.git diff --git a/lustre/llite/lloop.c b/lustre/llite/lloop.c index fa98a49..15e4314 100644 --- a/lustre/llite/lloop.c +++ b/lustre/llite/lloop.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -29,8 +27,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011 Whamcloud, Inc. - * + * Copyright (c) 2011, Whamcloud, Inc. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -144,7 +141,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; @@ -173,7 +170,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) @@ -379,6 +376,7 @@ err: return 0; } +#ifdef HAVE_REQUEST_QUEUE_UNPLUG_FN /* * kick off io on the underlying address space */ @@ -389,6 +387,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) { @@ -541,7 +540,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))); @@ -614,9 +615,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; } @@ -631,9 +632,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; } @@ -644,17 +645,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); @@ -666,6 +668,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 @@ -680,7 +685,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; } @@ -716,7 +721,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; @@ -743,7 +748,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)); @@ -786,7 +791,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; @@ -832,7 +837,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]; @@ -842,8 +847,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);