diff options
author | Joe Perches <joe@perches.com> | 2014-05-04 20:05:08 -0400 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2014-05-05 16:58:06 -0400 |
commit | 2e9aa08a4801d439daec4c7d1b953c27b212d423 (patch) | |
tree | 08fac2d5eb2447e2674947be515ad849cf0ecc99 /drivers/cdrom | |
parent | 1237d1eecff27015617e5a43cc9528658a5fa8ef (diff) |
cdrom: Move mmc_ioctls above cdrom_ioctl to remove unnecessary prototype
Neaten the spacing too.
Signed-off-by: Joe Perches <joe@perches.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'drivers/cdrom')
-rw-r--r-- | drivers/cdrom/cdrom.c | 246 |
1 files changed, 122 insertions, 124 deletions
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index 08abbae6bf68..332c3aee1346 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -337,8 +337,6 @@ do { \ | |||
337 | #define CDROM_DEF_TIMEOUT (7 * HZ) | 337 | #define CDROM_DEF_TIMEOUT (7 * HZ) |
338 | 338 | ||
339 | /* Not-exported routines. */ | 339 | /* Not-exported routines. */ |
340 | static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, | ||
341 | unsigned long arg); | ||
342 | 340 | ||
343 | int cdrom_get_last_written(struct cdrom_device_info *, long *); | 341 | int cdrom_get_last_written(struct cdrom_device_info *, long *); |
344 | static int cdrom_get_next_writable(struct cdrom_device_info *, long *); | 342 | static int cdrom_get_next_writable(struct cdrom_device_info *, long *); |
@@ -2714,103 +2712,6 @@ static int cdrom_ioctl_audioctl(struct cdrom_device_info *cdi, | |||
2714 | } | 2712 | } |
2715 | 2713 | ||
2716 | /* | 2714 | /* |
2717 | * Just about every imaginable ioctl is supported in the Uniform layer | ||
2718 | * these days. | ||
2719 | * ATAPI / SCSI specific code now mainly resides in mmc_ioctl(). | ||
2720 | */ | ||
2721 | int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev, | ||
2722 | fmode_t mode, unsigned int cmd, unsigned long arg) | ||
2723 | { | ||
2724 | void __user *argp = (void __user *)arg; | ||
2725 | int ret; | ||
2726 | |||
2727 | /* | ||
2728 | * Try the generic SCSI command ioctl's first. | ||
2729 | */ | ||
2730 | ret = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp); | ||
2731 | if (ret != -ENOTTY) | ||
2732 | return ret; | ||
2733 | |||
2734 | switch (cmd) { | ||
2735 | case CDROMMULTISESSION: | ||
2736 | return cdrom_ioctl_multisession(cdi, argp); | ||
2737 | case CDROMEJECT: | ||
2738 | return cdrom_ioctl_eject(cdi); | ||
2739 | case CDROMCLOSETRAY: | ||
2740 | return cdrom_ioctl_closetray(cdi); | ||
2741 | case CDROMEJECT_SW: | ||
2742 | return cdrom_ioctl_eject_sw(cdi, arg); | ||
2743 | case CDROM_MEDIA_CHANGED: | ||
2744 | return cdrom_ioctl_media_changed(cdi, arg); | ||
2745 | case CDROM_SET_OPTIONS: | ||
2746 | return cdrom_ioctl_set_options(cdi, arg); | ||
2747 | case CDROM_CLEAR_OPTIONS: | ||
2748 | return cdrom_ioctl_clear_options(cdi, arg); | ||
2749 | case CDROM_SELECT_SPEED: | ||
2750 | return cdrom_ioctl_select_speed(cdi, arg); | ||
2751 | case CDROM_SELECT_DISC: | ||
2752 | return cdrom_ioctl_select_disc(cdi, arg); | ||
2753 | case CDROMRESET: | ||
2754 | return cdrom_ioctl_reset(cdi, bdev); | ||
2755 | case CDROM_LOCKDOOR: | ||
2756 | return cdrom_ioctl_lock_door(cdi, arg); | ||
2757 | case CDROM_DEBUG: | ||
2758 | return cdrom_ioctl_debug(cdi, arg); | ||
2759 | case CDROM_GET_CAPABILITY: | ||
2760 | return cdrom_ioctl_get_capability(cdi); | ||
2761 | case CDROM_GET_MCN: | ||
2762 | return cdrom_ioctl_get_mcn(cdi, argp); | ||
2763 | case CDROM_DRIVE_STATUS: | ||
2764 | return cdrom_ioctl_drive_status(cdi, arg); | ||
2765 | case CDROM_DISC_STATUS: | ||
2766 | return cdrom_ioctl_disc_status(cdi); | ||
2767 | case CDROM_CHANGER_NSLOTS: | ||
2768 | return cdrom_ioctl_changer_nslots(cdi); | ||
2769 | } | ||
2770 | |||
2771 | /* | ||
2772 | * Use the ioctls that are implemented through the generic_packet() | ||
2773 | * interface. this may look at bit funny, but if -ENOTTY is | ||
2774 | * returned that particular ioctl is not implemented and we | ||
2775 | * let it go through the device specific ones. | ||
2776 | */ | ||
2777 | if (CDROM_CAN(CDC_GENERIC_PACKET)) { | ||
2778 | ret = mmc_ioctl(cdi, cmd, arg); | ||
2779 | if (ret != -ENOTTY) | ||
2780 | return ret; | ||
2781 | } | ||
2782 | |||
2783 | /* | ||
2784 | * Note: most of the cd_dbg() calls are commented out here, | ||
2785 | * because they fill up the sys log when CD players poll | ||
2786 | * the drive. | ||
2787 | */ | ||
2788 | switch (cmd) { | ||
2789 | case CDROMSUBCHNL: | ||
2790 | return cdrom_ioctl_get_subchnl(cdi, argp); | ||
2791 | case CDROMREADTOCHDR: | ||
2792 | return cdrom_ioctl_read_tochdr(cdi, argp); | ||
2793 | case CDROMREADTOCENTRY: | ||
2794 | return cdrom_ioctl_read_tocentry(cdi, argp); | ||
2795 | case CDROMPLAYMSF: | ||
2796 | return cdrom_ioctl_play_msf(cdi, argp); | ||
2797 | case CDROMPLAYTRKIND: | ||
2798 | return cdrom_ioctl_play_trkind(cdi, argp); | ||
2799 | case CDROMVOLCTRL: | ||
2800 | return cdrom_ioctl_volctrl(cdi, argp); | ||
2801 | case CDROMVOLREAD: | ||
2802 | return cdrom_ioctl_volread(cdi, argp); | ||
2803 | case CDROMSTART: | ||
2804 | case CDROMSTOP: | ||
2805 | case CDROMPAUSE: | ||
2806 | case CDROMRESUME: | ||
2807 | return cdrom_ioctl_audioctl(cdi, cmd); | ||
2808 | } | ||
2809 | |||
2810 | return -ENOSYS; | ||
2811 | } | ||
2812 | |||
2813 | /* | ||
2814 | * Required when we need to use READ_10 to issue other than 2048 block | 2715 | * Required when we need to use READ_10 to issue other than 2048 block |
2815 | * reads | 2716 | * reads |
2816 | */ | 2717 | */ |
@@ -2840,9 +2741,9 @@ static int cdrom_switch_blocksize(struct cdrom_device_info *cdi, int size) | |||
2840 | } | 2741 | } |
2841 | 2742 | ||
2842 | static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi, | 2743 | static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi, |
2843 | void __user *arg, | 2744 | void __user *arg, |
2844 | struct packet_command *cgc, | 2745 | struct packet_command *cgc, |
2845 | int cmd) | 2746 | int cmd) |
2846 | { | 2747 | { |
2847 | struct request_sense sense; | 2748 | struct request_sense sense; |
2848 | struct cdrom_msf msf; | 2749 | struct cdrom_msf msf; |
@@ -2877,8 +2778,8 @@ static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi, | |||
2877 | cgc->data_direction = CGC_DATA_READ; | 2778 | cgc->data_direction = CGC_DATA_READ; |
2878 | ret = cdrom_read_block(cdi, cgc, lba, 1, format, blocksize); | 2779 | ret = cdrom_read_block(cdi, cgc, lba, 1, format, blocksize); |
2879 | if (ret && sense.sense_key == 0x05 && | 2780 | if (ret && sense.sense_key == 0x05 && |
2880 | sense.asc == 0x20 && | 2781 | sense.asc == 0x20 && |
2881 | sense.ascq == 0x00) { | 2782 | sense.ascq == 0x00) { |
2882 | /* | 2783 | /* |
2883 | * SCSI-II devices are not required to support | 2784 | * SCSI-II devices are not required to support |
2884 | * READ_CD, so let's try switching block size | 2785 | * READ_CD, so let's try switching block size |
@@ -2899,7 +2800,7 @@ out: | |||
2899 | } | 2800 | } |
2900 | 2801 | ||
2901 | static noinline int mmc_ioctl_cdrom_read_audio(struct cdrom_device_info *cdi, | 2802 | static noinline int mmc_ioctl_cdrom_read_audio(struct cdrom_device_info *cdi, |
2902 | void __user *arg) | 2803 | void __user *arg) |
2903 | { | 2804 | { |
2904 | struct cdrom_read_audio ra; | 2805 | struct cdrom_read_audio ra; |
2905 | int lba; | 2806 | int lba; |
@@ -2925,7 +2826,7 @@ static noinline int mmc_ioctl_cdrom_read_audio(struct cdrom_device_info *cdi, | |||
2925 | } | 2826 | } |
2926 | 2827 | ||
2927 | static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi, | 2828 | static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi, |
2928 | void __user *arg) | 2829 | void __user *arg) |
2929 | { | 2830 | { |
2930 | int ret; | 2831 | int ret; |
2931 | struct cdrom_subchnl q; | 2832 | struct cdrom_subchnl q; |
@@ -2950,8 +2851,8 @@ static noinline int mmc_ioctl_cdrom_subchannel(struct cdrom_device_info *cdi, | |||
2950 | } | 2851 | } |
2951 | 2852 | ||
2952 | static noinline int mmc_ioctl_cdrom_play_msf(struct cdrom_device_info *cdi, | 2853 | static noinline int mmc_ioctl_cdrom_play_msf(struct cdrom_device_info *cdi, |
2953 | void __user *arg, | 2854 | void __user *arg, |
2954 | struct packet_command *cgc) | 2855 | struct packet_command *cgc) |
2955 | { | 2856 | { |
2956 | struct cdrom_device_ops *cdo = cdi->ops; | 2857 | struct cdrom_device_ops *cdo = cdi->ops; |
2957 | struct cdrom_msf msf; | 2858 | struct cdrom_msf msf; |
@@ -2970,8 +2871,8 @@ static noinline int mmc_ioctl_cdrom_play_msf(struct cdrom_device_info *cdi, | |||
2970 | } | 2871 | } |
2971 | 2872 | ||
2972 | static noinline int mmc_ioctl_cdrom_play_blk(struct cdrom_device_info *cdi, | 2873 | static noinline int mmc_ioctl_cdrom_play_blk(struct cdrom_device_info *cdi, |
2973 | void __user *arg, | 2874 | void __user *arg, |
2974 | struct packet_command *cgc) | 2875 | struct packet_command *cgc) |
2975 | { | 2876 | { |
2976 | struct cdrom_device_ops *cdo = cdi->ops; | 2877 | struct cdrom_device_ops *cdo = cdi->ops; |
2977 | struct cdrom_blk blk; | 2878 | struct cdrom_blk blk; |
@@ -2990,9 +2891,9 @@ static noinline int mmc_ioctl_cdrom_play_blk(struct cdrom_device_info *cdi, | |||
2990 | } | 2891 | } |
2991 | 2892 | ||
2992 | static noinline int mmc_ioctl_cdrom_volume(struct cdrom_device_info *cdi, | 2893 | static noinline int mmc_ioctl_cdrom_volume(struct cdrom_device_info *cdi, |
2993 | void __user *arg, | 2894 | void __user *arg, |
2994 | struct packet_command *cgc, | 2895 | struct packet_command *cgc, |
2995 | unsigned int cmd) | 2896 | unsigned int cmd) |
2996 | { | 2897 | { |
2997 | struct cdrom_volctrl volctrl; | 2898 | struct cdrom_volctrl volctrl; |
2998 | unsigned char buffer[32]; | 2899 | unsigned char buffer[32]; |
@@ -3024,14 +2925,14 @@ static noinline int mmc_ioctl_cdrom_volume(struct cdrom_device_info *cdi, | |||
3024 | if (offset + 16 > cgc->buflen) { | 2925 | if (offset + 16 > cgc->buflen) { |
3025 | cgc->buflen = offset + 16; | 2926 | cgc->buflen = offset + 16; |
3026 | ret = cdrom_mode_sense(cdi, cgc, | 2927 | ret = cdrom_mode_sense(cdi, cgc, |
3027 | GPMODE_AUDIO_CTL_PAGE, 0); | 2928 | GPMODE_AUDIO_CTL_PAGE, 0); |
3028 | if (ret) | 2929 | if (ret) |
3029 | return ret; | 2930 | return ret; |
3030 | } | 2931 | } |
3031 | 2932 | ||
3032 | /* sanity check */ | 2933 | /* sanity check */ |
3033 | if ((buffer[offset] & 0x3f) != GPMODE_AUDIO_CTL_PAGE || | 2934 | if ((buffer[offset] & 0x3f) != GPMODE_AUDIO_CTL_PAGE || |
3034 | buffer[offset + 1] < 14) | 2935 | buffer[offset + 1] < 14) |
3035 | return -EINVAL; | 2936 | return -EINVAL; |
3036 | 2937 | ||
3037 | /* now we have the current volume settings. if it was only | 2938 | /* now we have the current volume settings. if it was only |
@@ -3065,8 +2966,8 @@ static noinline int mmc_ioctl_cdrom_volume(struct cdrom_device_info *cdi, | |||
3065 | } | 2966 | } |
3066 | 2967 | ||
3067 | static noinline int mmc_ioctl_cdrom_start_stop(struct cdrom_device_info *cdi, | 2968 | static noinline int mmc_ioctl_cdrom_start_stop(struct cdrom_device_info *cdi, |
3068 | struct packet_command *cgc, | 2969 | struct packet_command *cgc, |
3069 | int cmd) | 2970 | int cmd) |
3070 | { | 2971 | { |
3071 | struct cdrom_device_ops *cdo = cdi->ops; | 2972 | struct cdrom_device_ops *cdo = cdi->ops; |
3072 | cd_dbg(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n"); | 2973 | cd_dbg(CD_DO_IOCTL, "entering CDROMSTART/CDROMSTOP\n"); |
@@ -3078,8 +2979,8 @@ static noinline int mmc_ioctl_cdrom_start_stop(struct cdrom_device_info *cdi, | |||
3078 | } | 2979 | } |
3079 | 2980 | ||
3080 | static noinline int mmc_ioctl_cdrom_pause_resume(struct cdrom_device_info *cdi, | 2981 | static noinline int mmc_ioctl_cdrom_pause_resume(struct cdrom_device_info *cdi, |
3081 | struct packet_command *cgc, | 2982 | struct packet_command *cgc, |
3082 | int cmd) | 2983 | int cmd) |
3083 | { | 2984 | { |
3084 | struct cdrom_device_ops *cdo = cdi->ops; | 2985 | struct cdrom_device_ops *cdo = cdi->ops; |
3085 | cd_dbg(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n"); | 2986 | cd_dbg(CD_DO_IOCTL, "entering CDROMPAUSE/CDROMRESUME\n"); |
@@ -3090,8 +2991,8 @@ static noinline int mmc_ioctl_cdrom_pause_resume(struct cdrom_device_info *cdi, | |||
3090 | } | 2991 | } |
3091 | 2992 | ||
3092 | static noinline int mmc_ioctl_dvd_read_struct(struct cdrom_device_info *cdi, | 2993 | static noinline int mmc_ioctl_dvd_read_struct(struct cdrom_device_info *cdi, |
3093 | void __user *arg, | 2994 | void __user *arg, |
3094 | struct packet_command *cgc) | 2995 | struct packet_command *cgc) |
3095 | { | 2996 | { |
3096 | int ret; | 2997 | int ret; |
3097 | dvd_struct *s; | 2998 | dvd_struct *s; |
@@ -3122,7 +3023,7 @@ out: | |||
3122 | } | 3023 | } |
3123 | 3024 | ||
3124 | static noinline int mmc_ioctl_dvd_auth(struct cdrom_device_info *cdi, | 3025 | static noinline int mmc_ioctl_dvd_auth(struct cdrom_device_info *cdi, |
3125 | void __user *arg) | 3026 | void __user *arg) |
3126 | { | 3027 | { |
3127 | int ret; | 3028 | int ret; |
3128 | dvd_authinfo ai; | 3029 | dvd_authinfo ai; |
@@ -3140,7 +3041,7 @@ static noinline int mmc_ioctl_dvd_auth(struct cdrom_device_info *cdi, | |||
3140 | } | 3041 | } |
3141 | 3042 | ||
3142 | static noinline int mmc_ioctl_cdrom_next_writable(struct cdrom_device_info *cdi, | 3043 | static noinline int mmc_ioctl_cdrom_next_writable(struct cdrom_device_info *cdi, |
3143 | void __user *arg) | 3044 | void __user *arg) |
3144 | { | 3045 | { |
3145 | int ret; | 3046 | int ret; |
3146 | long next = 0; | 3047 | long next = 0; |
@@ -3154,7 +3055,7 @@ static noinline int mmc_ioctl_cdrom_next_writable(struct cdrom_device_info *cdi, | |||
3154 | } | 3055 | } |
3155 | 3056 | ||
3156 | static noinline int mmc_ioctl_cdrom_last_written(struct cdrom_device_info *cdi, | 3057 | static noinline int mmc_ioctl_cdrom_last_written(struct cdrom_device_info *cdi, |
3157 | void __user *arg) | 3058 | void __user *arg) |
3158 | { | 3059 | { |
3159 | int ret; | 3060 | int ret; |
3160 | long last = 0; | 3061 | long last = 0; |
@@ -3212,6 +3113,103 @@ static int mmc_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, | |||
3212 | return -ENOTTY; | 3113 | return -ENOTTY; |
3213 | } | 3114 | } |
3214 | 3115 | ||
3116 | /* | ||
3117 | * Just about every imaginable ioctl is supported in the Uniform layer | ||
3118 | * these days. | ||
3119 | * ATAPI / SCSI specific code now mainly resides in mmc_ioctl(). | ||
3120 | */ | ||
3121 | int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev, | ||
3122 | fmode_t mode, unsigned int cmd, unsigned long arg) | ||
3123 | { | ||
3124 | void __user *argp = (void __user *)arg; | ||
3125 | int ret; | ||
3126 | |||
3127 | /* | ||
3128 | * Try the generic SCSI command ioctl's first. | ||
3129 | */ | ||
3130 | ret = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp); | ||
3131 | if (ret != -ENOTTY) | ||
3132 | return ret; | ||
3133 | |||
3134 | switch (cmd) { | ||
3135 | case CDROMMULTISESSION: | ||
3136 | return cdrom_ioctl_multisession(cdi, argp); | ||
3137 | case CDROMEJECT: | ||
3138 | return cdrom_ioctl_eject(cdi); | ||
3139 | case CDROMCLOSETRAY: | ||
3140 | return cdrom_ioctl_closetray(cdi); | ||
3141 | case CDROMEJECT_SW: | ||
3142 | return cdrom_ioctl_eject_sw(cdi, arg); | ||
3143 | case CDROM_MEDIA_CHANGED: | ||
3144 | return cdrom_ioctl_media_changed(cdi, arg); | ||
3145 | case CDROM_SET_OPTIONS: | ||
3146 | return cdrom_ioctl_set_options(cdi, arg); | ||
3147 | case CDROM_CLEAR_OPTIONS: | ||
3148 | return cdrom_ioctl_clear_options(cdi, arg); | ||
3149 | case CDROM_SELECT_SPEED: | ||
3150 | return cdrom_ioctl_select_speed(cdi, arg); | ||
3151 | case CDROM_SELECT_DISC: | ||
3152 | return cdrom_ioctl_select_disc(cdi, arg); | ||
3153 | case CDROMRESET: | ||
3154 | return cdrom_ioctl_reset(cdi, bdev); | ||
3155 | case CDROM_LOCKDOOR: | ||
3156 | return cdrom_ioctl_lock_door(cdi, arg); | ||
3157 | case CDROM_DEBUG: | ||
3158 | return cdrom_ioctl_debug(cdi, arg); | ||
3159 | case CDROM_GET_CAPABILITY: | ||
3160 | return cdrom_ioctl_get_capability(cdi); | ||
3161 | case CDROM_GET_MCN: | ||
3162 | return cdrom_ioctl_get_mcn(cdi, argp); | ||
3163 | case CDROM_DRIVE_STATUS: | ||
3164 | return cdrom_ioctl_drive_status(cdi, arg); | ||
3165 | case CDROM_DISC_STATUS: | ||
3166 | return cdrom_ioctl_disc_status(cdi); | ||
3167 | case CDROM_CHANGER_NSLOTS: | ||
3168 | return cdrom_ioctl_changer_nslots(cdi); | ||
3169 | } | ||
3170 | |||
3171 | /* | ||
3172 | * Use the ioctls that are implemented through the generic_packet() | ||
3173 | * interface. this may look at bit funny, but if -ENOTTY is | ||
3174 | * returned that particular ioctl is not implemented and we | ||
3175 | * let it go through the device specific ones. | ||
3176 | */ | ||
3177 | if (CDROM_CAN(CDC_GENERIC_PACKET)) { | ||
3178 | ret = mmc_ioctl(cdi, cmd, arg); | ||
3179 | if (ret != -ENOTTY) | ||
3180 | return ret; | ||
3181 | } | ||
3182 | |||
3183 | /* | ||
3184 | * Note: most of the cd_dbg() calls are commented out here, | ||
3185 | * because they fill up the sys log when CD players poll | ||
3186 | * the drive. | ||
3187 | */ | ||
3188 | switch (cmd) { | ||
3189 | case CDROMSUBCHNL: | ||
3190 | return cdrom_ioctl_get_subchnl(cdi, argp); | ||
3191 | case CDROMREADTOCHDR: | ||
3192 | return cdrom_ioctl_read_tochdr(cdi, argp); | ||
3193 | case CDROMREADTOCENTRY: | ||
3194 | return cdrom_ioctl_read_tocentry(cdi, argp); | ||
3195 | case CDROMPLAYMSF: | ||
3196 | return cdrom_ioctl_play_msf(cdi, argp); | ||
3197 | case CDROMPLAYTRKIND: | ||
3198 | return cdrom_ioctl_play_trkind(cdi, argp); | ||
3199 | case CDROMVOLCTRL: | ||
3200 | return cdrom_ioctl_volctrl(cdi, argp); | ||
3201 | case CDROMVOLREAD: | ||
3202 | return cdrom_ioctl_volread(cdi, argp); | ||
3203 | case CDROMSTART: | ||
3204 | case CDROMSTOP: | ||
3205 | case CDROMPAUSE: | ||
3206 | case CDROMRESUME: | ||
3207 | return cdrom_ioctl_audioctl(cdi, cmd); | ||
3208 | } | ||
3209 | |||
3210 | return -ENOSYS; | ||
3211 | } | ||
3212 | |||
3215 | static int cdrom_get_track_info(struct cdrom_device_info *cdi, __u16 track, __u8 type, | 3213 | static int cdrom_get_track_info(struct cdrom_device_info *cdi, __u16 track, __u8 type, |
3216 | track_information *ti) | 3214 | track_information *ti) |
3217 | { | 3215 | { |