Merge a3a93b4683
("memstick: fix memory leak if card device is never registered") into android14-6.1
Steps on the way to 6.1.26 Change-Id: I068fdd73b1a29b954bef6931c144aa707d446482 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
c4cafbd0d4
@ -410,6 +410,7 @@ static struct memstick_dev *memstick_alloc_card(struct memstick_host *host)
|
||||
return card;
|
||||
err_out:
|
||||
host->card = old_card;
|
||||
kfree_const(card->dev.kobj.name);
|
||||
kfree(card);
|
||||
return NULL;
|
||||
}
|
||||
@ -468,8 +469,10 @@ static void memstick_check(struct work_struct *work)
|
||||
put_device(&card->dev);
|
||||
host->card = NULL;
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
kfree_const(card->dev.kobj.name);
|
||||
kfree(card);
|
||||
}
|
||||
}
|
||||
|
||||
out_power_off:
|
||||
|
@ -430,6 +430,23 @@ static int nilfs_segctor_reset_segment_buffer(struct nilfs_sc_info *sci)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* nilfs_segctor_zeropad_segsum - zero pad the rest of the segment summary area
|
||||
* @sci: segment constructor object
|
||||
*
|
||||
* nilfs_segctor_zeropad_segsum() zero-fills unallocated space at the end of
|
||||
* the current segment summary block.
|
||||
*/
|
||||
static void nilfs_segctor_zeropad_segsum(struct nilfs_sc_info *sci)
|
||||
{
|
||||
struct nilfs_segsum_pointer *ssp;
|
||||
|
||||
ssp = sci->sc_blk_cnt > 0 ? &sci->sc_binfo_ptr : &sci->sc_finfo_ptr;
|
||||
if (ssp->offset < ssp->bh->b_size)
|
||||
memset(ssp->bh->b_data + ssp->offset, 0,
|
||||
ssp->bh->b_size - ssp->offset);
|
||||
}
|
||||
|
||||
static int nilfs_segctor_feed_segment(struct nilfs_sc_info *sci)
|
||||
{
|
||||
sci->sc_nblk_this_inc += sci->sc_curseg->sb_sum.nblocks;
|
||||
@ -438,6 +455,7 @@ static int nilfs_segctor_feed_segment(struct nilfs_sc_info *sci)
|
||||
* The current segment is filled up
|
||||
* (internal code)
|
||||
*/
|
||||
nilfs_segctor_zeropad_segsum(sci);
|
||||
sci->sc_curseg = NILFS_NEXT_SEGBUF(sci->sc_curseg);
|
||||
return nilfs_segctor_reset_segment_buffer(sci);
|
||||
}
|
||||
@ -542,6 +560,7 @@ static int nilfs_segctor_add_file_block(struct nilfs_sc_info *sci,
|
||||
goto retry;
|
||||
}
|
||||
if (unlikely(required)) {
|
||||
nilfs_segctor_zeropad_segsum(sci);
|
||||
err = nilfs_segbuf_extend_segsum(segbuf);
|
||||
if (unlikely(err))
|
||||
goto failed;
|
||||
@ -1531,6 +1550,7 @@ static int nilfs_segctor_collect(struct nilfs_sc_info *sci,
|
||||
nadd = min_t(int, nadd << 1, SC_MAX_SEGDELTA);
|
||||
sci->sc_stage = prev_stage;
|
||||
}
|
||||
nilfs_segctor_zeropad_segsum(sci);
|
||||
nilfs_segctor_truncate_segments(sci, sci->sc_curseg, nilfs->ns_sufile);
|
||||
return 0;
|
||||
|
||||
|
@ -1293,26 +1293,21 @@ static inline void mas_alloc_nodes(struct ma_state *mas, gfp_t gfp)
|
||||
node = mas->alloc;
|
||||
node->request_count = 0;
|
||||
while (requested) {
|
||||
max_req = MAPLE_ALLOC_SLOTS;
|
||||
if (node->node_count) {
|
||||
unsigned int offset = node->node_count;
|
||||
|
||||
slots = (void **)&node->slot[offset];
|
||||
max_req -= offset;
|
||||
} else {
|
||||
slots = (void **)&node->slot;
|
||||
}
|
||||
|
||||
max_req = MAPLE_ALLOC_SLOTS - node->node_count;
|
||||
slots = (void **)&node->slot[node->node_count];
|
||||
max_req = min(requested, max_req);
|
||||
count = mt_alloc_bulk(gfp, max_req, slots);
|
||||
if (!count)
|
||||
goto nomem_bulk;
|
||||
|
||||
if (node->node_count == 0) {
|
||||
node->slot[0]->node_count = 0;
|
||||
node->slot[0]->request_count = 0;
|
||||
}
|
||||
|
||||
node->node_count += count;
|
||||
allocated += count;
|
||||
node = node->slot[0];
|
||||
node->node_count = 0;
|
||||
node->request_count = 0;
|
||||
requested -= count;
|
||||
}
|
||||
mas->alloc->total = allocated;
|
||||
@ -4968,7 +4963,8 @@ static inline void *mas_prev_entry(struct ma_state *mas, unsigned long min)
|
||||
* Return: True if found in a leaf, false otherwise.
|
||||
*
|
||||
*/
|
||||
static bool mas_rev_awalk(struct ma_state *mas, unsigned long size)
|
||||
static bool mas_rev_awalk(struct ma_state *mas, unsigned long size,
|
||||
unsigned long *gap_min, unsigned long *gap_max)
|
||||
{
|
||||
enum maple_type type = mte_node_type(mas->node);
|
||||
struct maple_node *node = mas_mn(mas);
|
||||
@ -5033,8 +5029,8 @@ static bool mas_rev_awalk(struct ma_state *mas, unsigned long size)
|
||||
|
||||
if (unlikely(ma_is_leaf(type))) {
|
||||
mas->offset = offset;
|
||||
mas->min = min;
|
||||
mas->max = min + gap - 1;
|
||||
*gap_min = min;
|
||||
*gap_max = min + gap - 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -5058,10 +5054,10 @@ static inline bool mas_anode_descend(struct ma_state *mas, unsigned long size)
|
||||
{
|
||||
enum maple_type type = mte_node_type(mas->node);
|
||||
unsigned long pivot, min, gap = 0;
|
||||
unsigned char offset;
|
||||
unsigned long *gaps;
|
||||
unsigned long *pivots = ma_pivots(mas_mn(mas), type);
|
||||
void __rcu **slots = ma_slots(mas_mn(mas), type);
|
||||
unsigned char offset, data_end;
|
||||
unsigned long *gaps, *pivots;
|
||||
void __rcu **slots;
|
||||
struct maple_node *node;
|
||||
bool found = false;
|
||||
|
||||
if (ma_is_dense(type)) {
|
||||
@ -5069,13 +5065,15 @@ static inline bool mas_anode_descend(struct ma_state *mas, unsigned long size)
|
||||
return true;
|
||||
}
|
||||
|
||||
gaps = ma_gaps(mte_to_node(mas->node), type);
|
||||
node = mas_mn(mas);
|
||||
pivots = ma_pivots(node, type);
|
||||
slots = ma_slots(node, type);
|
||||
gaps = ma_gaps(node, type);
|
||||
offset = mas->offset;
|
||||
min = mas_safe_min(mas, pivots, offset);
|
||||
for (; offset < mt_slots[type]; offset++) {
|
||||
pivot = mas_safe_pivot(mas, pivots, offset, type);
|
||||
if (offset && !pivot)
|
||||
break;
|
||||
data_end = ma_data_end(node, type, pivots, mas->max);
|
||||
for (; offset <= data_end; offset++) {
|
||||
pivot = mas_logical_pivot(mas, pivots, offset, type);
|
||||
|
||||
/* Not within lower bounds */
|
||||
if (mas->index > pivot)
|
||||
@ -5310,6 +5308,9 @@ int mas_empty_area(struct ma_state *mas, unsigned long min,
|
||||
unsigned long *pivots;
|
||||
enum maple_type mt;
|
||||
|
||||
if (min >= max)
|
||||
return -EINVAL;
|
||||
|
||||
if (mas_is_start(mas))
|
||||
mas_start(mas);
|
||||
else if (mas->offset >= 2)
|
||||
@ -5364,6 +5365,9 @@ int mas_empty_area_rev(struct ma_state *mas, unsigned long min,
|
||||
{
|
||||
struct maple_enode *last = mas->node;
|
||||
|
||||
if (min >= max)
|
||||
return -EINVAL;
|
||||
|
||||
if (mas_is_start(mas)) {
|
||||
mas_start(mas);
|
||||
mas->offset = mas_data_end(mas);
|
||||
@ -5383,7 +5387,7 @@ int mas_empty_area_rev(struct ma_state *mas, unsigned long min,
|
||||
mas->index = min;
|
||||
mas->last = max;
|
||||
|
||||
while (!mas_rev_awalk(mas, size)) {
|
||||
while (!mas_rev_awalk(mas, size, &min, &max)) {
|
||||
if (last == mas->node) {
|
||||
if (!mas_rewind_node(mas))
|
||||
return -EBUSY;
|
||||
@ -5398,17 +5402,9 @@ int mas_empty_area_rev(struct ma_state *mas, unsigned long min,
|
||||
if (unlikely(mas->offset == MAPLE_NODE_SLOTS))
|
||||
return -EBUSY;
|
||||
|
||||
/*
|
||||
* mas_rev_awalk() has set mas->min and mas->max to the gap values. If
|
||||
* the maximum is outside the window we are searching, then use the last
|
||||
* location in the search.
|
||||
* mas->max and mas->min is the range of the gap.
|
||||
* mas->index and mas->last are currently set to the search range.
|
||||
*/
|
||||
|
||||
/* Trim the upper limit to the max. */
|
||||
if (mas->max <= mas->last)
|
||||
mas->last = mas->max;
|
||||
if (max <= mas->last)
|
||||
mas->last = max;
|
||||
|
||||
mas->index = mas->last - size + 1;
|
||||
return 0;
|
||||
|
@ -847,7 +847,7 @@ int main(int argc, char **argv)
|
||||
if (cull & CULL_PID || filter & FILTER_PID)
|
||||
fprintf(fout, ", PID %d", list[i].pid);
|
||||
if (cull & CULL_TGID || filter & FILTER_TGID)
|
||||
fprintf(fout, ", TGID %d", list[i].pid);
|
||||
fprintf(fout, ", TGID %d", list[i].tgid);
|
||||
if (cull & CULL_COMM || filter & FILTER_COMM)
|
||||
fprintf(fout, ", task_comm_name: %s", list[i].comm);
|
||||
if (cull & CULL_ALLOCATOR) {
|
||||
|
Loading…
Reference in New Issue
Block a user