Hi,
Please find attached a Patch from Breno for Fixing the unlink problem in
many test cases in LTP.
--Subrata--
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/chdir/chdir01.c ./chdir/chdir01.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/chdir/chdir01.c 2007-08-30 04:33:20.000000000 -0400
+++ ./chdir/chdir01.c 2007-09-24 10:47:45.000000000 -0400
@@ -139,6 +139,7 @@
chdir("..");
}
+ close(fd);
cleanup();
return 0;
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/creat/creat03.c ./creat/creat03.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/creat/creat03.c 2007-08-30 04:33:20.000000000 -0400
+++ ./creat/creat03.c 2007-09-24 11:07:43.000000000 -0400
@@ -106,6 +106,7 @@
tst_resm(TPASS, "call succeeded");
}
+ close(TEST_RETURN);
/* clean up things in case we are looping */
if (unlink(pfilname) == -1) {
tst_brkm(TBROK, cleanup, "couldn't remove file");
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/creat/creat05.c ./creat/creat05.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/creat/creat05.c 2007-08-30 04:33:20.000000000 -0400
+++ ./creat/creat05.c 2007-09-24 13:40:04.000000000 -0400
@@ -164,6 +164,7 @@
}
break;
}
+ close(fd);
}
}
@@ -192,7 +193,7 @@
* print timing stats if that option was specified.
* print errno log if that option was specified.
*/
- close(first);
+ close(first);
TEST_CLEANUP;
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/dup2/dup202.c ./dup2/dup202.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/dup2/dup202.c 2007-08-30 04:33:20.000000000 -0400
+++ ./dup2/dup202.c 2007-09-24 13:51:40.000000000 -0400
@@ -144,6 +144,9 @@
}
/* remove the file so that we can use it again */
+ if (-1 == close(*TC[i].nfd)) {
+ printf("close failed\n");
+ }
if (-1 == close(ofd)) {
printf("close failed\n");
}
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/dup2/dup203.c ./dup2/dup203.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/dup2/dup203.c 2007-08-30 04:33:20.000000000 -0400
+++ ./dup2/dup203.c 2007-09-24 13:58:53.000000000 -0400
@@ -197,6 +197,8 @@
} else {
tst_resm(TPASS, "call succeeded");
}
+ close(fd0);
+ close(fd1);
unlink(filename0);
tst_resm(TINFO, "Exit block 2");
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/execve/execve04.c ./execve/execve04.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/execve/execve04.c 2007-08-30 04:33:20.000000000 -0400
+++ ./execve/execve04.c 2007-09-24 14:12:46.000000000 -0400
@@ -195,6 +195,7 @@
"create %d files: %s", ifile + 1, nfile, strerror(errno));
cleanup();
}
+ close(fd);
}
}
@@ -210,7 +211,7 @@
* print timing stats if that option was specified.
* print errno log if that option was specified.
*/
- close(first);
+ close(first);
TEST_CLEANUP;
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock01.c ./flock/flock01.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock01.c 2007-08-30 04:33:20.000000000 -0400
+++ ./flock/flock01.c 2007-09-24 14:18:50.000000000 -0400
@@ -142,6 +142,8 @@
}/* End of TEST_LOOPING */
+ close(fd);
+
cleanup();
return 0;
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock02.c ./flock/flock02.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock02.c 2007-08-30 04:33:20.000000000 -0400
+++ ./flock/flock02.c 2007-09-24 14:22:39.000000000 -0400
@@ -160,6 +160,8 @@
}/* End of TEST_LOOPING */
+ close(fd);
+
cleanup();
return 0;
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock03.c ./flock/flock03.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock03.c 2007-08-30 04:33:20.000000000 -0400
+++ ./flock/flock03.c 2007-09-24 15:02:55.000000000 -0400
@@ -152,6 +152,8 @@
tst_resm(TPASS, "flock03 Passed");
else
tst_resm(TFAIL, "flock03 Failed");
+
+ close(fd);
}/* End of TEST_LOOPING */
@@ -192,6 +194,7 @@
else
tst_resm(TPASS, "Child: flock after unlocking passed");
+ close(fd);
close(fd2);
tst_exit();
@@ -235,6 +238,7 @@
/* exit with return code appropriate for result */
tst_exit();
}
+ close(fd);
}
/*
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock04.c ./flock/flock04.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock04.c 2007-08-30 04:33:20.000000000 -0400
+++ ./flock/flock04.c 2007-09-24 15:50:13.000000000 -0400
@@ -170,6 +170,8 @@
tst_resm(TFAIL, "flock() failed to acquire shared lock");
}
+ close(fd);
+ close(fd1);
}/* End of TEST_LOOPING */
cleanup();
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock05.c ./flock/flock05.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock05.c 2007-08-30 04:33:20.000000000 -0400
+++ ./flock/flock05.c 2007-09-24 15:52:10.000000000 -0400
@@ -170,6 +170,8 @@
}/* End of TEST_LOOPING */
+ close(fd);
+ close(fd1);
cleanup();
return 0;
/*NOTREACHED*/
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock06.c ./flock/flock06.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/flock/flock06.c 2007-08-30 04:33:20.000000000 -0400
+++ ./flock/flock06.c 2007-09-25 14:33:35.000000000 -0400
@@ -97,46 +97,48 @@
/* The following loop checks looping state if -i option given */
for (lc = 0; TEST_LOOPING(lc); lc++) {
- int fd1, fd2;
+ int fd1, fd2;
- /* reset Tst_count in case we are looping */
- Tst_count = 0;
+ /* reset Tst_count in case we are looping */
+ Tst_count = 0;
- fd1 = open(filename, O_RDWR);
- if (fd1 == -1)
- tst_brkm(TFAIL, cleanup, "failed to open the"
- "file, errno %d", errno);
-
- TEST(flock(fd1, LOCK_EX | LOCK_NB));
- if (TEST_RETURN != 0)
- tst_resm(TFAIL, "First attempt to flock() failed, "
- "errno %d",TEST_ERRNO);
- else
- tst_resm(TPASS, "First attempt to flock() passed");
-
- fd2 = open(filename, O_RDWR);
- if (fd2 == -1)
- tst_brkm(TFAIL, cleanup, "failed to open the"
- "file, errno %d", errno);
-
- TEST(flock(fd2, LOCK_EX | LOCK_NB));
- if (TEST_RETURN == -1)
- tst_resm(TPASS, "Second attempt to flock() denied");
- else
- tst_resm(TFAIL, "Second attempt to flock() succeeded!");
-
- TEST(flock(fd1, LOCK_UN));
- if (TEST_RETURN == -1)
- tst_resm(TFAIL, "Failed to unlock fd1, errno %d",
- TEST_ERRNO);
- else
- tst_resm(TPASS, "Unlocked fd1");
-
- TEST(flock(fd2, LOCK_EX | LOCK_NB));
- if (TEST_RETURN == -1)
- tst_resm(TFAIL, "Third attempt to flock() denied!");
- else
- tst_resm(TPASS, "Third attempt to flock() succeeded");
+ fd1 = open(filename, O_RDWR);
+ if (fd1 == -1)
+ tst_brkm(TFAIL, cleanup, "failed to open the"
+ "file, errno %d", errno);
+
+ TEST(flock(fd1, LOCK_EX | LOCK_NB));
+ if (TEST_RETURN != 0)
+ tst_resm(TFAIL, "First attempt to flock() failed, "
+ "errno %d",TEST_ERRNO);
+ else
+ tst_resm(TPASS, "First attempt to flock() passed");
+
+ fd2 = open(filename, O_RDWR);
+ if (fd2 == -1)
+ tst_brkm(TFAIL, cleanup, "failed to open the"
+ "file, errno %d", errno);
+
+ TEST(flock(fd2, LOCK_EX | LOCK_NB));
+ if (TEST_RETURN == -1)
+ tst_resm(TPASS, "Second attempt to flock() denied");
+ else
+ tst_resm(TFAIL, "Second attempt to flock() succeeded!");
+
+ TEST(flock(fd1, LOCK_UN));
+ if (TEST_RETURN == -1)
+ tst_resm(TFAIL, "Failed to unlock fd1, errno %d",
+ TEST_ERRNO);
+ else
+ tst_resm(TPASS, "Unlocked fd1");
+
+ TEST(flock(fd2, LOCK_EX | LOCK_NB));
+ if (TEST_RETURN == -1)
+ tst_resm(TFAIL, "Third attempt to flock() denied!");
+ else
+ tst_resm(TPASS, "Third attempt to flock() succeeded");
+ close(fd1);
+ close(fd2);
}/* End of TEST_LOOPING */
@@ -153,35 +155,36 @@
*/
void setup(void)
{
- int fd;
- /* capture signals */
- tst_sig(FORK, DEF_HANDLER, cleanup);
-
- /* Pause if that option was specified
- * TEST_PAUSE contains the code to fork the test with the -i option.
- * You want to make sure you do this before you create your temporary
- * directory.
- */
- TEST_PAUSE;
-
- /* Create a unique temporary directory and chdir() to it. */
- tst_tmpdir();
-
- sprintf(filename, "flock06.%d", getpid());
-
- /* creating temporary file */
- fd = creat(filename, 0666);
- if (fd < 0) {
- tst_resm(TFAIL, "creating a new file failed");
-
- TEST_CLEANUP;
-
- /* Removing temp dir */
- tst_rmdir();
-
- /* exit with return code appropriate for result */
- tst_exit();
- }
+ int fd;
+ /* capture signals */
+ tst_sig(FORK, DEF_HANDLER, cleanup);
+
+ /* Pause if that option was specified
+ * TEST_PAUSE contains the code to fork the test with the -i option.
+ * You want to make sure you do this before you create your temporary
+ * directory.
+ */
+ TEST_PAUSE;
+
+ /* Create a unique temporary directory and chdir() to it. */
+ tst_tmpdir();
+
+ sprintf(filename, "flock06.%d", getpid());
+
+ /* creating temporary file */
+ fd = creat(filename, 0666);
+ if (fd < 0) {
+ tst_resm(TFAIL, "creating a new file failed");
+
+ TEST_CLEANUP;
+
+ /* Removing temp dir */
+ tst_rmdir();
+
+ /* exit with return code appropriate for result */
+ tst_exit();
+ }
+ close(fd);
}
/*
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/fork/fork07.c ./fork/fork07.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/fork/fork07.c 2007-08-30 04:33:20.000000000 -0400
+++ ./fork/fork07.c 2007-09-24 16:00:28.000000000 -0400
@@ -183,6 +183,8 @@
tst_brkm(TBROK, cleanup, "Collected %d more children then I should have!", abs(forks));
}
}
+ fclose(writ);
+ fclose(rea);
cleanup();
/*NOTREACHED*/
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/mprotect/mprotect02.c ./mprotect/mprotect02.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/mprotect/mprotect02.c 2007-08-30 04:33:19.000000000 -0400
+++ ./mprotect/mprotect02.c 2007-09-24 16:34:28.000000000 -0400
@@ -184,6 +184,9 @@
/* clean up things in case we are looping */
+ if (munmap(addr, strlen(buf)) == -1){
+ tst_brkm(TBROK, cleanup, "close() failed");
+ }
if (close(fd) == -1) {
tst_brkm(TBROK, cleanup, "close() failed");
}
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/mprotect/mprotect03.c ./mprotect/mprotect03.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/mprotect/mprotect03.c 2007-08-30 04:33:19.000000000 -0400
+++ ./mprotect/mprotect03.c 2007-09-24 16:32:11.000000000 -0400
@@ -156,6 +156,9 @@
}
/* clean up things in case we are looping */
+ if (munmap(addr, strlen(buf)) == -1){
+ tst_brkm(TBROK, cleanup, "munamp failed");
+ }
if (close(fd) == -1) {
tst_brkm(TBROK, cleanup, "close failed");
}
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/open/open04.c ./open/open04.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/open/open04.c 2007-08-30 04:33:20.000000000 -0400
+++ ./open/open04.c 2007-09-25 10:29:07.000000000 -0400
@@ -71,6 +71,7 @@
{
int lc; /* loop counter */
char *msg; /* message returned from parse_opts */
+ int fdo;
/* parse standard options */
if ((msg = parse_opts(ac, av, (option_t *)NULL, NULL)) != (char *)NULL){
@@ -85,6 +86,7 @@
for (lc = 0; TEST_LOOPING(lc); lc++) {
/* reset Tst_count in case we are looping */
Tst_count = 0;
+ int a;
TEST(open(fname, O_RDWR | O_CREAT));
@@ -101,6 +103,8 @@
tst_resm(TPASS, "call returned expected EMFILE error");
}
}
+ close(first);
+ close(fd);
cleanup();
/*NOTREACHED*/
@@ -130,7 +134,8 @@
tst_brkm(TBROK, cleanup, "Cannot open first file");
}
- close(fd);
+ close(fd);
+ close(first);
unlink(fname);
for (ifile = first; ifile <= nfile; ifile++) {
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/open/open05.c ./open/open05.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/open/open05.c 2007-08-30 04:33:20.000000000 -0400
+++ ./open/open05.c 2007-09-25 10:31:59.000000000 -0400
@@ -133,6 +133,8 @@
if ((e_code != 0) || (retval != 0)) {
tst_resm(TFAIL, "Failures reported above");
}
+
+ close(fd);
cleanup();
}
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/read/read04.c ./read/read04.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/read/read04.c 2007-08-30 04:33:19.000000000 -0400
+++ ./read/read04.c 2007-09-25 10:35:40.000000000 -0400
@@ -152,6 +152,7 @@
tst_brkm(TBROK, cleanup, "can't write to Xread");
/*NOTREACHED*/
}
+ close(fild);
}
/*
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/readv/readv01.c ./readv/readv01.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/readv/readv01.c 2007-08-30 04:33:20.000000000 -0400
+++ ./readv/readv01.c 2007-09-25 11:34:31.000000000 -0400
@@ -123,6 +123,7 @@
"followed by two NULL vectors", CHUNK);
}
}
+ close(fd);
cleanup();
/*NOTREACHED*/
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/readv/readv02.c ./readv/readv02.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/readv/readv02.c 2007-08-30 04:33:20.000000000 -0400
+++ ./readv/readv02.c 2007-09-25 10:41:43.000000000 -0400
@@ -179,6 +179,8 @@
}
}
+ close(fd[0]);
+ close(fd[1]);
cleanup();
/*NOTREACHED*/
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/recvmsg/Makefile ./recvmsg/Makefile
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/recvmsg/Makefile 2007-08-30 04:33:20.000000000 -0400
+++ ./recvmsg/Makefile 2007-09-25 11:30:37.000000000 -0400
@@ -16,7 +16,7 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
-CFLAGS += -I../../../../include -Wall
+CFLAGS += -I../../../../include -Wall -g
LDLIBS += -L../../../../lib -lltp
SRCS = $(wildcard *.c)
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/recvmsg/recvmsg01.c ./recvmsg/recvmsg01.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/recvmsg/recvmsg01.c 2007-08-30 04:33:20.000000000 -0400
+++ ./recvmsg/recvmsg01.c 2007-09-25 13:49:49.000000000 -0400
@@ -358,12 +358,16 @@
cleanup1(void)
{
(void) close(s);
+ close(ufd);
+ close(sfd);
s = -1;
}
void
cleanup2(void)
{
+ close(ufd);
+ close(sfd);
(void) close(s);
s = -1;
@@ -515,7 +519,6 @@
tfd = mkstemp(tmpfn);
if (tfd < 0)
return;
- (void) unlink(tmpfn);
memset(&mh, 0x00, sizeof(mh));
@@ -539,4 +542,5 @@
/* do it */
(void) sendmsg(fd, &mh, 0);
(void) close(tfd);
+ (void) unlink(tmpfn);
}
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/rmdir/rmdir02.c ./rmdir/rmdir02.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/rmdir/rmdir02.c 2007-08-30 04:33:20.000000000 -0400
+++ ./rmdir/rmdir02.c 2007-09-25 14:00:07.000000000 -0400
@@ -223,6 +223,7 @@
void
set_condition(int num)
{
+ int fd;
switch(num) {
case 1:
/* set up for first test */
@@ -253,10 +254,11 @@
sprintf(tstdir3, "%s/tstdir3", tstfile);
/* create a file */
- if (creat(tstfile, PERMS) == -1) {
+ if ((fd = creat(tstfile, PERMS)) == -1) {
tst_brkm(TBROK, cleanup, "creat() failed");
/*NOTREACHED*/
}
+ close(fd);
break;
default:
tst_brkm(TBROK, cleanup, "illegal setup case - %d", num);
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/write/write03.c ./write/write03.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/write/write03.c 2007-08-30 04:33:20.000000000 -0400
+++ ./write/write03.c 2007-09-25 14:05:03.000000000 -0400
@@ -142,6 +142,7 @@
"file");
}
tst_resm(TINFO, "Exit block 1");
+ close(fd);
}
cleanup();
/*NOTREACHED*/
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/write/write05.c ./write/write05.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/write/write05.c 2007-08-30 04:33:20.000000000 -0400
+++ ./write/write05.c 2007-09-25 14:08:07.000000000 -0400
@@ -182,6 +182,7 @@
}
tst_resm(TINFO, "Exit Block 3");
}
+ close(fd);
}
cleanup();
/*NOTREACHED*/
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev01.c ./writev/writev01.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev01.c 2007-08-30 04:33:19.000000000 -0400
+++ ./writev/writev01.c 2007-09-25 14:11:49.000000000 -0400
@@ -449,6 +449,8 @@
}
tst_resm(TINFO, "Exit block 8");
}
+ close(fd[0]);
+ close(fd[1]);
cleanup();
/*NOTREACHED*/
return(0);
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev02.c ./writev/writev02.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev02.c 2007-08-30 04:33:19.000000000 -0400
+++ ./writev/writev02.c 2007-09-25 14:15:39.000000000 -0400
@@ -219,6 +219,8 @@
}
tst_resm(TINFO, "Exit block 1");
}
+ close(fd[0]);
+ close(fd[1]);
cleanup();
return(0);
}
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev03.c ./writev/writev03.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev03.c 2007-08-30 04:33:19.000000000 -0400
+++ ./writev/writev03.c 2007-09-25 14:19:57.000000000 -0400
@@ -271,6 +271,8 @@
}
tst_resm(TINFO, "Exit block 3");
}
+ close(fd[0]);
+ close(fd[1]);
cleanup();
return(0);
}
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev04.c ./writev/writev04.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev04.c 2007-08-30 04:33:19.000000000 -0400
+++ ./writev/writev04.c 2007-09-25 14:21:47.000000000 -0400
@@ -280,6 +280,8 @@
}
tst_resm(TINFO, "Exit block 3");
}
+ close(fd[0]);
+ close(fd[1]);
cleanup();
return(0);
}
diff -uNPr /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev05.c ./writev/writev05.c
--- /root/ltp/2/ltp-full-20070831/testcases/kernel/syscalls/writev/writev05.c 2007-08-30 04:33:19.000000000 -0400
+++ ./writev/writev05.c 2007-09-25 14:23:30.000000000 -0400
@@ -204,6 +204,8 @@
}
tst_resm(TINFO, "Exit block 1");
}
+ close(fd[0]);
+ close(fd[1]);
cleanup();
return(0);
}
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list