From patchwork Tue Sep 22 05:45:20 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Chauhan, Vijay" X-Patchwork-Id: 49185 X-Patchwork-Delegate: agk@redhat.com Received: from hormel.redhat.com (hormel1.redhat.com [209.132.177.33]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n8M5jihJ004083 for ; Tue, 22 Sep 2009 05:45:45 GMT Received: from listman.util.phx.redhat.com (listman.util.phx.redhat.com [10.8.4.110]) by hormel.redhat.com (Postfix) with ESMTP id 90224618A44; Tue, 22 Sep 2009 01:45:43 -0400 (EDT) Received: from int-mx03.intmail.prod.int.phx2.redhat.com (nat-pool.util.phx.redhat.com [10.8.5.200]) by listman.util.phx.redhat.com (8.13.1/8.13.1) with ESMTP id n8M5jgwx019237 for ; Tue, 22 Sep 2009 01:45:42 -0400 Received: from mx1.redhat.com (ext-mx09.extmail.prod.ext.phx2.redhat.com [10.5.110.13]) by int-mx03.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id n8M5jgHX009415; Tue, 22 Sep 2009 01:45:42 -0400 Received: from na3sys009aog110.obsmtp.com (na3sys009aog110.obsmtp.com [74.125.149.203]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id n8M5jR8g012323; Tue, 22 Sep 2009 01:45:27 -0400 Received: from source ([147.145.40.20]) by na3sys009aob110.postini.com ([74.125.148.12]) with SMTP ID DSNKSrhkdpP5vj7ldNAths1b+h3im+7kIbgg@postini.com; Mon, 21 Sep 2009 22:45:30 PDT Received: from milmhbs0.lsil.com (mhbs.lsil.com [147.145.1.30]) by mail0.lsil.com (8.12.11/8.12.11) with ESMTP id n8M5jPmp009563; Mon, 21 Sep 2009 22:45:25 -0700 (PDT) Received: from inbmail01.lsi.com (inbmail01.in.lsil.com [172.28.140.213]) by milmhbs0.lsil.com (8.12.11/8.12.11) with ESMTP id n8M5jQFs006416; Mon, 21 Sep 2009 22:45:26 -0700 Received: from inbmail01.lsi.com ([172.28.140.213]) by inbmail01.lsi.com ([172.28.140.213]) with mapi; Tue, 22 Sep 2009 11:15:21 +0530 From: "Chauhan, Vijay" To: "agk@redhat.com" , device-mapper development Date: Tue, 22 Sep 2009 11:15:20 +0530 Thread-Topic: [RFC] New Logging approach for Device Mapper Thread-Index: AcouW+mKRLUaoXaaTu+hW4tEAkmP3AM4KC0QAAAGo2A= Message-ID: <0D1E8821739E724A86F4D16902CE275C1C8ECC2CFF@inbmail01.lsi.com> In-Reply-To: <0D1E8821739E724A86F4D16902CE275C1C8ECC2CE0@inbmail01.lsi.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: acceptlanguage: en-US MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.16 X-Scanned-By: MIMEDefang 2.67 on 10.5.110.13 X-Scanned-By: MIMEDefang 2.39 X-RedHat-Spam-Score: 0 () X-MIME-Autoconverted: from quoted-printable to 8bit by listman.util.phx.redhat.com id n8M5jgwx019237 X-loop: dm-devel@redhat.com Cc: "sekharan@linux.vnet.ibm.com" , "Moger, Babu" Subject: [dm-devel] RE: [RFC] New Logging approach for Device Mapper X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.5 Precedence: junk Reply-To: device-mapper development List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com On Mon, Sep 7, 2009 at 12:58 PM, Chauhan, Vijay wrote: > > > Each logging type is represented with 2 bits in > > dm_logging_level. Following are the logging types currently > defined : > > > > Does that mean there's a limit we'll soon exceed? > > > Yes true. In that case we can further split the logging > across the targets , such as multipath, linear so on. Your > thoughts please. > > > > > > > Sep 5 18:32:02 localhost kernel: device-mapper: core: > > DEBUG: dm_resume: Unsetting DMF_SUSPENDED flag for 253:1 > > > > I was hoping the next extension to the macro code would > > somehow add info > > like '253:1' (and maybe corresponding device name) automatically to > > every message related to a device. > > > > > Ok. I will so that. > > > > > > But do we really need this level of runtime debugging > configurability? > > I can't say I've come across problems where I'd have needed it: Can > > anyone else offer examples where it would have helped them? > > > > > Both approaches ("without level" and "with level") looks fine > to me. Advantage with going for "Without level" approach is > that we will be having further more space for defining log types. > > Advantage with "with level" approach is that it will log more > relevant logs. Just giving a hypothetical example here, Lets > assume I/O getting killed during all path failure condition > when no_path_retry feature was set. To debug that I may want > to check what all messages communicated from userspace to > kernel. Also I may want to check DM_NOFLUSH_FLAG being set > properly here. For the same I would set following log levels: > > --------------------------- > LOG TYPES LOG LEVEL > ---------------------------- > DM_IOCTL DM_INFO --> It will print all > the communication between userspace and kernel space > DM_IO DM_ERR --> It will tell > exactly where I/O error was hit. > > > "without level" approach in this scenario will log more > messages here in comparison. > > Third approach I could think of it is having flexible level. > i.e we can ignore levels for those types which populates > syslog less(such as DM_INIT, DM_FAILOVER ..) and can have > levels for those which are logging heavily (such as DM_IO, > DM_IOCTL .. ). But it may add some complexity in calculating > and setting the log levels. Hi Alasdair, I have made the changes for printing device name with the log messages where ever it was needed. As dm-mpath.c does not have access to mapped_device structure, I had to add one new function dm_target_device_name in dm.c to get the device name. Also I have added #ifdef in dm-mpath.c such that dm_target_device_name function is called only in case when CONFIG_DM_DEBUG is set in .config. Current implementaion needs developer to add device name in order to print it as I didnt find any consistent way to print device name(by adding in macro). For example : Following messages prints device name as "253:12" Sep 22 00:31:26 localhost kernel: device-mapper: multipath: DEBUG: __switch_pg: 253:12: Swtiching to pathgroup 1 where as in ctl_ioctl function, device name is available with respect to its WWN name and I didn't find way to print in major/minor. Please correct me if I am wrong here. Also if you have any better thoughts then please let me know. Sep 22 00:31:26 localhost kernel: device-mapper: ioctl: DEBUG: ctl_ioctl: 3600a0b80003908f9000057d44a83946c: IOCTL command 0xc138fd0c. Thanks, Vijay --------------------------------------------------- Syslog snippet after the changes looks like below: --------------------------------------------------- Sep 22 00:31:26 localhost kernel: device-mapper: multipath: DEBUG: __switch_pg: 253:12: Swtiching to pathgroup 1 Sep 22 00:31:26 localhost kernel: device-mapper: multipath: DEBUG: __choose_path_in_pg: 253:12: Selecting path 8:224 for I/O Sep 22 00:31:26 localhost kernel: device-mapper: multipath: DEBUG: fail_path: 253:12: Failing path 8:224 Sep 22 00:31:26 localhost kernel: device-mapper: ioctl: DEBUG: ctl_ioctl: 3600a0b80003908f9000057d44a83946c: IOCTL command 0xc138fd0c. Sep 22 00:31:26 localhost kernel: device-mapper: ioctl: DEBUG: ctl_ioctl: 3600a0b80003908f9000057d44a83946c: IOCTL command 0xc138fd0c. Sep 22 00:31:26 localhost kernel: device-mapper: ioctl: DEBUG: ctl_ioctl: 3600a0b80003908f9000057d44a83946c: IOCTL command 0xc138fd0e. Sep 22 00:31:26 localhost kernel: device-mapper: multipath: DEBUG: reinstate_path: 253:13: Path 8:240 sucessfuly reinstated Sep 22 00:31:26 localhost kernel: device-mapper: ioctl: DEBUG: ctl_ioctl: 3600a0b80003908f9000057d44a83946c: IOCTL command 0xc138fd0e. Sep 22 00:31:26 localhost kernel: device-mapper: multipath: DEBUG: deactivate_path: Deactivating path. Aborting all I/O on 8:224 queue Patch for dm logging, adding device name with log messages. --- -- -- dm-devel mailing list dm-devel@redhat.com https://www.redhat.com/mailman/listinfo/dm-devel diff -uprN linux-2.6.31-rc8-orig/drivers/md/dm.c linux-2.6.31-rc8/drivers/md/dm.c --- linux-2.6.31-rc8-orig/drivers/md/dm.c 2009-08-28 06:29:04.000000000 +0530 +++ linux-2.6.31-rc8/drivers/md/dm.c 2009-09-22 01:17:45.000000000 +0530 @@ -23,6 +23,8 @@ #include #define DM_MSG_PREFIX "core" +unsigned int dm_logging_level; +EXPORT_SYMBOL(dm_logging_level); /* * Cookies are numeric values sent with CHANGE and REMOVE @@ -266,7 +268,7 @@ static void local_exit(void) _major = 0; - DMINFO("cleaned up"); + DMLOG(DMLOG_INIT, DMLOG_INFO, "cleaned up"); } static int (*_inits[])(void) __initdata = { @@ -541,7 +543,8 @@ int dm_set_geometry(struct mapped_device sector_t sz = (sector_t)geo->cylinders * geo->heads * geo->sectors; if (geo->start > sz) { - DMWARN("Start sector is beyond the geometry limits."); + DMLOG(DMLOG_ADD_DEV, DMLOG_WARN, "Start sector is beyond the " + "geometry limits."); return -EINVAL; } @@ -644,7 +647,8 @@ static void clone_endio(struct bio *bio, /* The target will handle the io */ return; else if (r) { - DMWARN("unimplemented target endio return value: %d", r); + DMLOG(DMLOG_IO, DMLOG_WARN, "unimplemented target endio" + " return value: %d", r); BUG(); } } @@ -699,7 +703,8 @@ static void end_clone_bio(struct bio *cl * If it's not, something wrong is happening. */ if (tio->orig->bio != bio) - DMERR("bio completion is going in the middle of the request"); + DMLOG(DMLOG_IO, DMLOG_ERR, "bio completion is going in " + "the middle of the request"); /* * Update the original request. @@ -856,7 +861,8 @@ static void dm_softirq_done(struct reque /* The target wants to requeue the I/O */ dm_requeue_unmapped_request(clone); else { - DMWARN("unimplemented target endio return value: %d", error); + DMLOG(DMLOG_IO, DMLOG_WARN, "unimplemented target endio return" + " value: %d", error); BUG(); } } @@ -971,7 +977,8 @@ static void __map_bio(struct dm_target * bio_put(clone); free_tio(md, tio); } else if (r) { - DMWARN("unimplemented target map return value: %d", r); + DMLOG(DMLOG_IO, DMLOG_WARN, "unimplemented target map " + "return value: %d", r); BUG(); } } @@ -1446,7 +1453,8 @@ static int dm_prep_fn(struct request_que } if (unlikely(rq->special)) { - DMWARN("Already has something in rq->special."); + DMLOG(DMLOG_IO, DMLOG_WARN, "Already has something" + " in rq->special."); return BLKPREP_KILL; } @@ -1506,7 +1514,8 @@ static void map_request(struct dm_target break; default: if (r > 0) { - DMWARN("unimplemented target map return value: %d", r); + DMLOG(DMLOG_IO, DMLOG_WARN, "%s: unimplemented target map" + " return value: %d", md->name, r); BUG(); } @@ -1723,7 +1732,8 @@ static struct mapped_device *alloc_dev(i void *old_md; if (!md) { - DMWARN("unable to allocate device, out of memory."); + DMLOG(DMLOG_INIT, DMLOG_WARN, "unable to allocate device(MINOR %d), " + "out of memory.", minor); return NULL; } @@ -2037,6 +2047,14 @@ const char *dm_device_name(struct mapped } EXPORT_SYMBOL_GPL(dm_device_name); +void dm_target_device_name(struct dm_target *ti, char *name) +{ + struct mapped_device *md = dm_table_get_md(ti->table); + strncpy(name,dm_device_name(md), 16); + dm_put(md); +} +EXPORT_SYMBOL_GPL(dm_target_device_name); + void dm_put(struct mapped_device *md) { struct dm_table *map; @@ -2199,7 +2217,8 @@ int dm_swap_table(struct mapped_device * /* cannot change the device type, once a table is bound */ if (md->map && (dm_table_get_type(md->map) != dm_table_get_type(table))) { - DMWARN("can't change the device type after a table is bound"); + DMLOG(DMLOG_IO, DMLOG_WARN, "%s: can't change the device type " + "after a table is bound", md->name); goto out; } @@ -2263,8 +2282,9 @@ static int dm_rq_suspend_available(struc * start another flush suspend while it is in use. */ BUG_ON(!rq->special); /* The marker should be invalidated */ - DMWARN("Invalidating the previous flush suspend is still in" - " progress. Please retry later."); + DMLOG(DMLOG_IO, DMLOG_WARN, "%s: Invalidating the previous flush " + "suspend is still in progress. Please retry later.", + md->name); r = 0; } spin_unlock_irqrestore(q->queue_lock, flags); @@ -2383,8 +2403,11 @@ int dm_suspend(struct mapped_device *md, * DMF_NOFLUSH_SUSPENDING must be set before presuspend. * This flag is cleared before dm_suspend returns. */ - if (noflush) + if (noflush) { set_bit(DMF_NOFLUSH_SUSPENDING, &md->flags); + DMLOG(DMLOG_IOCTL, DMLOG_INFO, "%s: Setting DMF_NOFLUSH_SUSPENDING " + "flag", md->name); + } /* This does not get reverted if there's an error later. */ dm_table_presuspend_targets(map); @@ -2415,6 +2438,8 @@ int dm_suspend(struct mapped_device *md, * dm_wq_work exits and DMF_BLOCK_IO_FOR_SUSPEND will prevent any * further calls to __split_and_process_bio from dm_wq_work. */ + DMLOG(DMLOG_IOCTL, DMLOG_INFO, "%s: Setting DMF_BLOCK_IO_FOR_SUSPEND and " + "DMF_QUEUE_IO_TO_THREAD flags", md->name); down_write(&md->io_lock); set_bit(DMF_BLOCK_IO_FOR_SUSPEND, &md->flags); set_bit(DMF_QUEUE_IO_TO_THREAD, &md->flags); @@ -2433,8 +2458,11 @@ int dm_suspend(struct mapped_device *md, r = dm_wait_for_completion(md, TASK_INTERRUPTIBLE); down_write(&md->io_lock); - if (noflush) + if (noflush) { clear_bit(DMF_NOFLUSH_SUSPENDING, &md->flags); + DMLOG(DMLOG_IOCTL, DMLOG_INFO, "%s: Unsetting " + "DMF_NOFLUSH_SUSPENDING", md->name); + } up_write(&md->io_lock); /* were we interrupted ? */ @@ -2455,7 +2483,8 @@ int dm_suspend(struct mapped_device *md, */ dm_table_postsuspend_targets(map); - + DMLOG(DMLOG_IOCTL, DMLOG_INFO, "%s: Setting DMF_SUSPENDED flag", + md->name); set_bit(DMF_SUSPENDED, &md->flags); out: @@ -2494,7 +2523,8 @@ int dm_resume(struct mapped_device *md) start_queue(md->queue); unlock_fs(md); - + DMLOG(DMLOG_IOCTL, DMLOG_INFO, "%s: Unsetting DMF_SUSPENDED flag", + md->name); clear_bit(DMF_SUSPENDED, &md->flags); dm_table_unplug_all(map); @@ -2670,6 +2700,9 @@ EXPORT_SYMBOL(dm_get_mapinfo); module_init(dm_init); module_exit(dm_exit); +module_param(dm_logging_level, uint, S_IRUGO|S_IWUSR); +MODULE_PARM_DESC(dm_logging_level, "a bit mask of logging levels"); + module_param(major, uint, 0); MODULE_PARM_DESC(major, "The major number of the device mapper"); MODULE_DESCRIPTION(DM_NAME " driver"); diff -uprN linux-2.6.31-rc8-orig/drivers/md/dm-ioctl.c linux-2.6.31-rc8/drivers/md/dm-ioctl.c --- linux-2.6.31-rc8-orig/drivers/md/dm-ioctl.c 2009-08-28 06:29:04.000000000 +0530 +++ linux-2.6.31-rc8/drivers/md/dm-ioctl.c 2009-09-22 01:17:47.000000000 +0530 @@ -193,6 +193,7 @@ static int dm_hash_insert(const char *na dm_put(hc->md); goto bad; } + DMLOG(DMLOG_ADD_DEV, DMLOG_INFO, "%s: Inserting in hash table", name); list_add(&cell->name_list, _name_buckets + hash_str(name)); @@ -201,6 +202,8 @@ static int dm_hash_insert(const char *na if (hc) { list_del(&cell->name_list); dm_put(hc->md); + DMLOG(DMLOG_ADD_DEV, DMLOG_CRIT, "%s: Failed to add." + " Already exists in hash table", name); goto bad; } list_add(&cell->uuid_list, _uuid_buckets + hash_str(uuid)); @@ -208,7 +211,8 @@ static int dm_hash_insert(const char *na dm_get(md); dm_set_mdptr(md, cell); up_write(&_hash_lock); - + DMLOG(DMLOG_ADD_DEV, DMLOG_INFO, "%s: Successfully inserted " + "in hash table ", name); return 0; bad: @@ -269,8 +273,8 @@ retry: if (dev_skipped) { if (dev_removed) goto retry; - - DMWARN("remove_all left %d open device(s)", dev_skipped); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "remove_all left " + "%d open device(s)", dev_skipped); } up_write(&_hash_lock); @@ -296,8 +300,8 @@ static int dm_hash_rename(uint32_t cooki */ hc = __get_name_cell(new); if (hc) { - DMWARN("asked to rename to an already existing name %s -> %s", - old, new); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "asked to rename to an " + "already existing name %s -> %s", old, new); dm_put(hc->md); up_write(&_hash_lock); kfree(new_name); @@ -309,8 +313,8 @@ static int dm_hash_rename(uint32_t cooki */ hc = __get_name_cell(old); if (!hc) { - DMWARN("asked to rename a non existent device %s -> %s", - old, new); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "asked to rename a non " + "existent device %s -> %s", old, new); up_write(&_hash_lock); kfree(new_name); return -ENXIO; @@ -517,7 +521,8 @@ static int list_versions(struct dm_ioctl static int check_name(const char *name) { if (strchr(name, '/')) { - DMWARN("invalid device name"); + DMLOG(DMLOG_IOCTL, DMLOG_ERR, "%s: Invalid device name " + , name); return -EINVAL; } @@ -576,12 +581,16 @@ static int dev_create(struct dm_ioctl *p if (param->flags & DM_PERSISTENT_DEV_FLAG) m = MINOR(huge_decode_dev(param->dev)); + DMLOG(DMLOG_ADD_DEV, DMLOG_INFO, "%s: Creating dm device", + param->name); r = dm_create(m, &md); if (r) return r; r = dm_hash_insert(param->name, *param->uuid ? param->uuid : NULL, md); if (r) { + DMLOG(DMLOG_ADD_DEV, DMLOG_CRIT, "%s: Unable to create" + "new device", param->name); dm_put(md); return r; } @@ -660,7 +669,8 @@ static int dev_remove(struct dm_ioctl *p hc = __find_device_hash_cell(param); if (!hc) { - DMWARN("device doesn't appear to be in the dev hash table."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Device doesn't appear " + "to be in the dev hash table.", param->name); up_write(&_hash_lock); return -ENXIO; } @@ -672,7 +682,8 @@ static int dev_remove(struct dm_ioctl *p */ r = dm_lock_for_deletion(md); if (r) { - DMWARN("unable to remove open device %s", hc->name); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Unable to remove open " + "device %s", hc->name); up_write(&_hash_lock); dm_put(md); return r; @@ -709,7 +720,8 @@ static int dev_rename(struct dm_ioctl *p if (new_name < param->data || invalid_str(new_name, (void *) param + param_size) || strlen(new_name) > DM_NAME_LEN - 1) { - DMWARN("Invalid new logical volume name supplied."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Invalid new logical " + "volume name supplied.", param->name); return -EINVAL; } @@ -735,7 +747,8 @@ static int dev_set_geometry(struct dm_io if (geostr < param->data || invalid_str(geostr, (void *) param + param_size)) { - DMWARN("Invalid geometry supplied."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Invalid geometry " + "supplied.", param->name); goto out; } @@ -743,13 +756,15 @@ static int dev_set_geometry(struct dm_io indata + 1, indata + 2, indata + 3); if (x != 4) { - DMWARN("Unable to interpret geometry settings."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Unable to interpret " + "geometry settings.", param->name); goto out; } if (indata[0] > 65535 || indata[1] > 255 || indata[2] > 255 || indata[3] > ULONG_MAX) { - DMWARN("Geometry exceeds range limits."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Geometry exceeds " + "range limits.", param->name); goto out; } @@ -806,7 +821,8 @@ static int do_resume(struct dm_ioctl *pa hc = __find_device_hash_cell(param); if (!hc) { - DMWARN("device doesn't appear to be in the dev hash table."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: device doesn't appear to be " + "in the dev hash table.", param->name); up_write(&_hash_lock); return -ENXIO; } @@ -1026,7 +1042,8 @@ static int populate_table(struct dm_tabl char *target_params; if (!param->target_count) { - DMWARN("populate_table: no targets specified"); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: populate_table: no targets" + " specified", param->name); return -EINVAL; } @@ -1034,7 +1051,8 @@ static int populate_table(struct dm_tabl r = next_target(spec, next, end, &spec, &target_params); if (r) { - DMWARN("unable to find target"); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: unable to find target", + param->name); return r; } @@ -1043,7 +1061,8 @@ static int populate_table(struct dm_tabl (sector_t) spec->length, target_params); if (r) { - DMWARN("error adding target to table"); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: error adding target " + "to table", param->name); return r; } @@ -1052,7 +1071,8 @@ static int populate_table(struct dm_tabl r = dm_table_set_type(table); if (r) { - DMWARN("unable to set table type"); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: unable to set table type", + param->name); return r; } @@ -1095,15 +1115,16 @@ static int table_load(struct dm_ioctl *p r = table_prealloc_integrity(t, md); if (r) { - DMERR("%s: could not register integrity profile.", - dm_device_name(md)); + DMLOG(DMLOG_IOCTL, DMLOG_ERR, "%s: could not register " + "integrity profile.", dm_device_name(md)); dm_table_destroy(t); goto out; } r = dm_table_alloc_md_mempools(t); if (r) { - DMWARN("unable to allocate mempools for this table"); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: unable to allocate mempools" + " for this table", dm_device_name(md)); dm_table_destroy(t); goto out; } @@ -1111,7 +1132,8 @@ static int table_load(struct dm_ioctl *p down_write(&_hash_lock); hc = dm_get_mdptr(md); if (!hc || hc->md != md) { - DMWARN("device has been removed from the dev hash table."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: device has been removed from" + " the dev hash table.", dm_device_name(md)); dm_table_destroy(t); up_write(&_hash_lock); r = -ENXIO; @@ -1142,7 +1164,8 @@ static int table_clear(struct dm_ioctl * hc = __find_device_hash_cell(param); if (!hc) { - DMWARN("device doesn't appear to be in the dev hash table."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: device doesn't appear " + "to be in the dev hash table.", param->name); up_write(&_hash_lock); return -ENXIO; } @@ -1277,14 +1300,16 @@ static int target_message(struct dm_ioct if (tmsg < (struct dm_target_msg *) param->data || invalid_str(tmsg->message, (void *) param + param_size)) { - DMWARN("Invalid target message parameters."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Invalid target message" + " parameters.", param->name); r = -EINVAL; goto out; } r = dm_split_args(&argc, &argv, tmsg->message); if (r) { - DMWARN("Failed to split target message parameters"); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Failed to split target" + " message parameters", param->name); goto out; } @@ -1294,12 +1319,14 @@ static int target_message(struct dm_ioct ti = dm_table_find_target(table, tmsg->sector); if (!dm_target_is_valid(ti)) { - DMWARN("Target message sector outside device."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Target message sector " + "outside device.", param->name); r = -EINVAL; } else if (ti->type->message) r = ti->type->message(ti, argc, argv); else { - DMWARN("Target type does not support messages"); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Target type does not " + "support messages", param->name); r = -EINVAL; } @@ -1361,7 +1388,7 @@ static int check_version(unsigned int cm if ((DM_VERSION_MAJOR != version[0]) || (DM_VERSION_MINOR < version[1])) { - DMWARN("ioctl interface mismatch: " + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "ioctl interface mismatch: " "kernel(%u.%u.%u), user(%u.%u.%u), cmd(%d)", DM_VERSION_MAJOR, DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, @@ -1422,11 +1449,13 @@ static int validate_params(uint cmd, str if ((cmd == DM_DEV_CREATE_CMD)) { if (!*param->name) { - DMWARN("name not supplied when creating device"); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "Name not supplied" + " when creating device"); return -EINVAL; } } else if ((*param->uuid && *param->name)) { - DMWARN("only supply one of name or uuid, cmd(%u)", cmd); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "only supply one of name or" + "uuid, cmd(%u)", cmd); return -EINVAL; } @@ -1461,6 +1490,8 @@ static int ctl_ioctl(uint command, struc r = check_version(cmd, user); if (r) return r; + DMLOG(DMLOG_IOCTL, DMLOG_INFO, "%s: IOCTL command " + "0x%x.", user->name, command ); /* * Nothing more to do for the version command. @@ -1470,7 +1501,7 @@ static int ctl_ioctl(uint command, struc fn = lookup_ioctl(cmd); if (!fn) { - DMWARN("dm_ctl_ioctl: unknown command 0x%x", command); + DMLOG(DMLOG_IOCTL, DMLOG_ERR, "%s: Unknown command 0x%x", user->name, command); return -ENOTTY; } @@ -1549,21 +1580,23 @@ int __init dm_interface_init(void) r = misc_register(&_dm_misc); if (r) { - DMERR("misc_register failed for control device"); + DMLOG(DMLOG_IOCTL, DMLOG_ERR, "misc_register failed " + "for control device"); dm_hash_exit(); return r; } - DMINFO("%d.%d.%d%s initialised: %s", DM_VERSION_MAJOR, - DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, DM_VERSION_EXTRA, - DM_DRIVER_EMAIL); + DMLOG(DMLOG_IOCTL, DMLOG_INFO, "%d.%d.%d%s initialised: %s", + DM_VERSION_MAJOR, DM_VERSION_MINOR, DM_VERSION_PATCHLEVEL, + DM_VERSION_EXTRA, DM_DRIVER_EMAIL); return 0; } void dm_interface_exit(void) { if (misc_deregister(&_dm_misc) < 0) - DMERR("misc_deregister failed for control device"); + DMLOG(DMLOG_IOCTL, DMLOG_ERR, "misc_deregister" + "failed for control device"); dm_hash_exit(); } diff -uprN linux-2.6.31-rc8-orig/drivers/md/dm-mpath.c linux-2.6.31-rc8/drivers/md/dm-mpath.c --- linux-2.6.31-rc8-orig/drivers/md/dm-mpath.c 2009-08-28 06:29:04.000000000 +0530 +++ linux-2.6.31-rc8/drivers/md/dm-mpath.c 2009-09-22 01:17:45.000000000 +0530 @@ -141,7 +141,8 @@ static void deactivate_path(struct work_ { struct pgpath *pgpath = container_of(work, struct pgpath, deactivate_path); - + DMLOG(DMLOG_PATH_DEACTIVATE, DMLOG_CRIT, "Deactivating path." + " Aborting all I/O on %s queue", pgpath->path.dev->name); blk_abort_queue(pgpath->path.dev->bdev->bd_disk->queue); } @@ -163,6 +164,9 @@ static void free_pgpaths(struct list_hea struct multipath *m = ti->private; list_for_each_entry_safe(pgpath, tmp, pgpaths, list) { + DMLOG(DMLOG_PATH_DEACTIVATE, DMLOG_CRIT, + "Removing path %s from pathgroup %d", + pgpath->path.dev->name, pgpath->pg->pg_num); list_del(&pgpath->list); if (m->hw_handler_name) scsi_dh_detach(bdev_get_queue(pgpath->path.dev->bdev)); @@ -188,7 +192,6 @@ static void free_priority_group(struct p static struct multipath *alloc_multipath(struct dm_target *ti) { struct multipath *m; - m = kzalloc(sizeof(*m), GFP_KERNEL); if (m) { INIT_LIST_HEAD(&m->priority_groups); @@ -199,6 +202,8 @@ static struct multipath *alloc_multipath INIT_WORK(&m->trigger_event, trigger_event); m->mpio_pool = mempool_create_slab_pool(MIN_IOS, _mpio_cache); if (!m->mpio_pool) { + DMLOG(DMLOG_ADD_DEV, DMLOG_ERR, "Failed. No mpio_pool" + " available"); kfree(m); return NULL; } @@ -230,6 +235,11 @@ static void free_multipath(struct multip static void __switch_pg(struct multipath *m, struct pgpath *pgpath) { + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif + m->current_pg = pgpath->pg; /* Must we initialise the PG first, and queue I/O till it's ready? */ @@ -240,7 +250,8 @@ static void __switch_pg(struct multipath m->pg_init_required = 0; m->queue_io = 0; } - + DMLOG(DMLOG_FAILOVER, DMLOG_CRIT, "%s: Swtiching to pathgroup %u", + name , pgpath->pg->pg_num); m->pg_init_count = 0; } @@ -248,7 +259,10 @@ static int __choose_path_in_pg(struct mu size_t nr_bytes) { struct dm_path *path; - + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif path = pg->ps.type->select_path(&pg->ps, &m->repeat_count, nr_bytes); if (!path) return -ENXIO; @@ -257,6 +271,8 @@ static int __choose_path_in_pg(struct mu if (m->current_pg != pg) __switch_pg(m, m->current_pgpath); + DMLOG(DMLOG_FAILOVER, DMLOG_INFO, "%s: Selecting path %s for I/O", + name, m->current_pgpath->path.dev->name); return 0; } @@ -352,10 +368,11 @@ static int map_io(struct multipath *m, s bdev = pgpath->path.dev->bdev; clone->q = bdev_get_queue(bdev); clone->rq_disk = bdev->bd_disk; - } else if (__must_push_back(m)) + } else if (__must_push_back(m)) { r = DM_MAPIO_REQUEUE; - else + } else { r = -EIO; /* Failed */ + } mpio->pgpath = pgpath; mpio->nr_bytes = nr_bytes; @@ -384,6 +401,7 @@ static int queue_if_no_path(struct multi else m->saved_queue_if_no_path = queue_if_no_path; m->queue_if_no_path = queue_if_no_path; + if (!m->queue_if_no_path && m->queue_size) queue_work(kmultipathd, &m->process_queued_ios); @@ -706,7 +724,10 @@ static int parse_hw_handler(struct arg_s { unsigned hw_argc; struct dm_target *ti = m->ti; - + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(ti, name); + #endif static struct param _params[] = { {0, 1024, "invalid number of hardware handler args"}, }; @@ -732,8 +753,9 @@ static int parse_hw_handler(struct arg_s } if (hw_argc > 1) - DMWARN("Ignoring user-specified arguments for " - "hardware handler \"%s\"", m->hw_handler_name); + DMLOG(DMLOG_INIT, DMLOG_WARN, "%s: Ignoring user-specified " + "arguments for hardware handler \"%s\"", + name, m->hw_handler_name); consume(as, hw_argc - 1); return 0; @@ -898,12 +920,18 @@ static int fail_path(struct pgpath *pgpa unsigned long flags; struct multipath *m = pgpath->pg->m; + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif + spin_lock_irqsave(&m->lock, flags); if (!pgpath->is_active) goto out; - DMWARN("Failing path %s.", pgpath->path.dev->name); + DMLOG(DMLOG_PATH_DEACTIVATE, DMLOG_CRIT, "%s: Failing path %s", + name, pgpath->path.dev->name); pgpath->pg->ps.type->fail_path(&pgpath->pg->ps, &pgpath->path); pgpath->is_active = 0; @@ -911,6 +939,7 @@ static int fail_path(struct pgpath *pgpa m->nr_valid_paths--; + if (pgpath == m->current_pgpath) m->current_pgpath = NULL; @@ -935,14 +964,20 @@ static int reinstate_path(struct pgpath unsigned long flags; struct multipath *m = pgpath->pg->m; + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif + spin_lock_irqsave(&m->lock, flags); if (pgpath->is_active) goto out; if (!pgpath->pg->ps.type->reinstate_path) { - DMWARN("Reinstate path not supported by path selector %s", - pgpath->pg->ps.type->name); + DMLOG(DMLOG_PATH_ACTIVATE, DMLOG_WARN, "%s: Reinstate path " + "not supported by path selector %s", + name, pgpath->pg->ps.type->name); r = -EINVAL; goto out; } @@ -951,6 +986,9 @@ static int reinstate_path(struct pgpath if (r) goto out; + DMLOG(DMLOG_PATH_ACTIVATE, DMLOG_CRIT, "%s: Path %s sucessfuly reinstated", + name, pgpath->path.dev->name); + pgpath->is_active = 1; if (!m->nr_valid_paths++ && m->queue_size) { @@ -1020,9 +1058,15 @@ static int switch_pg_num(struct multipat unsigned pgnum; unsigned long flags; + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif + if (!pgstr || (sscanf(pgstr, "%u", &pgnum) != 1) || !pgnum || (pgnum > m->nr_priority_groups)) { - DMWARN("invalid PG number supplied to switch_pg_num"); + DMLOG(DMLOG_FAILOVER, DMLOG_WARN, "%s: invalid PG number" + " supplied to switch_pg_num", name); return -EINVAL; } @@ -1051,9 +1095,15 @@ static int bypass_pg_num(struct multipat struct priority_group *pg; unsigned pgnum; + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif + if (!pgstr || (sscanf(pgstr, "%u", &pgnum) != 1) || !pgnum || (pgnum > m->nr_priority_groups)) { - DMWARN("invalid PG number supplied to bypass_pg"); + DMLOG(DMLOG_FAILOVER, DMLOG_WARN, "%s: invalid PG number " + "supplied to bypass_pg", name); return -EINVAL; } @@ -1074,8 +1124,17 @@ static int pg_init_limit_reached(struct unsigned long flags; int limit_reached = 0; + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif + spin_lock_irqsave(&m->lock, flags); + DMLOG(DMLOG_FAILOVER, DMLOG_INFO, "%s: pg_init_retries = %d, " + "pg_init_count = %d", name, m->pg_init_retries, + m->pg_init_count); + if (m->pg_init_count <= m->pg_init_retries) m->pg_init_required = 1; else @@ -1093,7 +1152,15 @@ static void pg_init_done(struct dm_path struct multipath *m = pg->m; unsigned long flags; + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif + /* device or driver problems */ + DMLOG(DMLOG_FAILOVER, DMLOG_INFO, "%s: failover status = %d ", + pgpath->path.dev->name, errors); + switch (errors) { case SCSI_DH_OK: break; @@ -1102,8 +1169,9 @@ static void pg_init_done(struct dm_path errors = 0; break; } - DMERR("Cannot failover device because scsi_dh_%s was not " - "loaded.", m->hw_handler_name); + DMLOG(DMLOG_FAILOVER, DMLOG_ERR, "%s: Cannot failover " + "device because scsi_dh_%s was not loaded.", + name, m->hw_handler_name); /* * Fail path for now, so we do not ping pong */ @@ -1136,7 +1204,8 @@ static void pg_init_done(struct dm_path spin_lock_irqsave(&m->lock, flags); if (errors) { if (pgpath == m->current_pgpath) { - DMERR("Could not failover device. Error %d.", errors); + DMLOG(DMLOG_FAILOVER, DMLOG_ERR, "%s: Could not failover " + "device. Error %d.", name, errors); m->current_pgpath = NULL; m->current_pg = NULL; } @@ -1178,9 +1247,15 @@ static int do_end_io(struct multipath *m * request into dm core, which will remake a clone request and * clone bios for it and resubmit it later. */ + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif + int r = DM_ENDIO_REQUEUE; unsigned long flags; + if (!error && !clone->errors) return 0; /* I/O complete */ @@ -1191,8 +1266,12 @@ static int do_end_io(struct multipath *m fail_path(mpio->pgpath); spin_lock_irqsave(&m->lock, flags); - if (!m->nr_valid_paths && !m->queue_if_no_path && !__must_push_back(m)) + if (!m->nr_valid_paths && !m->queue_if_no_path && + !__must_push_back(m)) { r = -EIO; + DMLOG(DMLOG_IO, DMLOG_CRIT, "%s: Failing I/O on %s", + name, m->current_pgpath->path.dev->name); + } spin_unlock_irqrestore(&m->lock, flags); return r; @@ -1372,6 +1451,10 @@ static int multipath_message(struct dm_t struct multipath *m = (struct multipath *) ti->private; action_fn action; + #ifdef CONFIG_DM_DEBUG + char name[16]; + dm_target_device_name(m->ti, name); + #endif if (argc == 1) { if (!strnicmp(argv[0], MESG_STR("queue_if_no_path"))) return queue_if_no_path(m, 1, 0); @@ -1382,6 +1465,7 @@ static int multipath_message(struct dm_t if (argc != 2) goto error; + if (!strnicmp(argv[0], MESG_STR("disable_group"))) return bypass_pg_num(m, argv[1], 1); else if (!strnicmp(argv[0], MESG_STR("enable_group"))) @@ -1398,8 +1482,8 @@ static int multipath_message(struct dm_t r = dm_get_device(ti, argv[1], ti->begin, ti->len, dm_table_get_mode(ti->table), &dev); if (r) { - DMWARN("message: error getting device %s", - argv[1]); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: message: error getting " + "device %s", name, argv[1]); return -EINVAL; } @@ -1410,7 +1494,8 @@ static int multipath_message(struct dm_t return r; error: - DMWARN("Unrecognised multipath message received."); + DMLOG(DMLOG_IOCTL, DMLOG_WARN, "%s: Unrecognised multipath " + "message received.", name); return -EINVAL; } @@ -1563,14 +1648,15 @@ static int __init dm_multipath_init(void r = dm_register_target(&multipath_target); if (r < 0) { - DMERR("register failed %d", r); + DMLOG(DMLOG_INIT, DMLOG_ERR, " register failed %d", r); kmem_cache_destroy(_mpio_cache); return -EINVAL; } kmultipathd = create_workqueue("kmpathd"); if (!kmultipathd) { - DMERR("failed to create workqueue kmpathd"); + DMLOG(DMLOG_INIT, DMLOG_ERR, "failed to create " + "workqueue kmpathd"); dm_unregister_target(&multipath_target); kmem_cache_destroy(_mpio_cache); return -ENOMEM; @@ -1584,14 +1670,14 @@ static int __init dm_multipath_init(void */ kmpath_handlerd = create_singlethread_workqueue("kmpath_handlerd"); if (!kmpath_handlerd) { - DMERR("failed to create workqueue kmpath_handlerd"); + DMLOG(DMLOG_INIT, DMLOG_ERR, "failed to create workqueue " + "kmpath_handlerd"); destroy_workqueue(kmultipathd); dm_unregister_target(&multipath_target); kmem_cache_destroy(_mpio_cache); return -ENOMEM; } - - DMINFO("version %u.%u.%u loaded", + DMLOG(DMLOG_INIT, DMLOG_INFO, "version %u.%u.%u loaded", multipath_target.version[0], multipath_target.version[1], multipath_target.version[2]); diff -uprN linux-2.6.31-rc8-orig/drivers/md/dm-path-selector.c linux-2.6.31-rc8/drivers/md/dm-path-selector.c --- linux-2.6.31-rc8-orig/drivers/md/dm-path-selector.c 2009-08-28 06:29:04.000000000 +0530 +++ linux-2.6.31-rc8/drivers/md/dm-path-selector.c 2009-09-22 01:17:46.000000000 +0530 @@ -15,6 +15,8 @@ #include +#define DM_MSG_PREFIX "dm-path-selector" + struct ps_internal { struct path_selector_type pst; struct list_head list; @@ -61,6 +63,8 @@ struct path_selector_type *dm_get_path_s if (!psi) { request_module("dm-%s", name); psi = get_path_selector(name); + DMLOG(DMLOG_INIT, DMLOG_INFO, "path selector module %s %s", + name, (psi) ? "Loaded successfully" : "failed to load"); } return psi ? &psi->pst : NULL; @@ -106,8 +110,13 @@ int dm_register_path_selector(struct pat if (__find_path_selector_type(pst->name)) { kfree(psi); r = -EEXIST; - } else + DMLOG(DMLOG_INIT, DMLOG_ERR, "Failed: Path selector " + "%s already registered", pst->name); + } else { list_add(&psi->list, &_path_selectors); + DMLOG(DMLOG_INIT, DMLOG_INFO, "path selector %s " + "registered successfully", pst->name); + } up_write(&_ps_lock); @@ -122,12 +131,16 @@ int dm_unregister_path_selector(struct p psi = __find_path_selector_type(pst->name); if (!psi) { + DMLOG(DMLOG_INIT, DMLOG_ERR, "Failed to unregister: %s " + "is not registered", pst->name); up_write(&_ps_lock); return -EINVAL; } list_del(&psi->list); + DMLOG(DMLOG_INIT, DMLOG_INFO, "path selector %s unregistered " + "successfully", pst->name); up_write(&_ps_lock); kfree(psi); diff -uprN linux-2.6.31-rc8-orig/drivers/md/dm-table.c linux-2.6.31-rc8/drivers/md/dm-table.c --- linux-2.6.31-rc8-orig/drivers/md/dm-table.c 2009-08-28 06:29:04.000000000 +0530 +++ linux-2.6.31-rc8/drivers/md/dm-table.c 2009-09-22 01:17:45.000000000 +0530 @@ -227,8 +227,9 @@ static void free_devices(struct list_hea list_for_each_safe(tmp, next, devices) { struct dm_dev_internal *dd = list_entry(tmp, struct dm_dev_internal, list); - DMWARN("dm_table_destroy: dm_put_device call missing for %s", - dd->dm_dev.name); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s :dm_table_destroy: " + "dm_put_device call missing", + dd->dm_dev.name); kfree(dd); } } @@ -360,8 +361,9 @@ static int device_area_is_valid(struct d return 1; if ((start >= dev_size) || (start + len > dev_size)) { - DMWARN("%s: %s too small for target", - dm_device_name(ti->table->md), bdevname(bdev, b)); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: %s too small " + "for target", dm_device_name(ti->table->md), + bdevname(bdev, b)); return 0; } @@ -369,17 +371,17 @@ static int device_area_is_valid(struct d return 1; if (start & (logical_block_size_sectors - 1)) { - DMWARN("%s: start=%llu not aligned to h/w " - "logical block size %hu of %s", - dm_device_name(ti->table->md), + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: start=%llu not aligned " + "to h/w logical block size %hu of %s", + dm_device_name(ti->table->md), (unsigned long long)start, limits->logical_block_size, bdevname(bdev, b)); return 0; } if (len & (logical_block_size_sectors - 1)) { - DMWARN("%s: len=%llu not aligned to h/w " - "logical block size %hu of %s", + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: len=%llu not " + "aligned to h/w logical block size %hu of %s", dm_device_name(ti->table->md), (unsigned long long)len, limits->logical_block_size, bdevname(bdev, b)); @@ -490,14 +492,16 @@ int dm_set_device_limits(struct dm_targe char b[BDEVNAME_SIZE]; if (unlikely(!q)) { - DMWARN("%s: Cannot set limits for nonexistent device %s", + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: Cannot set limits " + "for nonexistent device %s", dm_device_name(ti->table->md), bdevname(bdev, b)); return 0; } if (blk_stack_limits(limits, &q->limits, start << 9) < 0) - DMWARN("%s: target device %s is misaligned", - dm_device_name(ti->table->md), bdevname(bdev, b)); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: target device %s " + "is misaligned", dm_device_name(ti->table->md), + bdevname(bdev, b)); /* * Check if merge fn is supported. @@ -697,12 +701,12 @@ static int validate_hardware_logical_blo } if (remaining) { - DMWARN("%s: table line %u (start sect %llu len %llu) " - "not aligned to h/w logical block size %hu", - dm_device_name(table->md), i, - (unsigned long long) ti->begin, - (unsigned long long) ti->len, - limits->logical_block_size); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: table line %u " + "(start sect %llu len %llu) not aligned to " + "h/w logical block size %hu", dm_device_name(table->md), + i, (unsigned long long) ti->begin, + (unsigned long long) ti->len, + limits->logical_block_size); return -EINVAL; } @@ -723,14 +727,15 @@ int dm_table_add_target(struct dm_table memset(tgt, 0, sizeof(*tgt)); if (!len) { - DMERR("%s: zero-length target", dm_device_name(t->md)); + DMLOG(DMLOG_ADD_DEV, DMLOG_ERR, "%s: zero-length target", + dm_device_name(t->md)); return -EINVAL; } tgt->type = dm_get_target_type(type); if (!tgt->type) { - DMERR("%s: %s: unknown target type", dm_device_name(t->md), - type); + DMLOG(DMLOG_ADD_DEV, DMLOG_ERR, "%s: %s: unknown target " + "type", dm_device_name(t->md)); return -EINVAL; } @@ -764,7 +769,8 @@ int dm_table_add_target(struct dm_table return 0; bad: - DMERR("%s: %s: %s", dm_device_name(t->md), type, tgt->error); + DMLOG(DMLOG_ADD_DEV, DMLOG_ERR, "%s: %s: %s", + dm_device_name(t->md), type, tgt->error); dm_put_target_type(tgt->type); return r; } @@ -785,8 +791,8 @@ int dm_table_set_type(struct dm_table *t bio_based = 1; if (bio_based && request_based) { - DMWARN("Inconsistent table: different target types" - " can't be mixed up"); + DMLOG(DMLOG_TABLE, DMLOG_WARN, " Inconsistent table: " + "different target types can't be mixed up"); return -EINVAL; } } @@ -803,8 +809,8 @@ int dm_table_set_type(struct dm_table *t devices = dm_table_get_devices(t); list_for_each_entry(dd, devices, list) { if (!blk_queue_stackable(bdev_get_queue(dd->dm_dev.bdev))) { - DMWARN("table load rejected: including" - " non-request-stackable devices"); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "table load rejected: " + "including non-request-stackable devices"); return -EINVAL; } } @@ -816,7 +822,8 @@ int dm_table_set_type(struct dm_table *t * (e.g. request completion process for partial completion.) */ if (t->num_targets > 1) { - DMWARN("Request-based dm doesn't support multiple targets yet"); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "Request-based dm " + "doesn't support multiple targets yet"); return -EINVAL; } @@ -840,7 +847,8 @@ int dm_table_alloc_md_mempools(struct dm unsigned type = dm_table_get_type(t); if (unlikely(type == DM_TYPE_NONE)) { - DMWARN("no table type is set, can't allocate mempools"); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "no table type is set, " + "can't allocate mempools"); return -EINVAL; } @@ -1010,7 +1018,7 @@ combine_limits: * for the table. */ if (blk_stack_limits(limits, &ti_limits, 0) < 0) - DMWARN("%s: target device " + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: target device " "(start sect %llu len %llu) " "is misaligned", dm_device_name(table->md), @@ -1037,7 +1045,8 @@ static void dm_table_set_integrity(struc if (prev && blk_integrity_compare(prev->dm_dev.bdev->bd_disk, dd->dm_dev.bdev->bd_disk) < 0) { - DMWARN("%s: integrity not set: %s and %s mismatch", + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: integrity not " + "set: %s and %s mismatch", dm_device_name(t->md), prev->dm_dev.bdev->bd_disk->disk_name, dd->dm_dev.bdev->bd_disk->disk_name); @@ -1183,9 +1192,10 @@ int dm_table_any_congested(struct dm_tab if (likely(q)) r |= bdi_congested(&q->backing_dev_info, bdi_bits); else - DMWARN_LIMIT("%s: any_congested: nonexistent device %s", - dm_device_name(t->md), - bdevname(dd->dm_dev.bdev, b)); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: any_congested: " + "nonexistent device %s", + dm_device_name(t->md), + bdevname(dd->dm_dev.bdev, b)); } return r; @@ -1217,9 +1227,10 @@ void dm_table_unplug_all(struct dm_table if (likely(q)) blk_unplug(q); else - DMWARN_LIMIT("%s: Cannot unplug nonexistent device %s", - dm_device_name(t->md), - bdevname(dd->dm_dev.bdev, b)); + DMLOG(DMLOG_TABLE, DMLOG_WARN, "%s: Cannot unplug " + "nonexistent device %s", + dm_device_name(t->md), + bdevname(dd->dm_dev.bdev, b)); } } diff -uprN linux-2.6.31-rc8-orig/drivers/md/dm-uevent.c linux-2.6.31-rc8/drivers/md/dm-uevent.c --- linux-2.6.31-rc8-orig/drivers/md/dm-uevent.c 2009-08-28 06:29:04.000000000 +0530 +++ linux-2.6.31-rc8/drivers/md/dm-uevent.c 2009-09-22 01:17:45.000000000 +0530 @@ -78,40 +78,42 @@ static struct dm_uevent *dm_build_path_u event = dm_uevent_alloc(md); if (!event) { - DMERR("%s: dm_uevent_alloc() failed", __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: dm_uevent_alloc() failed", + dm_device_name(md)); goto err_nomem; } event->action = action; if (add_uevent_var(&event->ku_env, "DM_TARGET=%s", ti->type->name)) { - DMERR("%s: add_uevent_var() for DM_TARGET failed", - __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: add_uevent_var() " + "for DM_TARGET failed", dm_device_name(md)); goto err_add; } if (add_uevent_var(&event->ku_env, "DM_ACTION=%s", dm_action)) { - DMERR("%s: add_uevent_var() for DM_ACTION failed", - __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: add_uevent_var() for " + "DM_ACTION failed", dm_device_name(md)); goto err_add; } if (add_uevent_var(&event->ku_env, "DM_SEQNUM=%u", dm_next_uevent_seq(md))) { - DMERR("%s: add_uevent_var() for DM_SEQNUM failed", - __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: add_uevent_var() for " + "DM_SEQNUM failed", dm_device_name(md)); goto err_add; } if (add_uevent_var(&event->ku_env, "DM_PATH=%s", path)) { - DMERR("%s: add_uevent_var() for DM_PATH failed", __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: add_uevent_var() for " + "DM_PATH failed", dm_device_name(md)); goto err_add; } if (add_uevent_var(&event->ku_env, "DM_NR_VALID_PATHS=%d", nr_valid_paths)) { - DMERR("%s: add_uevent_var() for DM_NR_VALID_PATHS failed", - __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: add_uevent_var() for " + "DM_NR_VALID_PATHS failed", dm_device_name(md)); goto err_add; } @@ -145,26 +147,28 @@ void dm_send_uevents(struct list_head *e */ if (dm_copy_name_and_uuid(event->md, event->name, event->uuid)) { - DMERR("%s: dm_copy_name_and_uuid() failed", - __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: " + "dm_copy_name_and_uuid() failed", + event->name); goto uevent_free; } if (add_uevent_var(&event->ku_env, "DM_NAME=%s", event->name)) { - DMERR("%s: add_uevent_var() for DM_NAME failed", - __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: add_uevent_var() " + "for DM_NAME failed", event->name); goto uevent_free; } if (add_uevent_var(&event->ku_env, "DM_UUID=%s", event->uuid)) { - DMERR("%s: add_uevent_var() for DM_UUID failed", - __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, "%s: add_uevent_var() " + "for DM_UUID failed", event->name); goto uevent_free; } r = kobject_uevent_env(kobj, event->action, event->ku_env.envp); if (r) - DMERR("%s: kobject_uevent_env failed", __func__); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, + "%s: kobject_uevent_env failed", event->name); uevent_free: dm_uevent_free(event); } @@ -187,7 +191,8 @@ void dm_path_uevent(enum dm_uevent_type struct dm_uevent *event; if (event_type >= ARRAY_SIZE(_dm_uevent_type_names)) { - DMERR("%s: Invalid event_type %d", __func__, event_type); + DMLOG(DMLOG_UEVENT, DMLOG_ERR, + "Invalid event_type %d", event_type); goto out; } @@ -211,7 +216,7 @@ int dm_uevent_init(void) if (!_dm_event_cache) return -ENOMEM; - DMINFO("version 1.0.3"); + DMLOG(DMLOG_UEVENT, DMLOG_INFO, "version 1.0.3"); return 0; } diff -uprN linux-2.6.31-rc8-orig/include/linux/device-mapper.h linux-2.6.31-rc8/include/linux/device-mapper.h --- linux-2.6.31-rc8-orig/include/linux/device-mapper.h 2009-08-28 06:29:04.000000000 +0530 +++ linux-2.6.31-rc8/include/linux/device-mapper.h 2009-09-22 01:17:11.000000000 +0530 @@ -334,18 +334,52 @@ void *dm_vcalloc(unsigned long nmemb, un "\n", ## arg); \ } while (0) +/* +* DM LOGGING MACRO +*/ +extern unsigned int dm_logging_level; + #ifdef CONFIG_DM_DEBUG -# define DMDEBUG(f, arg...) \ - printk(KERN_DEBUG DM_NAME ": " DM_MSG_PREFIX " DEBUG: " f "\n", ## arg) -# define DMDEBUG_LIMIT(f, arg...) \ - do { \ - if (printk_ratelimit()) \ - printk(KERN_DEBUG DM_NAME ": " DM_MSG_PREFIX ": " f \ - "\n", ## arg); \ + +/* DM Logging level */ +#define DMLOG_CRIT 0 +#define DMLOG_ERR 1 +#define DMLOG_WARN 2 +#define DMLOG_INFO 3 + +#define DMLOG_BITS 2 + +/*DM Logging types */ +enum { +DMLOG_INIT = 0, +DMLOG_ADD_DEV, +DMLOG_REMOVE_DEV, +DMLOG_IOCTL, +DMLOG_IO, +DMLOG_UEVENT, +DMLOG_TABLE, + +DMLOG_FAILOVER, +DMLOG_PATH_ACTIVATE, +DMLOG_PATH_DEACTIVATE, +}; + + + +# define DMLOG_LEVEL(SHIFT) \ + ((dm_logging_level >> (SHIFT * DMLOG_BITS)) & ((1 << (DMLOG_BITS)) - 1)) + +# define DMLOG(SHIFT, LEVEL, f, arg...) \ + do { \ + if ((DMLOG_LEVEL(SHIFT)) >= (LEVEL)) \ + do { \ + printk(DM_NAME ": " DM_MSG_PREFIX ": " \ + "DEBUG: %s: " f "\n", __func__, ## arg); \ + } while (0); \ } while (0) + #else -# define DMDEBUG(f, arg...) do {} while (0) -# define DMDEBUG_LIMIT(f, arg...) do {} while (0) +#define DMLOG(SHIFT, LEVEL, f, arg...) do {} while (0) #endif #define DMEMIT(x...) sz += ((sz >= maxlen) ? \ @@ -404,5 +438,6 @@ void dm_dispatch_request(struct request void dm_requeue_unmapped_request(struct request *rq); void dm_kill_unmapped_request(struct request *rq, int error); int dm_underlying_device_busy(struct request_queue *q); +void dm_target_device_name(struct dm_target *ti , char *name); #endif /* _LINUX_DEVICE_MAPPER_H */