Track memory mappings. Close file handles already in close() if there

are no active mappings, otherwise do the standard inactive() run.
This commit is contained in:
pooka 2007-07-27 09:46:27 +00:00
parent 828aae6ba6
commit 1aba0dbed1
3 changed files with 62 additions and 14 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: node.c,v 1.35 2007/07/19 10:14:53 pooka Exp $ */
/* $NetBSD: node.c,v 1.36 2007/07/27 09:46:27 pooka Exp $ */
/*
* Copyright (c) 2006 Antti Kantee. All Rights Reserved.
@ -27,7 +27,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: node.c,v 1.35 2007/07/19 10:14:53 pooka Exp $");
__RCSID("$NetBSD: node.c,v 1.36 2007/07/27 09:46:27 pooka Exp $");
#endif /* !lint */
#include <assert.h>
@ -200,6 +200,21 @@ psshfs_node_create(struct puffs_cc *pcc, void *opc, struct puffs_newinfo *pni,
PSSHFSRETURN(rv);
}
int
psshfs_node_mmap(struct puffs_cc* pcc, void *opc, vm_prot_t prot,
const struct puffs_cred *pcr, const struct puffs_cid *pcid)
{
struct puffs_node *pn = opc;
struct psshfs_node *psn = pn->pn_data;
if (prot & (VM_PROT_READ | VM_PROT_EXECUTE))
psn->stat |= PSN_READMAP;
if (prot & VM_PROT_WRITE)
psn->stat |= PSN_WRITEMAP;
return 0;
}
int
psshfs_node_open(struct puffs_cc *pcc, void *opc, int mode,
const struct puffs_cred *pcr, const struct puffs_cid *pcid)
@ -237,22 +252,22 @@ psshfs_node_open(struct puffs_cc *pcc, void *opc, int mode,
}
out:
if (rv == 0)
psn->opencount++;
PSSHFSRETURN(rv);
}
int
psshfs_node_inactive(struct puffs_cc *pcc, void *opc,
const struct puffs_cid *pcid)
static int
closehandles(struct puffs_cc *pcc, struct psshfs_node *psn)
{
struct psshfs_ctx *pctx = puffs_cc_getspecific(pcc);
struct puffs_usermount *pu = puffs_cc_getusermount(pcc);
struct puffs_node *pn = opc;
struct psshfs_node *psn = pn->pn_data;
uint32_t reqid = NEXTREQ(pctx);
struct psshfs_ctx *pctx = puffs_cc_getspecific(pcc);
struct puffs_framebuf *pb1, *pb2;
uint32_t reqid = NEXTREQ(pctx);
int rv;
if (psn->fhand_r) {
if ((psn->stat & PSN_READMAP) == 0 && psn->fhand_r) {
pb1 = psbuf_makeout();
psbuf_req_data(pb1, SSH_FXP_CLOSE, reqid,
psn->fhand_r, psn->fhand_r_len);
@ -260,7 +275,7 @@ psshfs_node_inactive(struct puffs_cc *pcc, void *opc,
free(psn->fhand_r);
psn->fhand_r = NULL;
}
if (psn->fhand_w) {
if ((psn->stat & PSN_WRITEMAP) == 0 && psn->fhand_w) {
pb2 = psbuf_makeout();
psbuf_req_data(pb2, SSH_FXP_CLOSE, reqid,
psn->fhand_w, psn->fhand_w_len);
@ -270,6 +285,34 @@ psshfs_node_inactive(struct puffs_cc *pcc, void *opc,
}
out:
return rv;
}
int
psshfs_node_close(struct puffs_cc *pcc, void *opc, int flags,
const struct puffs_cred *pcr, const struct puffs_cid *pcid)
{
struct puffs_node *pn = opc;
struct psshfs_node *psn = pn->pn_data;
assert(psn->opencount != 0);
if (--psn->opencount == 0)
closehandles(pcc, psn);
return 0;
}
int
psshfs_node_inactive(struct puffs_cc *pcc, void *opc,
const struct puffs_cid *pcid)
{
struct puffs_node *pn = opc;
struct psshfs_node *psn = pn->pn_data;
assert(psn->opencount == 0);
psn->stat &= ~(PSN_READMAP | PSN_WRITEMAP);
closehandles(pcc, psn);
return 0;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: psshfs.c,v 1.33 2007/07/17 11:34:54 pooka Exp $ */
/* $NetBSD: psshfs.c,v 1.34 2007/07/27 09:46:27 pooka Exp $ */
/*
* Copyright (c) 2006 Antti Kantee. All Rights Reserved.
@ -41,7 +41,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: psshfs.c,v 1.33 2007/07/17 11:34:54 pooka Exp $");
__RCSID("$NetBSD: psshfs.c,v 1.34 2007/07/27 09:46:27 pooka Exp $");
#endif /* !lint */
#include <sys/types.h>
@ -157,6 +157,8 @@ main(int argc, char *argv[])
PUFFSOP_SET(pops, psshfs, node, lookup);
PUFFSOP_SET(pops, psshfs, node, create);
PUFFSOP_SET(pops, psshfs, node, open);
PUFFSOP_SET(pops, psshfs, node, close);
PUFFSOP_SET(pops, psshfs, node, mmap);
PUFFSOP_SET(pops, psshfs, node, inactive);
PUFFSOP_SET(pops, psshfs, node, readdir);
PUFFSOP_SET(pops, psshfs, node, getattr);

View File

@ -1,4 +1,4 @@
/* $NetBSD: psshfs.h,v 1.21 2007/07/07 21:14:27 pooka Exp $ */
/* $NetBSD: psshfs.h,v 1.22 2007/07/27 09:46:28 pooka Exp $ */
/*
* Copyright (c) 2006, 2007 Antti Kantee. All Rights Reserved.
@ -115,6 +115,7 @@ struct psshfs_node {
int childcount;
int stat;
int opencount;
time_t attrread;
struct puffs_framebuf *getattr_pb;
@ -126,6 +127,8 @@ struct psshfs_node {
};
#define PSN_RECLAIMED 0x01
#define PSN_HASFH 0x02
#define PSN_READMAP 0x04
#define PSN_WRITEMAP 0x08
struct psshfs_ctx {
int sshfd;