diff --git a/sys/fs/nandfs/bmap.c b/sys/fs/nandfs/bmap.c index 4cc4cb008fb0..cd46d10ec256 100644 --- a/sys/fs/nandfs/bmap.c +++ b/sys/fs/nandfs/bmap.c @@ -387,11 +387,10 @@ bmap_truncate_indirect(struct nandfs_node *node, int level, nandfs_lbn_t *left, if (modified) bcopy(copy, bp->b_data, fsdev->nd_blocksize); - error = nandfs_dirty_buf_meta(bp, 0); - if (error) - return (error); + /* Force success even if we can't dirty the buffer metadata when freeing space */ + nandfs_dirty_buf_meta(bp, 1); - return (error); + return (0); } int diff --git a/sys/fs/nandfs/nandfs.h b/sys/fs/nandfs/nandfs.h index beb4e1639141..2c093bebff97 100644 --- a/sys/fs/nandfs/nandfs.h +++ b/sys/fs/nandfs/nandfs.h @@ -200,6 +200,8 @@ struct nandfs_device { uint32_t nd_devblocksize; + uint32_t nd_segs_reserved; + /* Segment usage */ uint64_t nd_clean_segs; uint64_t *nd_free_base; diff --git a/sys/fs/nandfs/nandfs_subr.c b/sys/fs/nandfs/nandfs_subr.c index 961a0a81412e..5ed31e705aa1 100644 --- a/sys/fs/nandfs/nandfs_subr.c +++ b/sys/fs/nandfs/nandfs_subr.c @@ -910,7 +910,7 @@ nandfs_fs_full(struct nandfs_device *nffsdev) DPRINTF(BUF, ("%s: bufs:%jx space:%jx\n", __func__, (uintmax_t)nffsdev->nd_dirty_bufs, (uintmax_t)space)); - if (nffsdev->nd_dirty_bufs + (10 * bps) >= space) + if (nffsdev->nd_dirty_bufs + (nffsdev->nd_segs_reserved * bps) >= space) return (1); return (0); diff --git a/sys/fs/nandfs/nandfs_vfsops.c b/sys/fs/nandfs/nandfs_vfsops.c index fd9b0c9721de..33b7564e1a45 100644 --- a/sys/fs/nandfs/nandfs_vfsops.c +++ b/sys/fs/nandfs/nandfs_vfsops.c @@ -718,15 +718,24 @@ nandfs_mount_base(struct nandfs_device *nandfsdev, struct mount *mp, nandfsdev->nd_ts.tv_sec = nandfsdev->nd_last_segsum.ss_create; nandfsdev->nd_last_cno = nandfsdev->nd_super.s_last_cno; nandfsdev->nd_fakevblk = 1; + /* + * FIXME: bogus calculation. Should use actual number of usable segments + * instead of total amount. + */ + nandfsdev->nd_segs_reserved = + nandfsdev->nd_fsdata.f_nsegments * + nandfsdev->nd_fsdata.f_r_segments_percentage / 100; nandfsdev->nd_last_ino = NANDFS_USER_INO; DPRINTF(VOLUMES, ("%s: last_pseg %#jx last_cno %#jx last_seq %#jx\n" - "fsdev: last_seg: seq %#jx num %#jx, next_seg_num %#jx\n", + "fsdev: last_seg: seq %#jx num %#jx, next_seg_num %#jx " + "segs_reserved %#jx\n", __func__, (uintmax_t)nandfsdev->nd_last_pseg, (uintmax_t)nandfsdev->nd_last_cno, (uintmax_t)nandfsdev->nd_seg_sequence, (uintmax_t)nandfsdev->nd_seg_sequence, (uintmax_t)nandfsdev->nd_seg_num, - (uintmax_t)nandfsdev->nd_next_seg_num)); + (uintmax_t)nandfsdev->nd_next_seg_num, + (uintmax_t)nandfsdev->nd_segs_reserved)); DPRINTF(VOLUMES, ("nandfs_mount: accepted super root\n"));