Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F108692176
D28833.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
18 KB
Referenced Files
None
Subscribers
None
D28833.diff
View Options
Index: lib/libc/sys/fspacectl.2
===================================================================
--- lib/libc/sys/fspacectl.2
+++ lib/libc/sys/fspacectl.2
@@ -64,6 +64,16 @@
.Fa cmd
argument may be one of:
.Bl -tag -width SPACECTL_DEALLOC
+.It Dv SPACECTL_ALLOC
+Back a region in the file specified by the
+.Fa range
+argument within the file system space.
+Subsequent operations in the region will not fail due to lack of free space in
+the file system.
+This operation is used to implement
+.Xr posix_fallocate 2 .
+Content will remain the same for a non-hole region.
+Holes will be converted to non-hole region with zeroes.
.It Dv SPACECTL_DEALLOC
Zero a region in the file specified by the
.Fa range
@@ -80,7 +90,18 @@
.Pp
The
.Fa flags
-argument needs to be the value 0 currently.
+argument may include one or more of the following:
+.Bl -tag -width SPACECTL_F_CANEXTEND
+.It Dv SPACECTL_F_CANEXTEND
+The operation can extend the file size if
+.Fa range->r_offset
++
+.Fa range->r_len
+is greater than the current file size.
+This flag is supported by the
+.Dv SPACECTL_ALLOC
+operation.
+.El
.Pp
The call does not return partial success if a signal is caught during execution.
.Sh RETURN VALUES
Index: share/man/man9/VOP_ALLOCATE.9
===================================================================
--- share/man/man9/VOP_ALLOCATE.9
+++ share/man/man9/VOP_ALLOCATE.9
@@ -37,7 +37,7 @@
.In sys/param.h
.In sys/vnode.h
.Ft int
-.Fn VOP_ALLOCATE "struct vnode *vp" "off_t *offset" "off_t *len"
+.Fn VOP_ALLOCATE "struct vnode *vp" "off_t *offset" "off_t *len" "int flags" "struct ucred *cred"
.Sh DESCRIPTION
This call allocates storage for a range of offsets in a file.
It is used to implement the
@@ -52,6 +52,8 @@
The start of the range to allocate storage for in the file.
.It Fa len
The length of the range to allocate storage for in the file.
+.It Fa flags
+The parameter to control the behavior of this call.
.El
.Pp
The
Index: sys/fs/nfsclient/nfs_clvnops.c
===================================================================
--- sys/fs/nfsclient/nfs_clvnops.c
+++ sys/fs/nfsclient/nfs_clvnops.c
@@ -3614,6 +3614,12 @@
struct nfsmount *nmp;
int attrflag, error, ret;
+ if ((ap->a_flags & SPACECTL_F_CANEXTEND) == 0)
+ *ap->a_len = omin(
+ *ap->a_len, VTONFS(vp)->n_size - *ap->a_offset);
+ if (*ap->a_len == 0)
+ return (0);
+
attrflag = 0;
nmp = VFSTONFS(vp->v_mount);
mtx_lock(&nmp->nm_mtx);
@@ -3627,7 +3633,7 @@
error = ncl_flush(vp, MNT_WAIT, td, 1, 0);
if (error == 0)
error = nfsrpc_allocate(vp, *ap->a_offset, *ap->a_len,
- &nfsva, &attrflag, td->td_ucred, td, NULL);
+ &nfsva, &attrflag, ap->a_cred, td, NULL);
if (error == 0) {
*ap->a_offset += *ap->a_len;
*ap->a_len = 0;
Index: sys/fs/nfsserver/nfs_nfsdport.c
===================================================================
--- sys/fs/nfsserver/nfs_nfsdport.c
+++ sys/fs/nfsserver/nfs_nfsdport.c
@@ -6335,7 +6335,8 @@
*/
trycnt = 0;
while (error == 0 && len > 0 && trycnt++ < 20)
- error = VOP_ALLOCATE(vp, &off, &len);
+ error = VOP_ALLOCATE(vp, &off, &len, SPACECTL_F_CANEXTEND,
+ cred);
if (error == 0 && len > 0)
error = NFSERR_IO;
NFSEXITCODE(error);
Index: sys/kern/sys_generic.c
===================================================================
--- sys/kern/sys_generic.c
+++ sys/kern/sys_generic.c
@@ -855,8 +855,9 @@
goto out;
}
- error = fo_fallocate(fp, offset, len, td);
- out:
+ error = fo_fspacectl(fp, SPACECTL_ALLOC, offset, len,
+ SPACECTL_F_CANEXTEND, td->td_ucred, td);
+out:
fdrop(fp, td);
return (error);
}
@@ -889,7 +890,7 @@
AUDIT_ARG_CMD(cmd);
AUDIT_ARG_FFLAGS(flags);
- if (cmd != SPACECTL_DEALLOC ||
+ if ((cmd != SPACECTL_ALLOC && cmd != SPACECTL_DEALLOC) ||
range->r_offset < 0 || range->r_len < 0 ||
(flags & ~SPACECTL_F_SUPPORTED) != 0)
return (EINVAL);
Index: sys/kern/uipc_shm.c
===================================================================
--- sys/kern/uipc_shm.c
+++ sys/kern/uipc_shm.c
@@ -145,7 +145,6 @@
static fo_mmap_t shm_mmap;
static fo_get_seals_t shm_get_seals;
static fo_add_seals_t shm_add_seals;
-static fo_fallocate_t shm_fallocate;
static fo_fspacectl_t shm_fspacectl;
/* File descriptor operations. */
@@ -166,7 +165,6 @@
.fo_mmap = shm_mmap,
.fo_get_seals = shm_get_seals,
.fo_add_seals = shm_add_seals,
- .fo_fallocate = shm_fallocate,
.fo_fspacectl = shm_fspacectl,
.fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE,
};
@@ -1932,9 +1930,9 @@
shmfd = fp->f_data;
size = offset + len;
- if (cmd != SPACECTL_DEALLOC)
+ if (cmd != SPACECTL_ALLOC && cmd != SPACECTL_DEALLOC)
return (EINVAL);
- if (offset < 0 || len < 0 || flags != 0)
+ if (offset < 0 || len < 0 || (flags & ~SPACECTL_F_SUPPORTED) != 0)
return (EINVAL);
if (len == 0)
/* Degenerated case */
@@ -1952,6 +1950,17 @@
rl_cookie = rangelock_wlock(&shmfd->shm_rl, offset, size,
&shmfd->shm_mtx);
switch (cmd) {
+ case SPACECTL_ALLOC:
+ if (size > shmfd->shm_size && flags & SPACECTL_F_CANEXTEND) {
+ error = shm_dotruncate_cookie(shmfd, size, rl_cookie);
+ /*
+ * Translate to posix_fallocate(2) return value as
+ * needed.
+ */
+ if (error == ENOMEM)
+ error = ENOSPC;
+ }
+ break;
case SPACECTL_DEALLOC:
error = shm_deallocate(shmfd, offset, len, flags, rl_cookie, td);
break;
@@ -1962,40 +1971,6 @@
return (error);
}
-
-static int
-shm_fallocate(struct file *fp, off_t offset, off_t len, struct thread *td)
-{
- void *rl_cookie;
- struct shmfd *shmfd;
- size_t size;
- int error;
-
- /* This assumes that the caller already checked for overflow. */
- error = 0;
- shmfd = fp->f_data;
- size = offset + len;
-
- /*
- * Just grab the rangelock for the range that we may be attempting to
- * grow, rather than blocking read/write for regions we won't be
- * touching while this (potential) resize is in progress. Other
- * attempts to resize the shmfd will have to take a write lock from 0 to
- * OFF_MAX, so this being potentially beyond the current usable range of
- * the shmfd is not necessarily a concern. If other mechanisms are
- * added to grow a shmfd, this may need to be re-evaluated.
- */
- rl_cookie = rangelock_wlock(&shmfd->shm_rl, offset, size,
- &shmfd->shm_mtx);
- if (size > shmfd->shm_size)
- error = shm_dotruncate_cookie(shmfd, size, rl_cookie);
- rangelock_unlock(&shmfd->shm_rl, rl_cookie, &shmfd->shm_mtx);
- /* Translate to posix_fallocate(2) return value as needed. */
- if (error == ENOMEM)
- error = ENOSPC;
- return (error);
-}
-
static int
sysctl_posix_shm_list(SYSCTL_HANDLER_ARGS)
{
Index: sys/kern/vfs_default.c
===================================================================
--- sys/kern/vfs_default.c
+++ sys/kern/vfs_default.c
@@ -953,6 +953,7 @@
uint8_t *buf;
struct thread *td;
struct vnode *vp;
+ struct ucred *cred;
size_t iosize;
int error;
@@ -963,8 +964,9 @@
vp = ap->a_vp;
len = *ap->a_len;
offset = *ap->a_offset;
+ cred = ap->a_cred;
- error = VOP_GETATTR(vp, vap, td->td_ucred);
+ error = VOP_GETATTR(vp, vap, cred);
if (error != 0)
goto out;
fsize = vap->va_size;
@@ -988,29 +990,36 @@
if (error != 0)
goto out;
if (maxfilesize) {
- if (offset > maxfilesize || len > maxfilesize ||
- offset + len > maxfilesize) {
+ if ((offset > maxfilesize || len > maxfilesize ||
+ offset + len > maxfilesize) &&
+ (ap->a_flags & SPACECTL_F_CANEXTEND) == 0) {
error = EFBIG;
goto out;
}
} else
#endif
- if (offset + len > vap->va_size) {
+ if ((u_quad_t)offset + len > vap->va_size &&
+ ap->a_flags & SPACECTL_F_CANEXTEND) {
/*
* Test offset + len against the filesystem's maxfilesize.
*/
VATTR_NULL(vap);
vap->va_size = offset + len;
- error = VOP_SETATTR(vp, vap, td->td_ucred);
+ error = VOP_SETATTR(vp, vap, cred);
if (error != 0)
goto out;
VATTR_NULL(vap);
vap->va_size = fsize;
- error = VOP_SETATTR(vp, vap, td->td_ucred);
+ error = VOP_SETATTR(vp, vap, cred);
if (error != 0)
goto out;
}
+ if ((ap->a_flags & SPACECTL_F_CANEXTEND) == 0)
+ len = omin(len, vap->va_size - offset);
+ if (len == 0)
+ goto out;
+
for (;;) {
/*
* Read and write back anything below the nominal file
@@ -1032,7 +1041,7 @@
auio.uio_segflg = UIO_SYSSPACE;
auio.uio_rw = UIO_READ;
auio.uio_td = td;
- error = VOP_READ(vp, &auio, 0, td->td_ucred);
+ error = VOP_READ(vp, &auio, 0, cred);
if (error != 0)
break;
if (auio.uio_resid > 0) {
@@ -1053,7 +1062,7 @@
auio.uio_rw = UIO_WRITE;
auio.uio_td = td;
- error = VOP_WRITE(vp, &auio, 0, td->td_ucred);
+ error = VOP_WRITE(vp, &auio, 0, cred);
if (error != 0)
break;
Index: sys/kern/vfs_vnops.c
===================================================================
--- sys/kern/vfs_vnops.c
+++ sys/kern/vfs_vnops.c
@@ -105,7 +105,6 @@
static fo_stat_t vn_statfile;
static fo_close_t vn_closefile;
static fo_mmap_t vn_mmap;
-static fo_fallocate_t vn_fallocate;
static fo_fspacectl_t vn_fspacectl;
struct fileops vnops = {
@@ -123,7 +122,6 @@
.fo_seek = vn_seek,
.fo_fill_kinfo = vn_fill_kinfo,
.fo_mmap = vn_mmap,
- .fo_fallocate = vn_fallocate,
.fo_fspacectl = vn_fspacectl,
.fo_flags = DFLAG_PASSABLE | DFLAG_SEEKABLE
};
@@ -3313,7 +3311,8 @@
}
static int
-vn_fallocate(struct file *fp, off_t offset, off_t len, struct thread *td)
+vn_fallocate(struct file *fp, off_t offset, off_t len, int flags,
+ struct ucred *active_cred, struct thread *td)
{
struct mount *mp;
struct vnode *vp;
@@ -3324,9 +3323,15 @@
#endif
vp = fp->f_vnode;
+ error = 0;
+
+ if (offset < 0 || len <= 0 || (flags & ~SPACECTL_F_SUPPORTED) != 0)
+ return (EINVAL);
if (vp->v_type != VREG)
return (ENODEV);
+ len = omin(len, OFF_MAX - offset);
+
/* Allocating blocks may take a long time, so iterate. */
for (;;) {
olen = len;
@@ -3349,17 +3354,14 @@
}
#endif
#ifdef MAC
- error = mac_vnode_check_write(td->td_ucred, fp->f_cred, vp);
+ error = mac_vnode_check_write(active_cred, fp->f_cred, vp);
if (error == 0)
#endif
- error = VOP_ALLOCATE(vp, &offset, &len);
+ error = VOP_ALLOCATE(vp, &offset, &len, flags,
+ active_cred);
VOP_UNLOCK(vp);
vn_finished_write(mp);
- if (olen + ooffset != offset + len) {
- panic("offset + len changed from %jx/%jx to %jx/%jx",
- ooffset, olen, offset, len);
- }
if (error != 0 || len == 0)
break;
KASSERT(olen > len, ("Iteration did not make progress?"));
@@ -3471,10 +3473,13 @@
vp = fp->f_vnode;
- if (cmd != SPACECTL_DEALLOC)
+ if (cmd != SPACECTL_ALLOC && cmd != SPACECTL_DEALLOC)
return (EINVAL);
switch (cmd) {
+ case SPACECTL_ALLOC:
+ error = vn_fallocate(fp, offset, len, flags, active_cred, td);
+ break;
case SPACECTL_DEALLOC:
error = vn_deallocate_impl(vp, offset, len, flags, 0, true,
active_cred, fp->f_cred, td);
Index: sys/kern/vnode_if.src
===================================================================
--- sys/kern/vnode_if.src
+++ sys/kern/vnode_if.src
@@ -703,6 +703,8 @@
IN struct vnode *vp;
INOUT off_t *offset;
INOUT off_t *len;
+ IN int flags;
+ IN struct ucred *cred;
};
Index: sys/sys/fcntl.h
===================================================================
--- sys/sys/fcntl.h
+++ sys/sys/fcntl.h
@@ -355,11 +355,13 @@
* Commands for fspacectl(2)
*/
#define SPACECTL_DEALLOC 0 /* deallocate space */
+#define SPACECTL_ALLOC 1 /* allocate space */
/*
* fspacectl(2) flags
*/
-#define SPACECTL_F_SUPPORTED 0
+#define SPACECTL_F_CANEXTEND (1)
+#define SPACECTL_F_SUPPORTED (SPACECTL_F_CANEXTEND)
#endif
#ifndef _KERNEL
Index: sys/sys/file.h
===================================================================
--- sys/sys/file.h
+++ sys/sys/file.h
@@ -127,8 +127,6 @@
typedef int fo_aio_queue_t(struct file *fp, struct kaiocb *job);
typedef int fo_add_seals_t(struct file *fp, int flags);
typedef int fo_get_seals_t(struct file *fp, int *flags);
-typedef int fo_fallocate_t(struct file *fp, off_t offset, off_t len,
- struct thread *td);
typedef int fo_fspacectl_t(struct file *fp, int cmd,
off_t offset, off_t len, int flags,
struct ucred *active_cred, struct thread *td);
@@ -152,7 +150,6 @@
fo_aio_queue_t *fo_aio_queue;
fo_add_seals_t *fo_add_seals;
fo_get_seals_t *fo_get_seals;
- fo_fallocate_t *fo_fallocate;
fo_fspacectl_t *fo_fspacectl;
fo_flags_t fo_flags; /* DFLAG_* below */
};
@@ -465,15 +462,6 @@
return ((*fp->f_ops->fo_get_seals)(fp, seals));
}
-static __inline int
-fo_fallocate(struct file *fp, off_t offset, off_t len, struct thread *td)
-{
-
- if (fp->f_ops->fo_fallocate == NULL)
- return (ENODEV);
- return ((*fp->f_ops->fo_fallocate)(fp, offset, len, td));
-}
-
static __inline int fo_fspacectl(struct file *fp, int cmd, off_t offset,
off_t len, int flags, struct ucred *active_cred, struct thread *td)
{
Index: tests/sys/file/fspacectl_test.c
===================================================================
--- tests/sys/file/fspacectl_test.c
+++ tests/sys/file/fspacectl_test.c
@@ -177,6 +177,46 @@
return (error);
}
+static int
+check_hole_alloc(int fd, off_t alloc_start, off_t alloc_len, off_t file_sz)
+{
+ off_t dataoff, holeoff;
+ struct stat statbuf;
+
+ if (alloc_start + alloc_len < alloc_start)
+ alloc_len = OFF_MAX - alloc_start;
+
+ dataoff = lseek(fd, alloc_start, SEEK_DATA);
+ if (dataoff == -1)
+ return (1);
+ holeoff = lseek(fd, alloc_start, SEEK_HOLE);
+ if (holeoff == -1)
+ return (1);
+
+ /*
+ * Check if the start offset of allocated region within file size is
+ * legit
+ */
+ if (dataoff != alloc_start && dataoff < file_sz)
+ return (1);
+ /*
+ * Check if the end offset of allocated region within file size is
+ * legit
+ */
+ if (holeoff < alloc_start + alloc_len && holeoff < file_sz)
+ return (1);
+
+ /*
+ * Check file size matches with expected file size.
+ */
+ if (fstat(fd, &statbuf) == -1)
+ return (1);
+ if (statbuf.st_size != file_sz)
+ return (1);
+
+ return (0);
+}
+
/*
* Check aligned deallocation
*/
@@ -317,6 +357,149 @@
ATF_REQUIRE(close(fd) == 0);
}
+/*
+ * Check aligned allocation
+ */
+ATF_TC_WITHOUT_HEAD(aligned_alloc);
+ATF_TC_BODY(aligned_alloc, tc)
+{
+ struct spacectl_range range;
+ blksize_t blocksize;
+ int fd;
+
+ ATF_REQUIRE((blocksize = fd_get_blksize()) != -1);
+ range.r_offset = blocksize;
+ range.r_len = (file_max_blocks - 1) * blocksize - range.r_offset;
+
+ ATF_REQUIRE((fd = open("sys_fspacectl_testfile",
+ O_CREAT | O_RDWR | O_TRUNC, 0600)) != -1);
+ ATF_REQUIRE(ftruncate(fd, file_max_blocks * blocksize) == 0);
+ ATF_CHECK(fspacectl(fd, SPACECTL_ALLOC, &range, 0) == 0);
+ ATF_CHECK(check_hole_alloc(fd, range.r_offset, range.r_len,
+ file_max_blocks * blocksize) == 0);
+ ATF_REQUIRE(close(fd) == 0);
+}
+
+/*
+ * Check unaligned allocation
+ */
+ATF_TC_WITHOUT_HEAD(unaligned_alloc);
+ATF_TC_BODY(unaligned_alloc, tc)
+{
+ struct spacectl_range range;
+ blksize_t blocksize;
+ int fd;
+
+ ATF_REQUIRE((blocksize = fd_get_blksize()) != -1);
+ range.r_offset = blocksize / 2;
+ range.r_len = (file_max_blocks - 1) * blocksize + blocksize / 2 -
+ range.r_offset;
+
+ ATF_REQUIRE((fd = open("sys_fspacectl_testfile",
+ O_CREAT | O_RDWR | O_TRUNC, 0600)) != -1);
+ ATF_REQUIRE(ftruncate(fd, file_max_blocks * blocksize) == 0);
+ ATF_CHECK(fspacectl(fd, SPACECTL_ALLOC, &range, 0) == 0);
+ ATF_CHECK(check_hole_alloc(fd, range.r_offset, range.r_len,
+ file_max_blocks * blocksize) == 0);
+ ATF_REQUIRE(close(fd) == 0);
+}
+
+/*
+ * Check aligned allocation and extending
+ */
+ATF_TC_WITHOUT_HEAD(aligned_alloc_canextend);
+ATF_TC_BODY(aligned_alloc_canextend, tc)
+{
+ struct spacectl_range range;
+ blksize_t blocksize;
+ int fd;
+
+ ATF_REQUIRE((blocksize = fd_get_blksize()) != -1);
+ range.r_offset = blocksize;
+ range.r_len = (file_max_blocks + 1) * blocksize - range.r_offset;
+
+ ATF_REQUIRE((fd = open("sys_fspacectl_testfile",
+ O_CREAT | O_RDWR | O_TRUNC, 0600)) != -1);
+ ATF_REQUIRE(ftruncate(fd, file_max_blocks * blocksize) == 0);
+ ATF_CHECK(
+ fspacectl(fd, SPACECTL_ALLOC, &range, SPACECTL_F_CANEXTEND) == 0);
+ ATF_CHECK(check_hole_alloc(fd, range.r_offset, range.r_len,
+ (file_max_blocks + 1) * blocksize) == 0);
+ ATF_REQUIRE(close(fd) == 0);
+}
+
+/*
+ * Check unaligned allocation and extending
+ */
+ATF_TC_WITHOUT_HEAD(unaligned_alloc_canextend);
+ATF_TC_BODY(unaligned_alloc_canextend, tc)
+{
+ struct spacectl_range range;
+ blksize_t blocksize;
+ int fd;
+
+ ATF_REQUIRE((blocksize = fd_get_blksize()) != -1);
+ range.r_offset = blocksize / 2;
+ range.r_len = file_max_blocks * blocksize + blocksize / 2 -
+ range.r_offset;
+
+ ATF_REQUIRE((fd = open("sys_fspacectl_testfile",
+ O_CREAT | O_RDWR | O_TRUNC, 0600)) != -1);
+ ATF_REQUIRE(ftruncate(fd, file_max_blocks * blocksize) == 0);
+ ATF_CHECK(
+ fspacectl(fd, SPACECTL_ALLOC, &range, SPACECTL_F_CANEXTEND) == 0);
+ ATF_CHECK(check_hole_alloc(fd, range.r_offset, range.r_len,
+ file_max_blocks * blocksize + blocksize / 2) == 0);
+ ATF_REQUIRE(close(fd) == 0);
+}
+
+/*
+ * Check aligned allocation around EOF
+ */
+ATF_TC_WITHOUT_HEAD(aligned_alloc_no_canextend);
+ATF_TC_BODY(aligned_alloc_no_canextend, tc)
+{
+ struct spacectl_range range;
+ blksize_t blocksize;
+ int fd;
+
+ ATF_REQUIRE((blocksize = fd_get_blksize()) != -1);
+ range.r_offset = blocksize;
+ range.r_len = (file_max_blocks + 1) * blocksize - range.r_offset;
+
+ ATF_REQUIRE((fd = open("sys_fspacectl_testfile",
+ O_CREAT | O_RDWR | O_TRUNC, 0600)) != -1);
+ ATF_REQUIRE(ftruncate(fd, file_max_blocks * blocksize) == 0);
+ ATF_CHECK(fspacectl(fd, SPACECTL_ALLOC, &range, 0) == 0);
+ ATF_CHECK(check_hole_alloc(fd, range.r_offset, range.r_len,
+ file_max_blocks * blocksize) == 0);
+ ATF_REQUIRE(close(fd) == 0);
+}
+
+/*
+ * Check unaligned allocation around EOF
+ */
+ATF_TC_WITHOUT_HEAD(unaligned_alloc_no_canextend);
+ATF_TC_BODY(unaligned_alloc_no_canextend, tc)
+{
+ struct spacectl_range range;
+ blksize_t blocksize;
+ int fd;
+
+ ATF_REQUIRE((blocksize = fd_get_blksize()) != -1);
+ range.r_offset = blocksize / 2;
+ range.r_len = file_max_blocks * blocksize + blocksize / 2 -
+ range.r_offset;
+
+ ATF_REQUIRE((fd = open("sys_fspacectl_testfile",
+ O_CREAT | O_RDWR | O_TRUNC, 0600)) != -1);
+ ATF_REQUIRE(ftruncate(fd, file_max_blocks * blocksize) == 0);
+ ATF_CHECK(fspacectl(fd, SPACECTL_ALLOC, &range, 0) == 0);
+ ATF_CHECK(check_hole_alloc(fd, range.r_offset, range.r_len,
+ file_max_blocks * blocksize) == 0);
+ ATF_REQUIRE(close(fd) == 0);
+}
+
ATF_TP_ADD_TCS(tp)
{
ATF_TP_ADD_TC(tp, aligned_dealloc);
@@ -326,5 +509,12 @@
ATF_TP_ADD_TC(tp, aligned_dealloc_offmax);
ATF_TP_ADD_TC(tp, unaligned_dealloc_offmax);
+ ATF_TP_ADD_TC(tp, aligned_alloc);
+ ATF_TP_ADD_TC(tp, unaligned_alloc);
+ ATF_TP_ADD_TC(tp, aligned_alloc_canextend);
+ ATF_TP_ADD_TC(tp, unaligned_alloc_canextend);
+ ATF_TP_ADD_TC(tp, aligned_alloc_no_canextend);
+ ATF_TP_ADD_TC(tp, unaligned_alloc_no_canextend);
+
return atf_no_error();
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Jan 28, 8:39 AM (4 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16263477
Default Alt Text
D28833.diff (18 KB)
Attached To
Mode
D28833: Implement posix_fallocate(2) by fo_fspacectl.
Attached
Detach File
Event Timeline
Log In to Comment