From 4f08e41c70ece13de760b45bf1391b79289cfe17 Mon Sep 17 00:00:00 2001 From: "Michael I. Bushnell" Date: Thu, 3 Feb 1994 20:20:44 +0000 Subject: Initial revision --- libdiskfs/conch-fetch.c | 49 ++++++++++++++++++++++++++++++++++ libdiskfs/conch-set.c | 52 ++++++++++++++++++++++++++++++++++++ libdiskfs/io-prenotify.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++ libdiskfs/io-stubs.c | 54 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 223 insertions(+) create mode 100644 libdiskfs/conch-fetch.c create mode 100644 libdiskfs/conch-set.c create mode 100644 libdiskfs/io-prenotify.c create mode 100644 libdiskfs/io-stubs.c (limited to 'libdiskfs') diff --git a/libdiskfs/conch-fetch.c b/libdiskfs/conch-fetch.c new file mode 100644 index 00000000..17719bd3 --- /dev/null +++ b/libdiskfs/conch-fetch.c @@ -0,0 +1,49 @@ +/* + Copyright (C) 1994 Free Software Foundation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "priv.h" + +/* Update our copy of the relevant fields from a shared page. Callers + must have the share lock on the shared page as well as the inode + toplock. This is called by the conch management facilities of + libioserver as well as by us. */ +void +ioserver_fetch_shared_data (void *arg) +{ + struct protid *cred = arg; + + if (cred->mapped->file_size < cred->po->np->dn_stat.st_size) + cred->mapped->file_size = cred->po->np->dn_stat.st_size; + else if (cred->po->np->dn_stat.st_size != cred->mapped->file_size + && !readonly) + { + cred->po->np->dn_stat.st_size = cred->mapped->file_size; + cred->po->np->dn_set_ctime = 1; + } + + cred->po->filepointer = cred->mapped->xx_file_pointer; + + if (!readonly) + { + if (cred->mapped->written) + cred->po->ip->dn_set_mtime = 1; + if (cred->mapped->accessed) + cred->po->ip->dn_set_atime = 1; + } + cred->mapped->written = 0; + cred->mapped->accessed = 0; +} diff --git a/libdiskfs/conch-set.c b/libdiskfs/conch-set.c new file mode 100644 index 00000000..4c58c071 --- /dev/null +++ b/libdiskfs/conch-set.c @@ -0,0 +1,52 @@ +/* + Copyright (C) 1994 Free Software Foundation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "priv.h" + +/* Write current values into the shared page. Callers must have the + share lock on the shared page, as well as the inode toplock. + This is called by the conch management facilities of libioserver + as well as by us. */ +error_t +ioserver_put_shared_data (void *arg) +{ + struct protid *cred = arg; + error_t error; + + if (!(error = catch_exception ())) + { + cred->mapped->append_mode = (cred->po->openstat & O_APPEND); + cred->mapped->eof_notify = 0; + cred->mapped->do_sigio = 0; + cred->mapped->use_file_size = 1; + cred->mapped->use_read_size = 0; + cred->mapped->seekable = 1; + cred->mapped->use_prenotify_size = 1; + cred->mapped->use_postnotify_size = 0; + cred->mapped->prenotify_size = cred->po->ip->i_allocsize; + + cred->mapped->xx_file_pointer = cred->po->filepointer; + cred->mapped->rd_file_pointer = -1; + cred->mapped->wr_file_pointer = -1; + cred->mapped->file_size = cred->po->ip->di->di_size; + cred->mapped->written = 0; + cred->mapped->accessed = 0; + + end_catch_exception (); + } + return error; +} diff --git a/libdiskfs/io-prenotify.c b/libdiskfs/io-prenotify.c new file mode 100644 index 00000000..fc6048ec --- /dev/null +++ b/libdiskfs/io-prenotify.c @@ -0,0 +1,68 @@ +/* + Copyright (C) 1994 Free Software Foundation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "priv.h" + +/* Implement io_prenotify as described in . + + We set the prenotify size to be the allocated size of the file; + then users are forced to call this routine before writing past + that, and we can do allocation (orreturn ENOSPC if necessary. */ +error_t +diskfs_S_io_prenotify (struct protid *cred, + int start, + int end) +{ + struct node *np; + int err = 0; + + if (!cred) + return EOPNOTSUPP; + + np = cred->po->np; + + /* Clamp it down */ + mutex_lock (&np->lock); + + if (!cred->mapped) + { + err = EINVAL; + goto out; + } + + err = ioserver_verify_user_conch (&np->conch, cred); + if (err) + goto out; + + ioserver_fetch_shared_data (cred); + + if (end < np->allocsize) + { + /* The user is either foolin' with us, or has the wrong + prenotify size, hence the diagnostic. */ + printf ("io_prenotify: unnecessary call\n"); + spin_lock (&cred->mapped->lock); + err = ioserver_put_shared_data (cred); + spin_unlock (&cred->mapped->lock); + goto out; + } + + err = file_extend (np, end, cred); + out: + mutex_unlock (&np->i_toplock); + return err; +} diff --git a/libdiskfs/io-stubs.c b/libdiskfs/io-stubs.c new file mode 100644 index 00000000..debb0fed --- /dev/null +++ b/libdiskfs/io-stubs.c @@ -0,0 +1,54 @@ +/* + Copyright (C) 1994 Free Software Foundation + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "priv.h" + +/* Unimplemented stubs. */ + +/* Implement io_readsleep as described in + Semantics of ordinary files say this shouldn't happen, because + we never set use_read_size in the shared data. */ +error_t +S_io_readsleep (struct protid *cred) +{ + if (!cred) + return EOPNOTSUPP; + + return 0; +} + +/* Implement io_eofnotify as described in . + We don't use this feature. */ +error_t +S_io_eofnotify (struct protid *cred) +{ + if (!cred) + return EOPNOTSUPP; + + return 0; +} + +/* Implement io_sigio as described in . + We do this (in theory) but async IO is implemented here yet. */ +error_t +S_io_sigio (struct protid *cred) +{ + if (!cred) + return EOPNOTSUPP; + + return 0; +} -- cgit v1.2.3