@@ -7723,34 +7723,60 @@ const struct file_operations trace_min_max_fops = {
7723
7723
struct err_info {
7724
7724
const char * * errs ; /* ptr to loc-specific array of err strings */
7725
7725
u8 type ; /* index into errs -> specific err string */
7726
- u8 pos ; /* MAX_FILTER_STR_VAL = 256 */
7726
+ u16 pos ; /* caret position */
7727
7727
u64 ts ;
7728
7728
};
7729
7729
7730
7730
struct tracing_log_err {
7731
7731
struct list_head list ;
7732
7732
struct err_info info ;
7733
7733
char loc [TRACING_LOG_LOC_MAX ]; /* err location */
7734
- char cmd [ MAX_FILTER_STR_VAL ]; /* what caused err */
7734
+ char * cmd ; /* what caused err */
7735
7735
};
7736
7736
7737
7737
static DEFINE_MUTEX (tracing_err_log_lock );
7738
7738
7739
- static struct tracing_log_err * get_tracing_log_err (struct trace_array * tr )
7739
+ static struct tracing_log_err * alloc_tracing_log_err (int len )
7740
+ {
7741
+ struct tracing_log_err * err ;
7742
+
7743
+ err = kzalloc (sizeof (* err ), GFP_KERNEL );
7744
+ if (!err )
7745
+ return ERR_PTR (- ENOMEM );
7746
+
7747
+ err -> cmd = kzalloc (len , GFP_KERNEL );
7748
+ if (!err -> cmd ) {
7749
+ kfree (err );
7750
+ return ERR_PTR (- ENOMEM );
7751
+ }
7752
+
7753
+ return err ;
7754
+ }
7755
+
7756
+ static void free_tracing_log_err (struct tracing_log_err * err )
7757
+ {
7758
+ kfree (err -> cmd );
7759
+ kfree (err );
7760
+ }
7761
+
7762
+ static struct tracing_log_err * get_tracing_log_err (struct trace_array * tr ,
7763
+ int len )
7740
7764
{
7741
7765
struct tracing_log_err * err ;
7742
7766
7743
7767
if (tr -> n_err_log_entries < TRACING_LOG_ERRS_MAX ) {
7744
- err = kzalloc (sizeof (* err ), GFP_KERNEL );
7745
- if (!err )
7746
- err = ERR_PTR (- ENOMEM );
7747
- else
7768
+ err = alloc_tracing_log_err (len );
7769
+ if (PTR_ERR (err ) != - ENOMEM )
7748
7770
tr -> n_err_log_entries ++ ;
7749
7771
7750
7772
return err ;
7751
7773
}
7752
7774
7753
7775
err = list_first_entry (& tr -> err_log , struct tracing_log_err , list );
7776
+ kfree (err -> cmd );
7777
+ err -> cmd = kzalloc (len , GFP_KERNEL );
7778
+ if (!err -> cmd )
7779
+ return ERR_PTR (- ENOMEM );
7754
7780
list_del (& err -> list );
7755
7781
7756
7782
return err ;
@@ -7811,22 +7837,25 @@ unsigned int err_pos(char *cmd, const char *str)
7811
7837
*/
7812
7838
void tracing_log_err (struct trace_array * tr ,
7813
7839
const char * loc , const char * cmd ,
7814
- const char * * errs , u8 type , u8 pos )
7840
+ const char * * errs , u8 type , u16 pos )
7815
7841
{
7816
7842
struct tracing_log_err * err ;
7843
+ int len = 0 ;
7817
7844
7818
7845
if (!tr )
7819
7846
tr = & global_trace ;
7820
7847
7848
+ len += sizeof (CMD_PREFIX ) + 2 * sizeof ("\n" ) + strlen (cmd ) + 1 ;
7849
+
7821
7850
mutex_lock (& tracing_err_log_lock );
7822
- err = get_tracing_log_err (tr );
7851
+ err = get_tracing_log_err (tr , len );
7823
7852
if (PTR_ERR (err ) == - ENOMEM ) {
7824
7853
mutex_unlock (& tracing_err_log_lock );
7825
7854
return ;
7826
7855
}
7827
7856
7828
7857
snprintf (err -> loc , TRACING_LOG_LOC_MAX , "%s: error: " , loc );
7829
- snprintf (err -> cmd , MAX_FILTER_STR_VAL , "\n" CMD_PREFIX "%s\n" , cmd );
7858
+ snprintf (err -> cmd , len , "\n" CMD_PREFIX "%s\n" , cmd );
7830
7859
7831
7860
err -> info .errs = errs ;
7832
7861
err -> info .type = type ;
@@ -7844,7 +7873,7 @@ static void clear_tracing_err_log(struct trace_array *tr)
7844
7873
mutex_lock (& tracing_err_log_lock );
7845
7874
list_for_each_entry_safe (err , next , & tr -> err_log , list ) {
7846
7875
list_del (& err -> list );
7847
- kfree (err );
7876
+ free_tracing_log_err (err );
7848
7877
}
7849
7878
7850
7879
tr -> n_err_log_entries = 0 ;
@@ -7872,9 +7901,9 @@ static void tracing_err_log_seq_stop(struct seq_file *m, void *v)
7872
7901
mutex_unlock (& tracing_err_log_lock );
7873
7902
}
7874
7903
7875
- static void tracing_err_log_show_pos (struct seq_file * m , u8 pos )
7904
+ static void tracing_err_log_show_pos (struct seq_file * m , u16 pos )
7876
7905
{
7877
- u8 i ;
7906
+ u16 i ;
7878
7907
7879
7908
for (i = 0 ; i < sizeof (CMD_PREFIX ) - 1 ; i ++ )
7880
7909
seq_putc (m , ' ' );
0 commit comments