mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-18 17:14:28 +00:00
86 lines
2.5 KiB
Text
86 lines
2.5 KiB
Text
fs: Add do_close helper
|
|
|
|
To be able to close file descriptors right from inside
|
|
kernel space do_close() helper is added. We need it at
|
|
checkpoint restore time.
|
|
|
|
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
|
|
Signed-off-by: Cyrill Gorcunov <gorcunov@openvz.org>
|
|
---
|
|
fs/open.c | 32 ++++++++++++++++++++------------
|
|
include/linux/fs.h | 1 +
|
|
2 files changed, 21 insertions(+), 12 deletions(-)
|
|
|
|
Index: linux-2.6.git/fs/open.c
|
|
===================================================================
|
|
--- linux-2.6.git.orig/fs/open.c
|
|
+++ linux-2.6.git/fs/open.c
|
|
@@ -1056,17 +1056,11 @@ int filp_close(struct file *filp, fl_own
|
|
|
|
EXPORT_SYMBOL(filp_close);
|
|
|
|
-/*
|
|
- * Careful here! We test whether the file pointer is NULL before
|
|
- * releasing the fd. This ensures that one clone task can't release
|
|
- * an fd while another clone is opening it.
|
|
- */
|
|
-SYSCALL_DEFINE1(close, unsigned int, fd)
|
|
+int do_close(unsigned int fd)
|
|
{
|
|
struct file * filp;
|
|
struct files_struct *files = current->files;
|
|
struct fdtable *fdt;
|
|
- int retval;
|
|
|
|
spin_lock(&files->file_lock);
|
|
fdt = files_fdtable(files);
|
|
@@ -1079,7 +1073,25 @@ SYSCALL_DEFINE1(close, unsigned int, fd)
|
|
FD_CLR(fd, fdt->close_on_exec);
|
|
__put_unused_fd(files, fd);
|
|
spin_unlock(&files->file_lock);
|
|
- retval = filp_close(filp, files);
|
|
+
|
|
+ return filp_close(filp, files);
|
|
+
|
|
+out_unlock:
|
|
+ spin_unlock(&files->file_lock);
|
|
+ return -EBADF;
|
|
+}
|
|
+EXPORT_SYMBOL_GPL(do_close);
|
|
+
|
|
+/*
|
|
+ * Careful here! We test whether the file pointer is NULL before
|
|
+ * releasing the fd. This ensures that one clone task can't release
|
|
+ * an fd while another clone is opening it.
|
|
+ */
|
|
+SYSCALL_DEFINE1(close, unsigned int, fd)
|
|
+{
|
|
+ int retval;
|
|
+
|
|
+ retval = do_close(fd);
|
|
|
|
/* can't restart close syscall because file table entry was cleared */
|
|
if (unlikely(retval == -ERESTARTSYS ||
|
|
@@ -1089,10 +1101,6 @@ SYSCALL_DEFINE1(close, unsigned int, fd)
|
|
retval = -EINTR;
|
|
|
|
return retval;
|
|
-
|
|
-out_unlock:
|
|
- spin_unlock(&files->file_lock);
|
|
- return -EBADF;
|
|
}
|
|
EXPORT_SYMBOL(sys_close);
|
|
|
|
Index: linux-2.6.git/include/linux/fs.h
|
|
===================================================================
|
|
--- linux-2.6.git.orig/include/linux/fs.h
|
|
+++ linux-2.6.git/include/linux/fs.h
|
|
@@ -2027,6 +2027,7 @@ extern struct file *file_open_root(struc
|
|
extern struct file * dentry_open(struct dentry *, struct vfsmount *, int,
|
|
const struct cred *);
|
|
extern int filp_close(struct file *, fl_owner_t id);
|
|
+extern int do_close(unsigned int fd);
|
|
extern char * getname(const char __user *);
|
|
|
|
/* fs/ioctl.c */
|