aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/md
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/md')
-rw-r--r--sys/dev/md/md.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index 4cc0c1d319d1..f25a34c21114 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -296,18 +296,17 @@ s_read(struct indir *ip, off_t offset)
/*
* Write a given sector, prune the tree if the value is 0
- * If the new value is different from the old, return the old value.
*/
static int
-s_write(struct indir *ip, off_t offset, uintptr_t ptr, uintptr_t *old)
+s_write(struct indir *ip, off_t offset, uintptr_t ptr)
{
struct indir *cip, *lip[10];
int idx, li;
uintptr_t up;
if (md_debug > 1)
- printf("s_write(%lld, %p, %p)\n", offset, (void *)ptr, old);
+ printf("s_write(%lld, %p)\n", offset, (void *)ptr);
up = 0;
li = 0;
cip = ip;
@@ -333,8 +332,6 @@ s_write(struct indir *ip, off_t offset, uintptr_t ptr, uintptr_t *old)
/* leafnode */
idx = offset & NMASK;
up = cip->array[idx];
- if (old != NULL && up != ptr)
- *old = up;
if (up != 0)
cip->used--;
cip->array[idx] = ptr;
@@ -415,18 +412,19 @@ mdstart_malloc(struct md_s *sc, struct bio *bp)
dst = bp->bio_data;
error = 0;
while (nsec--) {
- osp = 0;
+ osp = s_read(sc->indir, secno);
if (bp->bio_cmd == BIO_DELETE) {
- error = s_write(sc->indir, secno, 0, &osp);
+ if (osp != 0)
+ error = s_write(sc->indir, secno, 0);
} else if (bp->bio_cmd == BIO_READ) {
- sp = s_read(sc->indir, secno);
- if (sp == 0)
+ if (osp == 0)
bzero(dst, sc->secsize);
- else if (sp <= 255)
+ else if (osp <= 255)
for (i = 0; i < sc->secsize; i++)
- dst[i] = sp;
+ dst[i] = osp;
else
- bcopy((void *)sp, dst, sc->secsize);
+ bcopy((void *)osp, dst, sc->secsize);
+ osp = 0;
} else if (bp->bio_cmd == BIO_WRITE) {
if (sc->flags & MD_COMPRESS) {
uc = dst[0];
@@ -438,18 +436,20 @@ mdstart_malloc(struct md_s *sc, struct bio *bp)
uc = 0;
}
if (i == sc->secsize) {
- error = s_write(sc->indir, secno, uc, &osp);
+ if (osp != uc)
+ error = s_write(sc->indir, secno, uc);
} else {
- sp = s_read(sc->indir, secno);
- if (sp <= 255)
+ if (osp <= 255) {
sp = (uintptr_t) uma_zalloc(
sc->uma, M_NOWAIT);
- if (sp == 0) {
- error = ENOMEM;
+ if (sp == 0) {
+ error = ENOSPC;
+ break;
+ }
+ error = s_write(sc->indir, secno, sp);
} else {
- bcopy(dst, (void *)sp, sc->secsize);
- error = s_write(sc->indir, secno,
- sp, &osp);
+ bcopy(dst, (void *)osp, sc->secsize);
+ osp = 0;
}
}
} else {
@@ -726,7 +726,7 @@ mdcreate_malloc(struct md_ioctl *mdio)
for (u = 0; u < sc->nsect; u++) {
sp = (uintptr_t) uma_zalloc(sc->uma, M_NOWAIT | M_ZERO);
if (sp != 0)
- error = s_write(sc->indir, u, sp, NULL);
+ error = s_write(sc->indir, u, sp);
else
error = ENOMEM;
if (error)