diff options
Diffstat (limited to 'fs/jfs/jfs_logmgr.c')
| -rw-r--r-- | fs/jfs/jfs_logmgr.c | 47 | 
1 files changed, 23 insertions, 24 deletions
diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index e1b8493b9aa..0acddf60af5 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -67,6 +67,7 @@  #include <linux/buffer_head.h>		/* for sync_blockdev() */  #include <linux/bio.h>  #include <linux/freezer.h> +#include <linux/export.h>  #include <linux/delay.h>  #include <linux/mutex.h>  #include <linux/seq_file.h> @@ -166,7 +167,7 @@ do {						\   * Global list of active external journals   */  static LIST_HEAD(jfs_external_logs); -static struct jfs_log *dummy_log = NULL; +static struct jfs_log *dummy_log;  static DEFINE_MUTEX(jfs_log_mutex);  /* @@ -1057,7 +1058,8 @@ static int lmLogSync(struct jfs_log * log, int hard_sync)   */  void jfs_syncpt(struct jfs_log *log, int hard_sync)  {	LOG_LOCK(log); -	lmLogSync(log, hard_sync); +	if (!test_bit(log_QUIESCE, &log->flag)) +		lmLogSync(log, hard_sync);  	LOG_UNLOCK(log);  } @@ -1120,16 +1122,13 @@ int lmLogOpen(struct super_block *sb)  	 * file systems to log may have n-to-1 relationship;  	 */ -	bdev = open_by_devnum(sbi->logdev, FMODE_READ|FMODE_WRITE); +	bdev = blkdev_get_by_dev(sbi->logdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL, +				 log);  	if (IS_ERR(bdev)) { -		rc = -PTR_ERR(bdev); +		rc = PTR_ERR(bdev);  		goto free;  	} -	if ((rc = bd_claim(bdev, log))) { -		goto close; -	} -  	log->bdev = bdev;  	memcpy(log->uuid, sbi->loguuid, sizeof(log->uuid)); @@ -1137,7 +1136,7 @@ int lmLogOpen(struct super_block *sb)  	 * initialize log:  	 */  	if ((rc = lmLogInit(log))) -		goto unclaim; +		goto close;  	list_add(&log->journal_list, &jfs_external_logs); @@ -1163,11 +1162,8 @@ journal_found:  	list_del(&log->journal_list);  	lbmLogShutdown(log); -      unclaim: -	bd_release(bdev); -        close:		/* close external log device */ -	blkdev_put(bdev, FMODE_READ|FMODE_WRITE); +	blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);        free:		/* free log descriptor */  	mutex_unlock(&jfs_log_mutex); @@ -1512,8 +1508,7 @@ int lmLogClose(struct super_block *sb)  	bdev = log->bdev;  	rc = lmLogShutdown(log); -	bd_release(bdev); -	blkdev_put(bdev, FMODE_READ|FMODE_WRITE); +	blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);  	kfree(log); @@ -2003,19 +1998,24 @@ static int lbmRead(struct jfs_log * log, int pn, struct lbuf ** bpp)  	bio = bio_alloc(GFP_NOFS, 1); -	bio->bi_sector = bp->l_blkno << (log->l2bsize - 9); +	bio->bi_iter.bi_sector = bp->l_blkno << (log->l2bsize - 9);  	bio->bi_bdev = log->bdev;  	bio->bi_io_vec[0].bv_page = bp->l_page;  	bio->bi_io_vec[0].bv_len = LOGPSIZE;  	bio->bi_io_vec[0].bv_offset = bp->l_offset;  	bio->bi_vcnt = 1; -	bio->bi_idx = 0; -	bio->bi_size = LOGPSIZE; +	bio->bi_iter.bi_size = LOGPSIZE;  	bio->bi_end_io = lbmIODone;  	bio->bi_private = bp; -	submit_bio(READ_SYNC, bio); +	/*check if journaling to disk has been disabled*/ +	if (log->no_integrity) { +		bio->bi_iter.bi_size = 0; +		lbmIODone(bio, 0); +	} else { +		submit_bio(READ_SYNC, bio); +	}  	wait_event(bp->l_ioevent, (bp->l_flag != lbmREAD)); @@ -2144,22 +2144,21 @@ static void lbmStartIO(struct lbuf * bp)  	jfs_info("lbmStartIO\n");  	bio = bio_alloc(GFP_NOFS, 1); -	bio->bi_sector = bp->l_blkno << (log->l2bsize - 9); +	bio->bi_iter.bi_sector = bp->l_blkno << (log->l2bsize - 9);  	bio->bi_bdev = log->bdev;  	bio->bi_io_vec[0].bv_page = bp->l_page;  	bio->bi_io_vec[0].bv_len = LOGPSIZE;  	bio->bi_io_vec[0].bv_offset = bp->l_offset;  	bio->bi_vcnt = 1; -	bio->bi_idx = 0; -	bio->bi_size = LOGPSIZE; +	bio->bi_iter.bi_size = LOGPSIZE;  	bio->bi_end_io = lbmIODone;  	bio->bi_private = bp;  	/* check if journaling to disk has been disabled */  	if (log->no_integrity) { -		bio->bi_size = 0; +		bio->bi_iter.bi_size = 0;  		lbmIODone(bio, 0);  	} else {  		submit_bio(WRITE_SYNC, bio); @@ -2355,7 +2354,7 @@ int jfsIOWait(void *arg)  		if (freezing(current)) {  			spin_unlock_irq(&log_redrive_lock); -			refrigerator(); +			try_to_freeze();  		} else {  			set_current_state(TASK_INTERRUPTIBLE);  			spin_unlock_irq(&log_redrive_lock);  | 
