linux/drivers/usb/mon/mon_text.c
<<
>>
Prefs
   1/*
   2 * The USB Monitor, inspired by Dave Harding's USBMon.
   3 *
   4 * This is a text format reader.
   5 */
   6
   7#include <linux/kernel.h>
   8#include <linux/list.h>
   9#include <linux/usb.h>
  10#include <linux/slab.h>
  11#include <linux/time.h>
  12#include <linux/export.h>
  13#include <linux/mutex.h>
  14#include <linux/debugfs.h>
  15#include <linux/scatterlist.h>
  16#include <asm/uaccess.h>
  17
  18#include "usb_mon.h"
  19
  20/*
  21 * No, we do not want arbitrarily long data strings.
  22 * Use the binary interface if you want to capture bulk data!
  23 */
  24#define DATA_MAX  32
  25
  26/*
  27 * Defined by USB 2.0 clause 9.3, table 9.2.
  28 */
  29#define SETUP_MAX  8
  30
  31/*
  32 * This limit exists to prevent OOMs when the user process stops reading.
  33 * If usbmon were available to unprivileged processes, it might be open
  34 * to a local DoS. But we have to keep to root in order to prevent
  35 * password sniffing from HID devices.
  36 */
  37#define EVENT_MAX  (4*PAGE_SIZE / sizeof(struct mon_event_text))
  38
  39/*
  40 * Potentially unlimited number; we limit it for similar allocations.
  41 * The usbfs limits this to 128, but we're not quite as generous.
  42 */
  43#define ISODESC_MAX   5
  44
  45#define PRINTF_DFL  250   /* with 5 ISOs segs */
  46
  47struct mon_iso_desc {
  48        int status;
  49        unsigned int offset;
  50        unsigned int length;    /* Unsigned here, signed in URB. Historic. */
  51};
  52
  53struct mon_event_text {
  54        struct list_head e_link;
  55        int type;               /* submit, complete, etc. */
  56        unsigned long id;       /* From pointer, most of the time */
  57        unsigned int tstamp;
  58        int busnum;
  59        char devnum;
  60        char epnum;
  61        char is_in;
  62        char xfertype;
  63        int length;             /* Depends on type: xfer length or act length */
  64        int status;
  65        int interval;
  66        int start_frame;
  67        int error_count;
  68        char setup_flag;
  69        char data_flag;
  70        int numdesc;            /* Full number */
  71        struct mon_iso_desc isodesc[ISODESC_MAX];
  72        unsigned char setup[SETUP_MAX];
  73        unsigned char data[DATA_MAX];
  74};
  75
  76#define SLAB_NAME_SZ  30
  77struct mon_reader_text {
  78        struct kmem_cache *e_slab;
  79        int nevents;
  80        struct list_head e_list;
  81        struct mon_reader r;    /* In C, parent class can be placed anywhere */
  82
  83        wait_queue_head_t wait;
  84        int printf_size;
  85        char *printf_buf;
  86        struct mutex printf_lock;
  87
  88        char slab_name[SLAB_NAME_SZ];
  89};
  90
  91static struct dentry *mon_dir;          /* Usually /sys/kernel/debug/usbmon */
  92
  93static void mon_text_ctor(void *);
  94
  95struct mon_text_ptr {
  96        int cnt, limit;
  97        char *pbuf;
  98};
  99
 100static struct mon_event_text *
 101    mon_text_read_wait(struct mon_reader_text *rp, struct file *file);
 102static void mon_text_read_head_t(struct mon_reader_text *rp,
 103        struct mon_text_ptr *p, const struct mon_event_text *ep);
 104static void mon_text_read_head_u(struct mon_reader_text *rp,
 105        struct mon_text_ptr *p, const struct mon_event_text *ep);
 106static void mon_text_read_statset(struct mon_reader_text *rp,
 107        struct mon_text_ptr *p, const struct mon_event_text *ep);
 108static void mon_text_read_intstat(struct mon_reader_text *rp,
 109        struct mon_text_ptr *p, const struct mon_event_text *ep);
 110static void mon_text_read_isostat(struct mon_reader_text *rp,
 111        struct mon_text_ptr *p, const struct mon_event_text *ep);
 112static void mon_text_read_isodesc(struct mon_reader_text *rp,
 113        struct mon_text_ptr *p, const struct mon_event_text *ep);
 114static void mon_text_read_data(struct mon_reader_text *rp,
 115    struct mon_text_ptr *p, const struct mon_event_text *ep);
 116
 117/*
 118 * mon_text_submit
 119 * mon_text_complete
 120 *
 121 * May be called from an interrupt.
 122 *
 123 * This is called with the whole mon_bus locked, so no additional lock.
 124 */
 125
 126static inline char mon_text_get_setup(struct mon_event_text *ep,
 127    struct urb *urb, char ev_type, struct mon_bus *mbus)
 128{
 129
 130        if (ep->xfertype != USB_ENDPOINT_XFER_CONTROL || ev_type != 'S')
 131                return '-';
 132
 133        if (urb->setup_packet == NULL)
 134                return 'Z';     /* '0' would be not as pretty. */
 135
 136        memcpy(ep->setup, urb->setup_packet, SETUP_MAX);
 137        return 0;
 138}
 139
 140static inline char mon_text_get_data(struct mon_event_text *ep, struct urb *urb,
 141    int len, char ev_type, struct mon_bus *mbus)
 142{
 143        void *src;
 144
 145        if (len <= 0)
 146                return 'L';
 147        if (len >= DATA_MAX)
 148                len = DATA_MAX;
 149
 150        if (ep->is_in) {
 151                if (ev_type != 'C')
 152                        return '<';
 153        } else {
 154                if (ev_type != 'S')
 155                        return '>';
 156        }
 157
 158        if (urb->num_sgs == 0) {
 159                src = urb->transfer_buffer;
 160                if (src == NULL)
 161                        return 'Z';     /* '0' would be not as pretty. */
 162        } else {
 163                struct scatterlist *sg = urb->sg;
 164
 165                if (PageHighMem(sg_page(sg)))
 166                        return 'D';
 167
 168                /* For the text interface we copy only the first sg buffer */
 169                len = min_t(int, sg->length, len);
 170                src = sg_virt(sg);
 171        }
 172
 173        memcpy(ep->data, src, len);
 174        return 0;
 175}
 176
 177static inline unsigned int mon_get_timestamp(void)
 178{
 179        struct timeval tval;
 180        unsigned int stamp;
 181
 182        do_gettimeofday(&tval);
 183        stamp = tval.tv_sec & 0xFFF;    /* 2^32 = 4294967296. Limit to 4096s. */
 184        stamp = stamp * 1000000 + tval.tv_usec;
 185        return stamp;
 186}
 187
 188static void mon_text_event(struct mon_reader_text *rp, struct urb *urb,
 189    char ev_type, int status)
 190{
 191        struct mon_event_text *ep;
 192        unsigned int stamp;
 193        struct usb_iso_packet_descriptor *fp;
 194        struct mon_iso_desc *dp;
 195        int i, ndesc;
 196
 197        stamp = mon_get_timestamp();
 198
 199        if (rp->nevents >= EVENT_MAX ||
 200            (ep = kmem_cache_alloc(rp->e_slab, GFP_ATOMIC)) == NULL) {
 201                rp->r.m_bus->cnt_text_lost++;
 202                return;
 203        }
 204
 205        ep->type = ev_type;
 206        ep->id = (unsigned long) urb;
 207        ep->busnum = urb->dev->bus->busnum;
 208        ep->devnum = urb->dev->devnum;
 209        ep->epnum = usb_endpoint_num(&urb->ep->desc);
 210        ep->xfertype = usb_endpoint_type(&urb->ep->desc);
 211        ep->is_in = usb_urb_dir_in(urb);
 212        ep->tstamp = stamp;
 213        ep->length = (ev_type == 'S') ?
 214            urb->transfer_buffer_length : urb->actual_length;
 215        /* Collecting status makes debugging sense for submits, too */
 216        ep->status = status;
 217
 218        if (ep->xfertype == USB_ENDPOINT_XFER_INT) {
 219                ep->interval = urb->interval;
 220        } else if (ep->xfertype == USB_ENDPOINT_XFER_ISOC) {
 221                ep->interval = urb->interval;
 222                ep->start_frame = urb->start_frame;
 223                ep->error_count = urb->error_count;
 224        }
 225        ep->numdesc = urb->number_of_packets;
 226        if (ep->xfertype == USB_ENDPOINT_XFER_ISOC &&
 227                        urb->number_of_packets > 0) {
 228                if ((ndesc = urb->number_of_packets) > ISODESC_MAX)
 229                        ndesc = ISODESC_MAX;
 230                fp = urb->iso_frame_desc;
 231                dp = ep->isodesc;
 232                for (i = 0; i < ndesc; i++) {
 233                        dp->status = fp->status;
 234                        dp->offset = fp->offset;
 235                        dp->length = (ev_type == 'S') ?
 236                            fp->length : fp->actual_length;
 237                        fp++;
 238                        dp++;
 239                }
 240                /* Wasteful, but simple to understand: ISO 'C' is sparse. */
 241                if (ev_type == 'C')
 242                        ep->length = urb->transfer_buffer_length;
 243        }
 244
 245        ep->setup_flag = mon_text_get_setup(ep, urb, ev_type, rp->r.m_bus);
 246        ep->data_flag = mon_text_get_data(ep, urb, ep->length, ev_type,
 247                        rp->r.m_bus);
 248
 249        rp->nevents++;
 250        list_add_tail(&ep->e_link, &rp->e_list);
 251        wake_up(&rp->wait);
 252}
 253
 254static void mon_text_submit(void *data, struct urb *urb)
 255{
 256        struct mon_reader_text *rp = data;
 257        mon_text_event(rp, urb, 'S', -EINPROGRESS);
 258}
 259
 260static void mon_text_complete(void *data, struct urb *urb, int status)
 261{
 262        struct mon_reader_text *rp = data;
 263        mon_text_event(rp, urb, 'C', status);
 264}
 265
 266static void mon_text_error(void *data, struct urb *urb, int error)
 267{
 268        struct mon_reader_text *rp = data;
 269        struct mon_event_text *ep;
 270
 271        if (rp->nevents >= EVENT_MAX ||
 272            (ep = kmem_cache_alloc(rp->e_slab, GFP_ATOMIC)) == NULL) {
 273                rp->r.m_bus->cnt_text_lost++;
 274                return;
 275        }
 276
 277        ep->type = 'E';
 278        ep->id = (unsigned long) urb;
 279        ep->busnum = urb->dev->bus->busnum;
 280        ep->devnum = urb->dev->devnum;
 281        ep->epnum = usb_endpoint_num(&urb->ep->desc);
 282        ep->xfertype = usb_endpoint_type(&urb->ep->desc);
 283        ep->is_in = usb_urb_dir_in(urb);
 284        ep->tstamp = mon_get_timestamp();
 285        ep->length = 0;
 286        ep->status = error;
 287
 288        ep->setup_flag = '-';
 289        ep->data_flag = 'E';
 290
 291        rp->nevents++;
 292        list_add_tail(&ep->e_link, &rp->e_list);
 293        wake_up(&rp->wait);
 294}
 295
 296/*
 297 * Fetch next event from the circular buffer.
 298 */
 299static struct mon_event_text *mon_text_fetch(struct mon_reader_text *rp,
 300    struct mon_bus *mbus)
 301{
 302        struct list_head *p;
 303        unsigned long flags;
 304
 305        spin_lock_irqsave(&mbus->lock, flags);
 306        if (list_empty(&rp->e_list)) {
 307                spin_unlock_irqrestore(&mbus->lock, flags);
 308                return NULL;
 309        }
 310        p = rp->e_list.next;
 311        list_del(p);
 312        --rp->nevents;
 313        spin_unlock_irqrestore(&mbus->lock, flags);
 314        return list_entry(p, struct mon_event_text, e_link);
 315}
 316
 317/*
 318 */
 319static int mon_text_open(struct inode *inode, struct file *file)
 320{
 321        struct mon_bus *mbus;
 322        struct mon_reader_text *rp;
 323        int rc;
 324
 325        mutex_lock(&mon_lock);
 326        mbus = inode->i_private;
 327
 328        rp = kzalloc(sizeof(struct mon_reader_text), GFP_KERNEL);
 329        if (rp == NULL) {
 330                rc = -ENOMEM;
 331                goto err_alloc;
 332        }
 333        INIT_LIST_HEAD(&rp->e_list);
 334        init_waitqueue_head(&rp->wait);
 335        mutex_init(&rp->printf_lock);
 336
 337        rp->printf_size = PRINTF_DFL;
 338        rp->printf_buf = kmalloc(rp->printf_size, GFP_KERNEL);
 339        if (rp->printf_buf == NULL) {
 340                rc = -ENOMEM;
 341                goto err_alloc_pr;
 342        }
 343
 344        rp->r.m_bus = mbus;
 345        rp->r.r_data = rp;
 346        rp->r.rnf_submit = mon_text_submit;
 347        rp->r.rnf_error = mon_text_error;
 348        rp->r.rnf_complete = mon_text_complete;
 349
 350        snprintf(rp->slab_name, SLAB_NAME_SZ, "mon_text_%p", rp);
 351        rp->e_slab = kmem_cache_create(rp->slab_name,
 352            sizeof(struct mon_event_text), sizeof(long), 0,
 353            mon_text_ctor);
 354        if (rp->e_slab == NULL) {
 355                rc = -ENOMEM;
 356                goto err_slab;
 357        }
 358
 359        mon_reader_add(mbus, &rp->r);
 360
 361        file->private_data = rp;
 362        mutex_unlock(&mon_lock);
 363        return 0;
 364
 365// err_busy:
 366//      kmem_cache_destroy(rp->e_slab);
 367err_slab:
 368        kfree(rp->printf_buf);
 369err_alloc_pr:
 370        kfree(rp);
 371err_alloc:
 372        mutex_unlock(&mon_lock);
 373        return rc;
 374}
 375
 376/*
 377 * For simplicity, we read one record in one system call and throw out
 378 * what does not fit. This means that the following does not work:
 379 *   dd if=/dbg/usbmon/0t bs=10
 380 * Also, we do not allow seeks and do not bother advancing the offset.
 381 */
 382static ssize_t mon_text_read_t(struct file *file, char __user *buf,
 383                                size_t nbytes, loff_t *ppos)
 384{
 385        struct mon_reader_text *rp = file->private_data;
 386        struct mon_event_text *ep;
 387        struct mon_text_ptr ptr;
 388
 389        if (IS_ERR(ep = mon_text_read_wait(rp, file)))
 390                return PTR_ERR(ep);
 391        mutex_lock(&rp->printf_lock);
 392        ptr.cnt = 0;
 393        ptr.pbuf = rp->printf_buf;
 394        ptr.limit = rp->printf_size;
 395
 396        mon_text_read_head_t(rp, &ptr, ep);
 397        mon_text_read_statset(rp, &ptr, ep);
 398        ptr.cnt += snprintf(ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt,
 399            " %d", ep->length);
 400        mon_text_read_data(rp, &ptr, ep);
 401
 402        if (copy_to_user(buf, rp->printf_buf, ptr.cnt))
 403                ptr.cnt = -EFAULT;
 404        mutex_unlock(&rp->printf_lock);
 405        kmem_cache_free(rp->e_slab, ep);
 406        return ptr.cnt;
 407}
 408
 409static ssize_t mon_text_read_u(struct file *file, char __user *buf,
 410                                size_t nbytes, loff_t *ppos)
 411{
 412        struct mon_reader_text *rp = file->private_data;
 413        struct mon_event_text *ep;
 414        struct mon_text_ptr ptr;
 415
 416        if (IS_ERR(ep = mon_text_read_wait(rp, file)))
 417                return PTR_ERR(ep);
 418        mutex_lock(&rp->printf_lock);
 419        ptr.cnt = 0;
 420        ptr.pbuf = rp->printf_buf;
 421        ptr.limit = rp->printf_size;
 422
 423        mon_text_read_head_u(rp, &ptr, ep);
 424        if (ep->type == 'E') {
 425                mon_text_read_statset(rp, &ptr, ep);
 426        } else if (ep->xfertype == USB_ENDPOINT_XFER_ISOC) {
 427                mon_text_read_isostat(rp, &ptr, ep);
 428                mon_text_read_isodesc(rp, &ptr, ep);
 429        } else if (ep->xfertype == USB_ENDPOINT_XFER_INT) {
 430                mon_text_read_intstat(rp, &ptr, ep);
 431        } else {
 432                mon_text_read_statset(rp, &ptr, ep);
 433        }
 434        ptr.cnt += snprintf(ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt,
 435            " %d", ep->length);
 436        mon_text_read_data(rp, &ptr, ep);
 437
 438        if (copy_to_user(buf, rp->printf_buf, ptr.cnt))
 439                ptr.cnt = -EFAULT;
 440        mutex_unlock(&rp->printf_lock);
 441        kmem_cache_free(rp->e_slab, ep);
 442        return ptr.cnt;
 443}
 444
 445static struct mon_event_text *mon_text_read_wait(struct mon_reader_text *rp,
 446    struct file *file)
 447{
 448        struct mon_bus *mbus = rp->r.m_bus;
 449        DECLARE_WAITQUEUE(waita, current);
 450        struct mon_event_text *ep;
 451
 452        add_wait_queue(&rp->wait, &waita);
 453        set_current_state(TASK_INTERRUPTIBLE);
 454        while ((ep = mon_text_fetch(rp, mbus)) == NULL) {
 455                if (file->f_flags & O_NONBLOCK) {
 456                        set_current_state(TASK_RUNNING);
 457                        remove_wait_queue(&rp->wait, &waita);
 458                        return ERR_PTR(-EWOULDBLOCK);
 459                }
 460                /*
 461                 * We do not count nwaiters, because ->release is supposed
 462                 * to be called when all openers are gone only.
 463                 */
 464                schedule();
 465                if (signal_pending(current)) {
 466                        remove_wait_queue(&rp->wait, &waita);
 467                        return ERR_PTR(-EINTR);
 468                }
 469                set_current_state(TASK_INTERRUPTIBLE);
 470        }
 471        set_current_state(TASK_RUNNING);
 472        remove_wait_queue(&rp->wait, &waita);
 473        return ep;
 474}
 475
 476static void mon_text_read_head_t(struct mon_reader_text *rp,
 477        struct mon_text_ptr *p, const struct mon_event_text *ep)
 478{
 479        char udir, utype;
 480
 481        udir = (ep->is_in ? 'i' : 'o');
 482        switch (ep->xfertype) {
 483        case USB_ENDPOINT_XFER_ISOC:    utype = 'Z'; break;
 484        case USB_ENDPOINT_XFER_INT:     utype = 'I'; break;
 485        case USB_ENDPOINT_XFER_CONTROL: utype = 'C'; break;
 486        default: /* PIPE_BULK */  utype = 'B';
 487        }
 488        p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 489            "%lx %u %c %c%c:%03u:%02u",
 490            ep->id, ep->tstamp, ep->type,
 491            utype, udir, ep->devnum, ep->epnum);
 492}
 493
 494static void mon_text_read_head_u(struct mon_reader_text *rp,
 495        struct mon_text_ptr *p, const struct mon_event_text *ep)
 496{
 497        char udir, utype;
 498
 499        udir = (ep->is_in ? 'i' : 'o');
 500        switch (ep->xfertype) {
 501        case USB_ENDPOINT_XFER_ISOC:    utype = 'Z'; break;
 502        case USB_ENDPOINT_XFER_INT:     utype = 'I'; break;
 503        case USB_ENDPOINT_XFER_CONTROL: utype = 'C'; break;
 504        default: /* PIPE_BULK */  utype = 'B';
 505        }
 506        p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 507            "%lx %u %c %c%c:%d:%03u:%u",
 508            ep->id, ep->tstamp, ep->type,
 509            utype, udir, ep->busnum, ep->devnum, ep->epnum);
 510}
 511
 512static void mon_text_read_statset(struct mon_reader_text *rp,
 513        struct mon_text_ptr *p, const struct mon_event_text *ep)
 514{
 515
 516        if (ep->setup_flag == 0) {   /* Setup packet is present and captured */
 517                p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 518                    " s %02x %02x %04x %04x %04x",
 519                    ep->setup[0],
 520                    ep->setup[1],
 521                    (ep->setup[3] << 8) | ep->setup[2],
 522                    (ep->setup[5] << 8) | ep->setup[4],
 523                    (ep->setup[7] << 8) | ep->setup[6]);
 524        } else if (ep->setup_flag != '-') { /* Unable to capture setup packet */
 525                p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 526                    " %c __ __ ____ ____ ____", ep->setup_flag);
 527        } else {                     /* No setup for this kind of URB */
 528                p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 529                    " %d", ep->status);
 530        }
 531}
 532
 533static void mon_text_read_intstat(struct mon_reader_text *rp,
 534        struct mon_text_ptr *p, const struct mon_event_text *ep)
 535{
 536        p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 537            " %d:%d", ep->status, ep->interval);
 538}
 539
 540static void mon_text_read_isostat(struct mon_reader_text *rp,
 541        struct mon_text_ptr *p, const struct mon_event_text *ep)
 542{
 543        if (ep->type == 'S') {
 544                p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 545                    " %d:%d:%d", ep->status, ep->interval, ep->start_frame);
 546        } else {
 547                p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 548                    " %d:%d:%d:%d",
 549                    ep->status, ep->interval, ep->start_frame, ep->error_count);
 550        }
 551}
 552
 553static void mon_text_read_isodesc(struct mon_reader_text *rp,
 554        struct mon_text_ptr *p, const struct mon_event_text *ep)
 555{
 556        int ndesc;      /* Display this many */
 557        int i;
 558        const struct mon_iso_desc *dp;
 559
 560        p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 561            " %d", ep->numdesc);
 562        ndesc = ep->numdesc;
 563        if (ndesc > ISODESC_MAX)
 564                ndesc = ISODESC_MAX;
 565        if (ndesc < 0)
 566                ndesc = 0;
 567        dp = ep->isodesc;
 568        for (i = 0; i < ndesc; i++) {
 569                p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 570                    " %d:%u:%u", dp->status, dp->offset, dp->length);
 571                dp++;
 572        }
 573}
 574
 575static void mon_text_read_data(struct mon_reader_text *rp,
 576    struct mon_text_ptr *p, const struct mon_event_text *ep)
 577{
 578        int data_len, i;
 579
 580        if ((data_len = ep->length) > 0) {
 581                if (ep->data_flag == 0) {
 582                        p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 583                            " =");
 584                        if (data_len >= DATA_MAX)
 585                                data_len = DATA_MAX;
 586                        for (i = 0; i < data_len; i++) {
 587                                if (i % 4 == 0) {
 588                                        p->cnt += snprintf(p->pbuf + p->cnt,
 589                                            p->limit - p->cnt,
 590                                            " ");
 591                                }
 592                                p->cnt += snprintf(p->pbuf + p->cnt,
 593                                    p->limit - p->cnt,
 594                                    "%02x", ep->data[i]);
 595                        }
 596                        p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 597                            "\n");
 598                } else {
 599                        p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt,
 600                            " %c\n", ep->data_flag);
 601                }
 602        } else {
 603                p->cnt += snprintf(p->pbuf + p->cnt, p->limit - p->cnt, "\n");
 604        }
 605}
 606
 607static int mon_text_release(struct inode *inode, struct file *file)
 608{
 609        struct mon_reader_text *rp = file->private_data;
 610        struct mon_bus *mbus;
 611        /* unsigned long flags; */
 612        struct list_head *p;
 613        struct mon_event_text *ep;
 614
 615        mutex_lock(&mon_lock);
 616        mbus = inode->i_private;
 617
 618        if (mbus->nreaders <= 0) {
 619                printk(KERN_ERR TAG ": consistency error on close\n");
 620                mutex_unlock(&mon_lock);
 621                return 0;
 622        }
 623        mon_reader_del(mbus, &rp->r);
 624
 625        /*
 626         * In theory, e_list is protected by mbus->lock. However,
 627         * after mon_reader_del has finished, the following is the case:
 628         *  - we are not on reader list anymore, so new events won't be added;
 629         *  - whole mbus may be dropped if it was orphaned.
 630         * So, we better not touch mbus.
 631         */
 632        /* spin_lock_irqsave(&mbus->lock, flags); */
 633        while (!list_empty(&rp->e_list)) {
 634                p = rp->e_list.next;
 635                ep = list_entry(p, struct mon_event_text, e_link);
 636                list_del(p);
 637                --rp->nevents;
 638                kmem_cache_free(rp->e_slab, ep);
 639        }
 640        /* spin_unlock_irqrestore(&mbus->lock, flags); */
 641
 642        kmem_cache_destroy(rp->e_slab);
 643        kfree(rp->printf_buf);
 644        kfree(rp);
 645
 646        mutex_unlock(&mon_lock);
 647        return 0;
 648}
 649
 650static const struct file_operations mon_fops_text_t = {
 651        .owner =        THIS_MODULE,
 652        .open =         mon_text_open,
 653        .llseek =       no_llseek,
 654        .read =         mon_text_read_t,
 655        .release =      mon_text_release,
 656};
 657
 658static const struct file_operations mon_fops_text_u = {
 659        .owner =        THIS_MODULE,
 660        .open =         mon_text_open,
 661        .llseek =       no_llseek,
 662        .read =         mon_text_read_u,
 663        .release =      mon_text_release,
 664};
 665
 666int mon_text_add(struct mon_bus *mbus, const struct usb_bus *ubus)
 667{
 668        struct dentry *d;
 669        enum { NAMESZ = 10 };
 670        char name[NAMESZ];
 671        int busnum = ubus? ubus->busnum: 0;
 672        int rc;
 673
 674        if (mon_dir == NULL)
 675                return 0;
 676
 677        if (ubus != NULL) {
 678                rc = snprintf(name, NAMESZ, "%dt", busnum);
 679                if (rc <= 0 || rc >= NAMESZ)
 680                        goto err_print_t;
 681                d = debugfs_create_file(name, 0600, mon_dir, mbus,
 682                                                             &mon_fops_text_t);
 683                if (d == NULL)
 684                        goto err_create_t;
 685                mbus->dent_t = d;
 686        }
 687
 688        rc = snprintf(name, NAMESZ, "%du", busnum);
 689        if (rc <= 0 || rc >= NAMESZ)
 690                goto err_print_u;
 691        d = debugfs_create_file(name, 0600, mon_dir, mbus, &mon_fops_text_u);
 692        if (d == NULL)
 693                goto err_create_u;
 694        mbus->dent_u = d;
 695
 696        rc = snprintf(name, NAMESZ, "%ds", busnum);
 697        if (rc <= 0 || rc >= NAMESZ)
 698                goto err_print_s;
 699        d = debugfs_create_file(name, 0600, mon_dir, mbus, &mon_fops_stat);
 700        if (d == NULL)
 701                goto err_create_s;
 702        mbus->dent_s = d;
 703
 704        return 1;
 705
 706err_create_s:
 707err_print_s:
 708        debugfs_remove(mbus->dent_u);
 709        mbus->dent_u = NULL;
 710err_create_u:
 711err_print_u:
 712        if (ubus != NULL) {
 713                debugfs_remove(mbus->dent_t);
 714                mbus->dent_t = NULL;
 715        }
 716err_create_t:
 717err_print_t:
 718        return 0;
 719}
 720
 721void mon_text_del(struct mon_bus *mbus)
 722{
 723        debugfs_remove(mbus->dent_u);
 724        if (mbus->dent_t != NULL)
 725                debugfs_remove(mbus->dent_t);
 726        debugfs_remove(mbus->dent_s);
 727}
 728
 729/*
 730 * Slab interface: constructor.
 731 */
 732static void mon_text_ctor(void *mem)
 733{
 734        /*
 735         * Nothing to initialize. No, really!
 736         * So, we fill it with garbage to emulate a reused object.
 737         */
 738        memset(mem, 0xe5, sizeof(struct mon_event_text));
 739}
 740
 741int __init mon_text_init(void)
 742{
 743        struct dentry *mondir;
 744
 745        mondir = debugfs_create_dir("usbmon", usb_debug_root);
 746        if (IS_ERR(mondir)) {
 747                /* debugfs not available, but we can use usbmon without it */
 748                return 0;
 749        }
 750        if (mondir == NULL) {
 751                printk(KERN_NOTICE TAG ": unable to create usbmon directory\n");
 752                return -ENOMEM;
 753        }
 754        mon_dir = mondir;
 755        return 0;
 756}
 757
 758void mon_text_exit(void)
 759{
 760        debugfs_remove(mon_dir);
 761}
 762