[CRIU] [PATCH 1/5] locks: Add c/r of non broken leases (kernel>=v4.1)
Pavel Begunkov
asml.silence at gmail.com
Mon Aug 14 01:27:05 MSK 2017
Leases in breaking state are not supported. In that case criu will
report an error during the dumping. Also it works only if lock info is
presented in /proc/<pid>/fdinfo (since kernel 4.1)
task #39
Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
---
criu/file-lock.c | 9 +++++++++
criu/include/file-lock.h | 1 +
criu/proc_parse.c | 5 +++++
3 files changed, 15 insertions(+)
diff --git a/criu/file-lock.c b/criu/file-lock.c
index 2d4036c75..92d8bd394 100644
--- a/criu/file-lock.c
+++ b/criu/file-lock.c
@@ -292,6 +292,9 @@ int note_file_lock(struct pid *pid, int fd, int lfd, struct fd_parms *p)
*/
if (fl->fl_owner != pid->real)
continue;
+ } else if (fl->fl_kind == FL_LEASE) {
+ pr_err("Leases are not supported for kernel <= v4.0");
+ return -1;
} else /* fl->fl_kind == FL_FLOCK || fl->fl_kind == FL_OFD */ {
int ret;
@@ -395,6 +398,12 @@ static int restore_file_lock(FileLockEntry *fle)
pr_err("Can not set ofd lock!\n");
goto err;
}
+ } else if (fle->flag & FL_LEASE) {
+ ret = fcntl(fle->fd, F_SETLEASE, fle->type);
+ if (ret < 0) {
+ pr_perror("Can't set lease!\n");
+ goto err;
+ }
} else {
pr_err("Unknown file lock style!\n");
goto err;
diff --git a/criu/include/file-lock.h b/criu/include/file-lock.h
index c3f2dabf7..f70739adb 100644
--- a/criu/include/file-lock.h
+++ b/criu/include/file-lock.h
@@ -10,6 +10,7 @@
#define FL_POSIX 1
#define FL_FLOCK 2
#define FL_OFD 4
+#define FL_LEASE 8
/* for posix fcntl() and lockf() */
#ifndef F_RDLCK
diff --git a/criu/proc_parse.c b/criu/proc_parse.c
index e33da8d56..d3893272c 100644
--- a/criu/proc_parse.c
+++ b/criu/proc_parse.c
@@ -1991,6 +1991,8 @@ static int parse_file_lock_buf(char *buf, struct file_lock *fl,
fl->fl_kind = FL_FLOCK;
else if (!strcmp(fl_flag, "OFDLCK"))
fl->fl_kind = FL_OFD;
+ else if (!strcmp(fl_flag, "LEASE"))
+ fl->fl_kind = FL_LEASE;
else
fl->fl_kind = FL_UNKNOWN;
@@ -2007,6 +2009,9 @@ static int parse_file_lock_buf(char *buf, struct file_lock *fl,
pr_err("Unknown lock option!\n");
return -1;
}
+ } else if (fl->fl_kind == FL_LEASE && !strcmp(fl_type, "BREAKING")) {
+ pr_err("Breaking leases are not supported (%d): %s\n",
+ num, buf);
} else {
if (!strcmp(fl_option, "UNLCK")) {
fl->fl_ltype |= F_UNLCK;
--
2.11.1
More information about the CRIU
mailing list