From mboxrd@z Thu Jan 1 00:00:00 1970 From: Suzuki Kp Subject: [RFC] PATCH to fix rescan_partitions to return errors properly Date: Tue, 03 Oct 2006 18:00:36 -0700 Message-ID: <452307B4.3050006@in.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Cc: Andrew Morton Return-path: To: lkml , linux-fsdevel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org List-Id: linux-fsdevel.vger.kernel.org [resending] Hi, Currently the rescan_partition returns 0 (success), even if it is unable to rescan the partition information ( may be due to disks offline, I/O error reading the table or unknown partition ). This would make ioctl() calls succeed for BLKRRPART requests even if partitions were not scanned properly, which is not a good thing to do. Attached here is patch to fix the issue. The patch makes rescan_partition to return -EINVAL for unknown partitions and -EIO for disk I/O errors ( or when disks are offline ). Comments ? Thanks, Suzuki K P Linux Technology Centre, IBM Systems & Technology Labs. * Fix recscan_partitions to return error when the partition is unknown or there is an I/O error reading the partition information. Signed Off by : Suzuki K P Index: linux-2.6.18/fs/partitions/check.c =================================================================== --- linux-2.6.18.orig/fs/partitions/check.c 2006-09-26 04:41:55.000000000 +0530 +++ linux-2.6.18/fs/partitions/check.c 2006-09-26 05:09:29.000000000 +0530 @@ -177,7 +177,7 @@ else if (warn_no_part) printk(" unable to read partition table\n"); kfree(state); - return NULL; + return ERR_PTR(res); } /* @@ -458,8 +458,13 @@ delete_partition(disk, p); if (disk->fops->revalidate_disk) disk->fops->revalidate_disk(disk); - if (!get_capacity(disk) || !(state = check_partition(disk, bdev))) - return 0; + if (!get_capacity(disk)) + return -EINVAL; + state = check_partition(disk, bdev); + if (!state) + return -EINVAL; + if (IS_ERR(state)) + return -EIO; for (p = 1; p < state->limit; p++) { sector_t size = state->parts[p].size; sector_t from = state->parts[p].from;