18
18
19
19
#include "pblk.h"
20
20
21
- static void pblk_map_page_data (struct pblk * pblk , unsigned int sentry ,
22
- struct ppa_addr * ppa_list ,
23
- unsigned long * lun_bitmap ,
24
- struct pblk_sec_meta * meta_list ,
25
- unsigned int valid_secs )
21
+ static int pblk_map_page_data (struct pblk * pblk , unsigned int sentry ,
22
+ struct ppa_addr * ppa_list ,
23
+ unsigned long * lun_bitmap ,
24
+ struct pblk_sec_meta * meta_list ,
25
+ unsigned int valid_secs )
26
26
{
27
27
struct pblk_line * line = pblk_line_get_data (pblk );
28
28
struct pblk_emeta * emeta ;
@@ -35,8 +35,14 @@ static void pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
35
35
if (pblk_line_is_full (line )) {
36
36
struct pblk_line * prev_line = line ;
37
37
38
+ /* If we cannot allocate a new line, make sure to store metadata
39
+ * on current line and then fail
40
+ */
38
41
line = pblk_line_replace_data (pblk );
39
42
pblk_line_close_meta (pblk , prev_line );
43
+
44
+ if (!line )
45
+ return - EINTR ;
40
46
}
41
47
42
48
emeta = line -> emeta ;
@@ -74,6 +80,7 @@ static void pblk_map_page_data(struct pblk *pblk, unsigned int sentry,
74
80
}
75
81
76
82
pblk_down_rq (pblk , ppa_list , nr_secs , lun_bitmap );
83
+ return 0 ;
77
84
}
78
85
79
86
void pblk_map_rq (struct pblk * pblk , struct nvm_rq * rqd , unsigned int sentry ,
@@ -87,8 +94,12 @@ void pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, unsigned int sentry,
87
94
88
95
for (i = off ; i < rqd -> nr_ppas ; i += min ) {
89
96
map_secs = (i + min > valid_secs ) ? (valid_secs % min ) : min ;
90
- pblk_map_page_data (pblk , sentry + i , & rqd -> ppa_list [i ],
91
- lun_bitmap , & meta_list [i ], map_secs );
97
+ if (pblk_map_page_data (pblk , sentry + i , & rqd -> ppa_list [i ],
98
+ lun_bitmap , & meta_list [i ], map_secs )) {
99
+ bio_put (rqd -> bio );
100
+ pblk_free_rqd (pblk , rqd , PBLK_WRITE );
101
+ pblk_pipeline_stop (pblk );
102
+ }
92
103
}
93
104
}
94
105
@@ -108,8 +119,12 @@ void pblk_map_erase_rq(struct pblk *pblk, struct nvm_rq *rqd,
108
119
109
120
for (i = 0 ; i < rqd -> nr_ppas ; i += min ) {
110
121
map_secs = (i + min > valid_secs ) ? (valid_secs % min ) : min ;
111
- pblk_map_page_data (pblk , sentry + i , & rqd -> ppa_list [i ],
112
- lun_bitmap , & meta_list [i ], map_secs );
122
+ if (pblk_map_page_data (pblk , sentry + i , & rqd -> ppa_list [i ],
123
+ lun_bitmap , & meta_list [i ], map_secs )) {
124
+ bio_put (rqd -> bio );
125
+ pblk_free_rqd (pblk , rqd , PBLK_WRITE );
126
+ pblk_pipeline_stop (pblk );
127
+ }
113
128
114
129
erase_lun = pblk_ppa_to_pos (geo , rqd -> ppa_list [i ]);
115
130
0 commit comments