[CRIU] [PATCH v2] zdtm: Make file_locks04 test based on /proc/{pid}/fdinfo/{fd}
Andrew Vagin
avagin at virtuozzo.com
Fri Jul 15 09:46:56 PDT 2016
On Thu, Jul 14, 2016 at 01:55:43PM +0300, Pavel Emelyanov wrote:
> Andrey, would you ack/nack this patch?
It's ok for me, but here are a few facts:
* I don't see any reason to fix only this test. Other lock tests has the
same problems. We use the 'excl' flag to not run these tests
concurrently.
* If we will fix all tests by this way, we will not be able to test locks
on kernels where fdinfo doesn't contains locks. We know that in this
case we can meet the same race in criu and may be it isn't a big
problem.
>
> On 06/28/2016 10:08 PM, Kirill Tkhai wrote:
> > /proc/locks is racy with adding/removing locks,
> > so we may lose lock on check.
> >
> > Use fdinfo's list of locks instead.
> >
> > v2: Feature 'fdinfo_lock'
> >
> > Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> > ---
> > test/zdtm/static/file_locks04.c | 31 +++++++++++++++++--------------
> > test/zdtm/static/file_locks04.desc | 2 +-
> > 2 files changed, 18 insertions(+), 15 deletions(-)
> >
> > diff --git a/test/zdtm/static/file_locks04.c b/test/zdtm/static/file_locks04.c
> > index 995dd09..28ed497 100644
> > --- a/test/zdtm/static/file_locks04.c
> > +++ b/test/zdtm/static/file_locks04.c
> > @@ -6,6 +6,7 @@
> > #include <unistd.h>
> > #include <sys/file.h>
> > #include <string.h>
> > +#include <limits.h>
> > #include <sys/wait.h>
> >
> > #include "zdtmtst.h"
> > @@ -16,27 +17,27 @@ const char *test_author = "Pavel Emelyanov <xemul at parallels.com>";
> > char *filename;
> > TEST_OPTION(filename, string, "file name", 1);
> >
> > -static int check_file_locks(int alt_pid, int fd)
> > +static int check_file_locks(pid_t child_pid, int fd, int child_fd)
> > {
> > + char path[PATH_MAX];
> > FILE *fp_locks = NULL;
> > char buf[100], fl_flag[16], fl_type[16], fl_option[16];
> > - pid_t pid = getpid();
> > int found = 0, num, fl_owner;
> >
> > - fp_locks = fopen("/proc/locks", "r");
> > - if (!fp_locks)
> > + sprintf(path, "/proc/%d/fdinfo/%d", child_pid, child_fd);
> > + fp_locks = fopen(path, "r");
> > + if (!fp_locks) {
> > + pr_err("Can't open %s\n", path);
> > return -1;
> > -
> > - test_msg("C: %d/%d\n", pid, alt_pid);
> > + }
> >
> > while (fgets(buf, sizeof(buf), fp_locks)) {
> > - test_msg("c: %s", buf);
> > -
> > - if (strstr(buf, "->"))
> > + if (strncmp(buf, "lock:\t", 6) != 0)
> > continue;
> > + test_msg("c: %s", buf);
> >
> > num = sscanf(buf,
> > - "%*d:%s %s %s %d %*02x:%*02x:%*d %*d %*s",
> > + "%*s %*d:%s %s %s %d %*02x:%*02x:%*d %*d %*s",
> > fl_flag, fl_type, fl_option, &fl_owner);
> >
> > if (num < 4) {
> > @@ -44,8 +45,10 @@ static int check_file_locks(int alt_pid, int fd)
> > break;
> > }
> >
> > - if (fl_owner != pid && fl_owner != alt_pid)
> > + if (fl_owner != child_pid && fl_owner != getpid()) {
> > + pr_err("Wrong owner\n");
> > continue;
> > + }
> >
> > if (!strcmp(fl_flag, "FLOCK") &&
> > !strcmp(fl_type, "ADVISORY") &&
> > @@ -67,11 +70,11 @@ static int check_file_locks(int alt_pid, int fd)
> >
> > int main(int argc, char **argv)
> > {
> > - int fd, pid;
> > + int fd, child_fd, pid;
> >
> > test_init(argc, argv);
> >
> > - fd = open(filename, O_CREAT | O_RDWR, 0600);
> > + fd = child_fd = open(filename, O_CREAT | O_RDWR, 0600);
> > if (fd < 0) {
> > pr_perror("No file");
> > return -1;
> > @@ -105,7 +108,7 @@ int main(int argc, char **argv)
> > test_daemon();
> > test_waitsig();
> >
> > - if (check_file_locks(pid, fd))
> > + if (check_file_locks(pid, fd, child_fd) > 0)
> > pass();
> > else
> > fail("Flock file locks check failed");
> > diff --git a/test/zdtm/static/file_locks04.desc b/test/zdtm/static/file_locks04.desc
> > index 80cd04e..41aad3f 100644
> > --- a/test/zdtm/static/file_locks04.desc
> > +++ b/test/zdtm/static/file_locks04.desc
> > @@ -1 +1 @@
> > -{'flags': 'excl', 'opts': '--file-locks'}
> > +{'flags': 'excl', 'opts': '--file-locks', 'feature': 'fdinfo_lock'}
> >
> > _______________________________________________
> > CRIU mailing list
> > CRIU at openvz.org
> > https://lists.openvz.org/mailman/listinfo/criu
> > .
> >
>
More information about the CRIU
mailing list