|
@@ -1173,6 +1173,7 @@ asmlinkage long sys_close(unsigned int fd)
|
|
struct file * filp;
|
|
struct file * filp;
|
|
struct files_struct *files = current->files;
|
|
struct files_struct *files = current->files;
|
|
struct fdtable *fdt;
|
|
struct fdtable *fdt;
|
|
|
|
+ int retval;
|
|
|
|
|
|
spin_lock(&files->file_lock);
|
|
spin_lock(&files->file_lock);
|
|
fdt = files_fdtable(files);
|
|
fdt = files_fdtable(files);
|
|
@@ -1185,7 +1186,16 @@ asmlinkage long sys_close(unsigned int fd)
|
|
FD_CLR(fd, fdt->close_on_exec);
|
|
FD_CLR(fd, fdt->close_on_exec);
|
|
__put_unused_fd(files, fd);
|
|
__put_unused_fd(files, fd);
|
|
spin_unlock(&files->file_lock);
|
|
spin_unlock(&files->file_lock);
|
|
- return filp_close(filp, files);
|
|
|
|
|
|
+ retval = filp_close(filp, files);
|
|
|
|
+
|
|
|
|
+ /* can't restart close syscall because file table entry was cleared */
|
|
|
|
+ if (unlikely(retval == -ERESTARTSYS ||
|
|
|
|
+ retval == -ERESTARTNOINTR ||
|
|
|
|
+ retval == -ERESTARTNOHAND ||
|
|
|
|
+ retval == -ERESTART_RESTARTBLOCK))
|
|
|
|
+ retval = -EINTR;
|
|
|
|
+
|
|
|
|
+ return retval;
|
|
|
|
|
|
out_unlock:
|
|
out_unlock:
|
|
spin_unlock(&files->file_lock);
|
|
spin_unlock(&files->file_lock);
|