Commit 14e931a2 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.dk/linux-block

Pull block layer fixes from Jens Axboe:
 "A few small, but important fixes.  Most of them are marked for stable
  as well

   - Fix failure to release a semaphore on error path in mtip32xx.
   - Fix crashable condition in bio_get_nr_vecs().
   - Don't mark end-of-disk buffers as mapped, limit it to i_size.
   - Fix for build problem with CONFIG_BLOCK=n on arm at least.
   - Fix for a buffer overlow on UUID partition printing.
   - Trivial removal of unused variables in dac960."

* 'for-linus' of git://git.kernel.dk/linux-block:
  block: fix buffer overflow when printing partition UUIDs
  Fix blkdev.h build errors when BLOCK=n
  bio allocation failure due to bio_get_nr_vecs()
  block: don't mark buffers beyond end of disk as mapped
  mtip32xx: release the semaphore on an error path
  dac960: Remove unused variables from DAC960_CreateProcEntries()
parents a2ae9787 05c69d29
...@@ -743,7 +743,7 @@ void __init printk_all_partitions(void) ...@@ -743,7 +743,7 @@ void __init printk_all_partitions(void)
struct hd_struct *part; struct hd_struct *part;
char name_buf[BDEVNAME_SIZE]; char name_buf[BDEVNAME_SIZE];
char devt_buf[BDEVT_SIZE]; char devt_buf[BDEVT_SIZE];
u8 uuid[PARTITION_META_INFO_UUIDLTH * 2 + 1]; char uuid_buf[PARTITION_META_INFO_UUIDLTH * 2 + 5];
/* /*
* Don't show empty devices or things that have been * Don't show empty devices or things that have been
...@@ -762,14 +762,16 @@ void __init printk_all_partitions(void) ...@@ -762,14 +762,16 @@ void __init printk_all_partitions(void)
while ((part = disk_part_iter_next(&piter))) { while ((part = disk_part_iter_next(&piter))) {
bool is_part0 = part == &disk->part0; bool is_part0 = part == &disk->part0;
uuid[0] = 0; uuid_buf[0] = '\0';
if (part->info) if (part->info)
part_unpack_uuid(part->info->uuid, uuid); snprintf(uuid_buf, sizeof(uuid_buf), "%pU",
part->info->uuid);
printk("%s%s %10llu %s %s", is_part0 ? "" : " ", printk("%s%s %10llu %s %s", is_part0 ? "" : " ",
bdevt_str(part_devt(part), devt_buf), bdevt_str(part_devt(part), devt_buf),
(unsigned long long)part->nr_sects >> 1, (unsigned long long)part->nr_sects >> 1,
disk_name(disk, part->partno, name_buf), uuid); disk_name(disk, part->partno, name_buf),
uuid_buf);
if (is_part0) { if (is_part0) {
if (disk->driverfs_dev != NULL && if (disk->driverfs_dev != NULL &&
disk->driverfs_dev->driver != NULL) disk->driverfs_dev->driver != NULL)
......
...@@ -6580,14 +6580,11 @@ static const struct file_operations dac960_user_command_proc_fops = { ...@@ -6580,14 +6580,11 @@ static const struct file_operations dac960_user_command_proc_fops = {
static void DAC960_CreateProcEntries(DAC960_Controller_T *Controller) static void DAC960_CreateProcEntries(DAC960_Controller_T *Controller)
{ {
struct proc_dir_entry *StatusProcEntry;
struct proc_dir_entry *ControllerProcEntry; struct proc_dir_entry *ControllerProcEntry;
struct proc_dir_entry *UserCommandProcEntry;
if (DAC960_ProcDirectoryEntry == NULL) { if (DAC960_ProcDirectoryEntry == NULL) {
DAC960_ProcDirectoryEntry = proc_mkdir("rd", NULL); DAC960_ProcDirectoryEntry = proc_mkdir("rd", NULL);
StatusProcEntry = proc_create("status", 0, proc_create("status", 0, DAC960_ProcDirectoryEntry,
DAC960_ProcDirectoryEntry,
&dac960_proc_fops); &dac960_proc_fops);
} }
...@@ -6596,7 +6593,7 @@ static void DAC960_CreateProcEntries(DAC960_Controller_T *Controller) ...@@ -6596,7 +6593,7 @@ static void DAC960_CreateProcEntries(DAC960_Controller_T *Controller)
DAC960_ProcDirectoryEntry); DAC960_ProcDirectoryEntry);
proc_create_data("initial_status", 0, ControllerProcEntry, &dac960_initial_status_proc_fops, Controller); proc_create_data("initial_status", 0, ControllerProcEntry, &dac960_initial_status_proc_fops, Controller);
proc_create_data("current_status", 0, ControllerProcEntry, &dac960_current_status_proc_fops, Controller); proc_create_data("current_status", 0, ControllerProcEntry, &dac960_current_status_proc_fops, Controller);
UserCommandProcEntry = proc_create_data("user_command", S_IWUSR | S_IRUSR, ControllerProcEntry, &dac960_user_command_proc_fops, Controller); proc_create_data("user_command", S_IWUSR | S_IRUSR, ControllerProcEntry, &dac960_user_command_proc_fops, Controller);
Controller->ControllerProcEntry = ControllerProcEntry; Controller->ControllerProcEntry = ControllerProcEntry;
} }
......
...@@ -2510,8 +2510,10 @@ static struct scatterlist *mtip_hw_get_scatterlist(struct driver_data *dd, ...@@ -2510,8 +2510,10 @@ static struct scatterlist *mtip_hw_get_scatterlist(struct driver_data *dd,
up(&dd->port->cmd_slot); up(&dd->port->cmd_slot);
return NULL; return NULL;
} }
if (unlikely(*tag < 0)) if (unlikely(*tag < 0)) {
up(&dd->port->cmd_slot);
return NULL; return NULL;
}
return dd->port->commands[*tag].sg; return dd->port->commands[*tag].sg;
} }
......
...@@ -505,9 +505,14 @@ EXPORT_SYMBOL(bio_clone); ...@@ -505,9 +505,14 @@ EXPORT_SYMBOL(bio_clone);
int bio_get_nr_vecs(struct block_device *bdev) int bio_get_nr_vecs(struct block_device *bdev)
{ {
struct request_queue *q = bdev_get_queue(bdev); struct request_queue *q = bdev_get_queue(bdev);
return min_t(unsigned, int nr_pages;
nr_pages = min_t(unsigned,
queue_max_segments(q), queue_max_segments(q),
queue_max_sectors(q) / (PAGE_SIZE >> 9) + 1); queue_max_sectors(q) / (PAGE_SIZE >> 9) + 1);
return min_t(unsigned, nr_pages, BIO_MAX_PAGES);
} }
EXPORT_SYMBOL(bio_get_nr_vecs); EXPORT_SYMBOL(bio_get_nr_vecs);
......
...@@ -70,7 +70,7 @@ static void bdev_inode_switch_bdi(struct inode *inode, ...@@ -70,7 +70,7 @@ static void bdev_inode_switch_bdi(struct inode *inode,
spin_unlock(&dst->wb.list_lock); spin_unlock(&dst->wb.list_lock);
} }
static sector_t max_block(struct block_device *bdev) sector_t blkdev_max_block(struct block_device *bdev)
{ {
sector_t retval = ~((sector_t)0); sector_t retval = ~((sector_t)0);
loff_t sz = i_size_read(bdev->bd_inode); loff_t sz = i_size_read(bdev->bd_inode);
...@@ -163,7 +163,7 @@ static int ...@@ -163,7 +163,7 @@ static int
blkdev_get_block(struct inode *inode, sector_t iblock, blkdev_get_block(struct inode *inode, sector_t iblock,
struct buffer_head *bh, int create) struct buffer_head *bh, int create)
{ {
if (iblock >= max_block(I_BDEV(inode))) { if (iblock >= blkdev_max_block(I_BDEV(inode))) {
if (create) if (create)
return -EIO; return -EIO;
...@@ -185,7 +185,7 @@ static int ...@@ -185,7 +185,7 @@ static int
blkdev_get_blocks(struct inode *inode, sector_t iblock, blkdev_get_blocks(struct inode *inode, sector_t iblock,
struct buffer_head *bh, int create) struct buffer_head *bh, int create)
{ {
sector_t end_block = max_block(I_BDEV(inode)); sector_t end_block = blkdev_max_block(I_BDEV(inode));
unsigned long max_blocks = bh->b_size >> inode->i_blkbits; unsigned long max_blocks = bh->b_size >> inode->i_blkbits;
if ((iblock + max_blocks) > end_block) { if ((iblock + max_blocks) > end_block) {
......
...@@ -921,6 +921,7 @@ init_page_buffers(struct page *page, struct block_device *bdev, ...@@ -921,6 +921,7 @@ init_page_buffers(struct page *page, struct block_device *bdev,
struct buffer_head *head = page_buffers(page); struct buffer_head *head = page_buffers(page);
struct buffer_head *bh = head; struct buffer_head *bh = head;
int uptodate = PageUptodate(page); int uptodate = PageUptodate(page);
sector_t end_block = blkdev_max_block(I_BDEV(bdev->bd_inode));
do { do {
if (!buffer_mapped(bh)) { if (!buffer_mapped(bh)) {
...@@ -929,6 +930,7 @@ init_page_buffers(struct page *page, struct block_device *bdev, ...@@ -929,6 +930,7 @@ init_page_buffers(struct page *page, struct block_device *bdev,
bh->b_blocknr = block; bh->b_blocknr = block;
if (uptodate) if (uptodate)
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
if (block < end_block)
set_buffer_mapped(bh); set_buffer_mapped(bh);
} }
block++; block++;
......
#ifndef _LINUX_BLKDEV_H #ifndef _LINUX_BLKDEV_H
#define _LINUX_BLKDEV_H #define _LINUX_BLKDEV_H
#include <linux/sched.h>
#ifdef CONFIG_BLOCK #ifdef CONFIG_BLOCK
#include <linux/sched.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/genhd.h> #include <linux/genhd.h>
#include <linux/list.h> #include <linux/list.h>
......
...@@ -2051,6 +2051,7 @@ extern void unregister_blkdev(unsigned int, const char *); ...@@ -2051,6 +2051,7 @@ extern void unregister_blkdev(unsigned int, const char *);
extern struct block_device *bdget(dev_t); extern struct block_device *bdget(dev_t);
extern struct block_device *bdgrab(struct block_device *bdev); extern struct block_device *bdgrab(struct block_device *bdev);
extern void bd_set_size(struct block_device *, loff_t size); extern void bd_set_size(struct block_device *, loff_t size);
extern sector_t blkdev_max_block(struct block_device *bdev);
extern void bd_forget(struct inode *inode); extern void bd_forget(struct inode *inode);
extern void bdput(struct block_device *); extern void bdput(struct block_device *);
extern void invalidate_bdev(struct block_device *); extern void invalidate_bdev(struct block_device *);
......
...@@ -222,12 +222,6 @@ static inline void part_pack_uuid(const u8 *uuid_str, u8 *to) ...@@ -222,12 +222,6 @@ static inline void part_pack_uuid(const u8 *uuid_str, u8 *to)
} }
} }
static inline char *part_unpack_uuid(const u8 *uuid, char *out)
{
sprintf(out, "%pU", uuid);
return out;
}
static inline int disk_max_parts(struct gendisk *disk) static inline int disk_max_parts(struct gendisk *disk)
{ {
if (disk->flags & GENHD_FL_EXT_DEVT) if (disk->flags & GENHD_FL_EXT_DEVT)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment