struct btrfs_stripe_hash table[];
};
+/*
+ * The PFN may still be valid, but our paddrs should always be block size
+ * aligned, thus such -1 paddr is definitely not a valid one.
+ */
+#define INVALID_PADDR (~(phys_addr_t)0)
+
/*
* A structure to present a sector inside a page, the length is fixed to
* sectorsize;
/*
* Blocks from the bio list can still be highmem.
* So here we use physical address to present a page and the offset inside it.
+ *
+ * If it's INVALID_PADDR then it's not set.
*/
phys_addr_t paddr;
- bool has_paddr;
bool uptodate;
};
for (i = 0; i < rbio->nr_sectors; i++) {
/* Some range not covered by bio (partial write), skip it */
- if (!rbio->bio_sectors[i].has_paddr) {
+ if (rbio->bio_sectors[i].paddr == INVALID_PADDR) {
/*
* Even if the sector is not covered by bio, if it is
* a data sector it should still be uptodate as it is
if (!rbio->stripe_pages[page_index])
continue;
- rbio->stripe_sectors[i].has_paddr = true;
rbio->stripe_sectors[i].paddr =
page_to_phys(rbio->stripe_pages[page_index]) +
offset_in_page(offset);
spin_lock(&rbio->bio_list_lock);
sector = &rbio->bio_sectors[index];
- if (sector->has_paddr || bio_list_only) {
+ if (sector->paddr != INVALID_PADDR || bio_list_only) {
/* Don't return sector without a valid page pointer */
- if (!sector->has_paddr)
+ if (sector->paddr == INVALID_PADDR)
sector = NULL;
spin_unlock(&rbio->bio_list_lock);
return sector;
kfree(rbio);
return ERR_PTR(-ENOMEM);
}
+ for (int i = 0; i < num_sectors; i++) {
+ rbio->stripe_sectors[i].paddr = INVALID_PADDR;
+ rbio->bio_sectors[i].paddr = INVALID_PADDR;
+ }
bio_list_init(&rbio->bio_list);
init_waitqueue_head(&rbio->io_wait);
rbio, stripe_nr);
ASSERT_RBIO_SECTOR(sector_nr >= 0 && sector_nr < rbio->stripe_nsectors,
rbio, sector_nr);
- ASSERT(sector->has_paddr);
+ ASSERT(sector->paddr != INVALID_PADDR);
stripe = &rbio->bioc->stripes[stripe_nr];
disk_start = stripe->physical + sector_nr * sectorsize;
unsigned int index = (offset >> sectorsize_bits);
struct sector_ptr *sector = &rbio->bio_sectors[index];
- sector->has_paddr = true;
sector->paddr = paddr;
offset += sectorsize;
}
static inline void *kmap_local_sector(const struct sector_ptr *sector)
{
/* The sector pointer must have a page mapped to it. */
- ASSERT(sector->has_paddr);
+ ASSERT(sector->paddr != INVALID_PADDR);
return kmap_local_page(phys_to_page(sector->paddr)) +
offset_in_page(sector->paddr);
for (i = 0; i < rbio->nr_sectors; i++) {
struct sector_ptr *sector = &rbio->stripe_sectors[i];
- if (sector->has_paddr && sector->paddr == paddr)
+ if (sector->paddr == paddr)
return sector;
}
return NULL;
for (i = 0; i < rbio->nr_sectors; i++) {
if (rbio->stripe_sectors[i].paddr == bvec_paddr)
break;
- if (rbio->bio_sectors[i].has_paddr &&
- rbio->bio_sectors[i].paddr == bvec_paddr)
+ if (rbio->bio_sectors[i].paddr == bvec_paddr)
break;
}
ASSERT(i < rbio->nr_sectors);
* thus this rbio can not be cached one, as cached one must
* have all its data sectors present and uptodate.
*/
- if (!sector->has_paddr || !sector->uptodate)
+ if (sector->paddr == INVALID_PADDR || !sector->uptodate)
return true;
}
return false;
int sectornr;
bool has_qstripe;
struct page *page;
- struct sector_ptr p_sector = { 0 };
- struct sector_ptr q_sector = { 0 };
+ struct sector_ptr p_sector = { .paddr = INVALID_PADDR };
+ struct sector_ptr q_sector = { .paddr = INVALID_PADDR };
struct bio_list bio_list;
int is_replace = 0;
int ret;
page = alloc_page(GFP_NOFS);
if (!page)
return -ENOMEM;
- p_sector.has_paddr = true;
p_sector.paddr = page_to_phys(page);
p_sector.uptodate = 1;
page = NULL;
page = alloc_page(GFP_NOFS);
if (!page) {
__free_page(phys_to_page(p_sector.paddr));
- p_sector.has_paddr = false;
+ p_sector.paddr = INVALID_PADDR;
return -ENOMEM;
}
- q_sector.has_paddr = true;
q_sector.paddr = page_to_phys(page);
q_sector.uptodate = 1;
page = NULL;
kunmap_local(pointers[nr_data]);
__free_page(phys_to_page(p_sector.paddr));
- p_sector.has_paddr = false;
- if (q_sector.has_paddr) {
+ p_sector.paddr = INVALID_PADDR;
+ if (q_sector.paddr != INVALID_PADDR) {
__free_page(phys_to_page(q_sector.paddr));
- q_sector.has_paddr = false;
+ q_sector.paddr = INVALID_PADDR;
}
/*