Commit 3b0a8e7c authored by Pavel Emelyanov's avatar Pavel Emelyanov

file: Factor out fowners and flags restore

This is common, that opened fd fix its fowner and flags. Make
a cuntion for this. Those that obtain fd with open() don't need
to restore flags though.

A thought -- do we need yet another abstraction between fdinfo and
type-d files?
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 1f94837a
...@@ -149,6 +149,15 @@ int restore_fown(int fd, fown_t *fown) ...@@ -149,6 +149,15 @@ int restore_fown(int fd, fown_t *fown)
return 0; return 0;
} }
int rst_file_params(int fd, fown_t *fown, int flags)
{
if (set_fd_flags(fd, flags) < 0)
return -1;
if (restore_fown(fd, fown) < 0)
return -1;
return 0;
}
static int open_fe_fd(struct file_desc *d); static int open_fe_fd(struct file_desc *d);
static struct file_desc_ops reg_desc_ops = { static struct file_desc_ops reg_desc_ops = {
......
...@@ -56,6 +56,7 @@ extern struct fdinfo_list_entry *file_master(struct file_desc *d); ...@@ -56,6 +56,7 @@ extern struct fdinfo_list_entry *file_master(struct file_desc *d);
extern struct file_desc *find_file_desc_raw(int type, u32 id); extern struct file_desc *find_file_desc_raw(int type, u32 id);
extern int send_fd_to_peer(int fd, struct fdinfo_list_entry *, int transport); extern int send_fd_to_peer(int fd, struct fdinfo_list_entry *, int transport);
extern int restore_fown(int fd, fown_t *fown); extern int restore_fown(int fd, fown_t *fown);
int rst_file_params(int fd, fown_t *fown, int flags);
void show_saved_files(void); void show_saved_files(void);
extern int collect_reg_files(void); extern int collect_reg_files(void);
......
...@@ -292,11 +292,8 @@ static int open_pipe(struct file_desc *d) ...@@ -292,11 +292,8 @@ static int open_pipe(struct file_desc *d)
out: out:
close(pfd[!(pi->pe.flags & O_WRONLY)]); close(pfd[!(pi->pe.flags & O_WRONLY)]);
tmp = pfd[pi->pe.flags & O_WRONLY]; tmp = pfd[pi->pe.flags & O_WRONLY];
ret = set_fd_flags(tmp, pi->pe.flags);
if (ret < 0)
return -1;
if (restore_fown(tmp, &pi->pe.fown)) if (rst_file_params(tmp, &pi->pe.fown, pi->pe.flags))
return -1; return -1;
return tmp; return tmp;
......
...@@ -976,9 +976,7 @@ static int open_inet_sk(struct file_desc *d) ...@@ -976,9 +976,7 @@ static int open_inet_sk(struct file_desc *d)
} }
} }
if (set_fd_flags(sk, ii->ie.flags)) if (rst_file_params(sk, &ii->ie.fown, ii->ie.flags))
return -1;
if (restore_fown(sk, &ii->ie.fown))
goto err; goto err;
return sk; return sk;
...@@ -1172,9 +1170,7 @@ try_again: ...@@ -1172,9 +1170,7 @@ try_again:
if (restore_sk_queue(fle->fe.fd, peer->ue.id)) if (restore_sk_queue(fle->fe.fd, peer->ue.id))
return -1; return -1;
if (set_fd_flags(fle->fe.fd, ui->ue.flags)) if (rst_file_params(fle->fe.fd, &ui->ue.fown, ui->ue.flags))
return -1;
if (restore_fown(fle->fe.fd, &ui->ue.fown))
return -1; return -1;
cj = cj->next; cj = cj->next;
...@@ -1241,9 +1237,7 @@ static int open_unixsk_pair_master(struct unix_sk_info *ui) ...@@ -1241,9 +1237,7 @@ static int open_unixsk_pair_master(struct unix_sk_info *ui)
if (bind_unix_sk(sk[0], ui)) if (bind_unix_sk(sk[0], ui))
return -1; return -1;
if (set_fd_flags(sk[0], ui->ue.flags)) if (rst_file_params(sk[0], &ui->ue.fown, ui->ue.flags))
return -1;
if (restore_fown(sk[0], &ui->ue.fown))
return -1; return -1;
tsk = socket(PF_UNIX, SOCK_DGRAM, 0); tsk = socket(PF_UNIX, SOCK_DGRAM, 0);
...@@ -1284,10 +1278,9 @@ static int open_unixsk_pair_slave(struct unix_sk_info *ui) ...@@ -1284,10 +1278,9 @@ static int open_unixsk_pair_slave(struct unix_sk_info *ui)
if (bind_unix_sk(sk, ui)) if (bind_unix_sk(sk, ui))
return -1; return -1;
if (set_fd_flags(sk, ui->ue.flags)) if (rst_file_params(sk, &ui->ue.fown, ui->ue.flags))
return -1;
if (restore_fown(sk, &ui->ue.fown))
return -1; return -1;
return sk; return sk;
} }
...@@ -1314,9 +1307,7 @@ static int open_unixsk_standalone(struct unix_sk_info *ui) ...@@ -1314,9 +1307,7 @@ static int open_unixsk_standalone(struct unix_sk_info *ui)
return -1; return -1;
} }
if (set_fd_flags(sk, ui->ue.flags)) if (rst_file_params(sk, &ui->ue.fown, ui->ue.flags))
return -1;
if (restore_fown(sk, &ui->ue.fown))
return -1; return -1;
} else if (ui->peer) { } else if (ui->peer) {
pr_info("\tWill connect %#x to %#x later\n", ui->ue.id, ui->ue.peer); pr_info("\tWill connect %#x to %#x later\n", ui->ue.id, ui->ue.peer);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment