pnfsblock: cleanup bl_mark_sectors_init
It does not need to manipulate on partial initialized blocks. Writeback code takes care of it. Signed-off-by: Peng Tao <peng_tao@emc.com> Signed-off-by: Benny Halevy <bhalevy@tonian.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
74a6eeb44c
commit
60c52e3a72
3 changed files with 8 additions and 77 deletions
|
@ -577,8 +577,7 @@ fill_invalid_ext:
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
|
|
||||||
ret = bl_mark_sectors_init(be->be_inval, isect,
|
ret = bl_mark_sectors_init(be->be_inval, isect,
|
||||||
PAGE_CACHE_SECTORS,
|
PAGE_CACHE_SECTORS);
|
||||||
NULL);
|
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
dprintk("%s bl_mark_sectors_init fail %d\n",
|
dprintk("%s bl_mark_sectors_init fail %d\n",
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
|
@ -627,8 +626,7 @@ next_page:
|
||||||
}
|
}
|
||||||
if (be->be_state == PNFS_BLOCK_INVALID_DATA) {
|
if (be->be_state == PNFS_BLOCK_INVALID_DATA) {
|
||||||
ret = bl_mark_sectors_init(be->be_inval, isect,
|
ret = bl_mark_sectors_init(be->be_inval, isect,
|
||||||
PAGE_CACHE_SECTORS,
|
PAGE_CACHE_SECTORS);
|
||||||
NULL);
|
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
dprintk("%s bl_mark_sectors_init fail %d\n",
|
dprintk("%s bl_mark_sectors_init fail %d\n",
|
||||||
__func__, ret);
|
__func__, ret);
|
||||||
|
|
|
@ -186,8 +186,7 @@ struct pnfs_block_extent *
|
||||||
bl_find_get_extent(struct pnfs_block_layout *bl, sector_t isect,
|
bl_find_get_extent(struct pnfs_block_layout *bl, sector_t isect,
|
||||||
struct pnfs_block_extent **cow_read);
|
struct pnfs_block_extent **cow_read);
|
||||||
int bl_mark_sectors_init(struct pnfs_inval_markings *marks,
|
int bl_mark_sectors_init(struct pnfs_inval_markings *marks,
|
||||||
sector_t offset, sector_t length,
|
sector_t offset, sector_t length);
|
||||||
sector_t **pages);
|
|
||||||
void bl_put_extent(struct pnfs_block_extent *be);
|
void bl_put_extent(struct pnfs_block_extent *be);
|
||||||
struct pnfs_block_extent *bl_alloc_extent(void);
|
struct pnfs_block_extent *bl_alloc_extent(void);
|
||||||
int bl_is_sector_init(struct pnfs_inval_markings *marks, sector_t isect);
|
int bl_is_sector_init(struct pnfs_inval_markings *marks, sector_t isect);
|
||||||
|
|
|
@ -174,33 +174,6 @@ static int _preload_range(struct pnfs_inval_markings *marks,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_needs_init(sector_t *array, sector_t offset)
|
|
||||||
{
|
|
||||||
sector_t *p = array;
|
|
||||||
|
|
||||||
dprintk("%s enter\n", __func__);
|
|
||||||
if (!p)
|
|
||||||
return;
|
|
||||||
while (*p < offset)
|
|
||||||
p++;
|
|
||||||
if (*p == offset)
|
|
||||||
return;
|
|
||||||
else if (*p == ~0) {
|
|
||||||
*p++ = offset;
|
|
||||||
*p = ~0;
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
sector_t *save = p;
|
|
||||||
dprintk("%s Adding %llu\n", __func__, (u64)offset);
|
|
||||||
while (*p != ~0)
|
|
||||||
p++;
|
|
||||||
p++;
|
|
||||||
memmove(save + 1, save, (char *)p - (char *)save);
|
|
||||||
*save = offset;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We are relying on page lock to serialize this */
|
/* We are relying on page lock to serialize this */
|
||||||
int bl_is_sector_init(struct pnfs_inval_markings *marks, sector_t isect)
|
int bl_is_sector_init(struct pnfs_inval_markings *marks, sector_t isect)
|
||||||
{
|
{
|
||||||
|
@ -256,28 +229,15 @@ static int is_range_written(struct pnfs_inval_markings *marks,
|
||||||
|
|
||||||
/* Marks sectors in [offest, offset_length) as having been initialized.
|
/* Marks sectors in [offest, offset_length) as having been initialized.
|
||||||
* All lengths are step-aligned, where step is min(pagesize, blocksize).
|
* All lengths are step-aligned, where step is min(pagesize, blocksize).
|
||||||
* Notes where partial block is initialized, and helps prepare it for
|
* Currently assumes offset is page-aligned
|
||||||
* complete initialization later.
|
|
||||||
*/
|
*/
|
||||||
/* Currently assumes offset is page-aligned */
|
|
||||||
int bl_mark_sectors_init(struct pnfs_inval_markings *marks,
|
int bl_mark_sectors_init(struct pnfs_inval_markings *marks,
|
||||||
sector_t offset, sector_t length,
|
sector_t offset, sector_t length)
|
||||||
sector_t **pages)
|
|
||||||
{
|
{
|
||||||
sector_t s, start, end;
|
sector_t start, end;
|
||||||
sector_t *array = NULL; /* Pages to mark */
|
|
||||||
|
|
||||||
dprintk("%s(offset=%llu,len=%llu) enter\n",
|
dprintk("%s(offset=%llu,len=%llu) enter\n",
|
||||||
__func__, (u64)offset, (u64)length);
|
__func__, (u64)offset, (u64)length);
|
||||||
s = max((sector_t) 3,
|
|
||||||
2 * (marks->im_block_size / (PAGE_CACHE_SECTORS)));
|
|
||||||
dprintk("%s set max=%llu\n", __func__, (u64)s);
|
|
||||||
if (pages) {
|
|
||||||
array = kmalloc(s * sizeof(sector_t), GFP_NOFS);
|
|
||||||
if (!array)
|
|
||||||
goto outerr;
|
|
||||||
array[0] = ~0;
|
|
||||||
}
|
|
||||||
|
|
||||||
start = normalize(offset, marks->im_block_size);
|
start = normalize(offset, marks->im_block_size);
|
||||||
end = normalize_up(offset + length, marks->im_block_size);
|
end = normalize_up(offset + length, marks->im_block_size);
|
||||||
|
@ -285,41 +245,15 @@ int bl_mark_sectors_init(struct pnfs_inval_markings *marks,
|
||||||
goto outerr;
|
goto outerr;
|
||||||
|
|
||||||
spin_lock(&marks->im_lock);
|
spin_lock(&marks->im_lock);
|
||||||
|
|
||||||
for (s = normalize_up(start, PAGE_CACHE_SECTORS);
|
|
||||||
s < offset; s += PAGE_CACHE_SECTORS) {
|
|
||||||
dprintk("%s pre-area pages\n", __func__);
|
|
||||||
/* Portion of used block is not initialized */
|
|
||||||
if (!_has_tag(&marks->im_tree, s, EXTENT_INITIALIZED))
|
|
||||||
set_needs_init(array, s);
|
|
||||||
}
|
|
||||||
if (_set_range(&marks->im_tree, EXTENT_INITIALIZED, offset, length))
|
if (_set_range(&marks->im_tree, EXTENT_INITIALIZED, offset, length))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
for (s = normalize_up(offset + length, PAGE_CACHE_SECTORS);
|
|
||||||
s < end; s += PAGE_CACHE_SECTORS) {
|
|
||||||
dprintk("%s post-area pages\n", __func__);
|
|
||||||
if (!_has_tag(&marks->im_tree, s, EXTENT_INITIALIZED))
|
|
||||||
set_needs_init(array, s);
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_unlock(&marks->im_lock);
|
spin_unlock(&marks->im_lock);
|
||||||
|
|
||||||
if (pages) {
|
|
||||||
if (array[0] == ~0) {
|
|
||||||
kfree(array);
|
|
||||||
*pages = NULL;
|
|
||||||
} else
|
|
||||||
*pages = array;
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
spin_unlock(&marks->im_lock);
|
spin_unlock(&marks->im_lock);
|
||||||
outerr:
|
outerr:
|
||||||
if (pages) {
|
|
||||||
kfree(array);
|
|
||||||
*pages = NULL;
|
|
||||||
}
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue