- if (set_file_size && (set_file_size != (off_t) va.va_data_alloc))
- {
- off_t bytesallocated = 0;
- u_int32_t alloc_flags = PREALLOCATE | ALLOCATEFROMPEOF | ALLOCATEALL;
-
- vnode_lock_spin(ref->vp);
- CLR(ref->vp->v_flag, VSWAP);
- vnode_unlock(ref->vp);
-
- error = VNOP_ALLOCATE(ref->vp, set_file_size, alloc_flags,
- &bytesallocated, 0 /*fst_offset*/,
- ref->ctx);
- // F_SETSIZE:
- if (!error) error = vnode_setsize(ref->vp, set_file_size, IO_NOZEROFILL, ref->ctx);
- kprintf("vnode_setsize(%d) %qd\n", error, set_file_size);
- ref->filelength = bytesallocated;
-
- vnode_lock_spin(ref->vp);
- SET(ref->vp->v_flag, VSWAP);
- vnode_unlock(ref->vp);
- }
+ if (set_file_size)
+ {
+ if (fs_free_size)
+ {
+ mpFree += va.va_data_alloc;
+ if ((mpFree < set_file_size) || ((mpFree - set_file_size) < fs_free_size))
+ {
+ error = ENOSPC;
+ goto out;
+ }
+ }
+ error = vnode_setsize(ref->vp, set_file_size, IO_NOZEROFILL | IO_NOAUTH, ref->ctx);
+ if (error) goto out;
+ ref->filelength = set_file_size;
+ }