[Libsysio-commit] RedStorm_merge: libsysio/drivers/incore fs_incore.c
Brought to you by:
lward
|
From: Sonja T. <so...@us...> - 2003-10-09 15:04:19
|
Update of /cvsroot/libsysio/libsysio/drivers/incore
In directory sc8-pr-cvs1:/tmp/cvs-serv7240/drivers/incore
Modified Files:
Tag: RedStorm_merge
fs_incore.c
Log Message:
Merging redstorm changes
Index: fs_incore.c
===================================================================
RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v
retrieving revision 1.4.4.2
retrieving revision 1.4.4.2.2.1
diff -u -w -b -B -p -r1.4.4.2 -r1.4.4.2.2.1
--- fs_incore.c 19 May 2003 14:25:24 -0000 1.4.4.2
+++ fs_incore.c 9 Oct 2003 15:04:09 -0000 1.4.4.2.2.1
@@ -56,9 +56,7 @@
#include <sys/types.h>
#include <dirent.h>
#include <sys/stat.h>
-#ifdef _HAVE_STATVFS
#include <sys/statvfs.h>
-#endif
#include <sys/queue.h>
#include "sysio.h"
@@ -74,6 +72,9 @@
* In-core file system pseudo-driver.
*/
+#ifndef REDSTORM
+#define _DIRENT_HAVE_D_OFF
+#endif
/*
* Pseudo-blocksize.
*/
@@ -139,7 +140,9 @@ static int _sysio_incore_dirop_mkdir(str
static int _sysio_incore_dirop_rmdir(struct pnode *pno);
static int _sysio_incore_inop_open(struct pnode *pno, int flags, mode_t mode);
static int _sysio_incore_inop_close(struct inode *ino);
+static int _sysio_incore_dirop_link(struct pnode *old, struct pnode *new);
static int _sysio_incore_dirop_unlink(struct pnode *pno);
+static int _sysio_incore_dirop_rename(struct pnode *old, struct pnode *new);
static int _sysio_incore_filop_ipreadv(struct inode *ino,
struct io_arguments *ioargs,
struct ioctx **ioctxp);
@@ -153,14 +156,11 @@ static int _sysio_incore_filop_ioctl(str
unsigned long int request,
va_list ap);
static int _sysio_incore_dirop_mknod(struct pnode *pno, mode_t mode, dev_t dev);
-#ifdef _HAVE_STATVFS
static int _sysio_incore_inop_statvfs(struct pnode *pno,
struct inode *ino,
struct intnl_statvfs *buf);
-#endif
static void _sysio_incore_inop_gone(struct inode *ino);
static int _sysio_incore_e_isdir(void);
-static int _sysio_incore_e_notdir(void);
static int _sysio_incore_e_inval(void);
static int _sysio_incore_e_nosys(void);
static void _sysio_incore_illop(void);
@@ -197,7 +197,9 @@ static struct inode_ops _sysio_incore_di
_sysio_incore_dirop_readlink,
_sysio_incore_inop_open,
_sysio_incore_inop_close,
+ _sysio_incore_dirop_link,
_sysio_incore_dirop_unlink,
+ _sysio_incore_dirop_rename,
_sysio_incore_dirop_ipreadv,
_sysio_incore_dirop_ipwritev,
_sysio_incore_dirop_iodone,
@@ -206,9 +208,7 @@ static struct inode_ops _sysio_incore_di
_sysio_incore_inop_sync,
_sysio_incore_dirop_ioctl,
_sysio_incore_dirop_mknod,
-#ifdef _HAVE_STATVFS
_sysio_incore_inop_statvfs,
-#endif
_sysio_incore_inop_gone
};
@@ -216,24 +216,28 @@ static struct inode_ops _sysio_incore_di
(int (*)(struct pnode *, \
struct inode **, \
struct intent *, \
- const char *))_sysio_incore_e_notdir
+ const char *))_sysio_incore_illop
#define _sysio_incore_filop_getdirentries \
(ssize_t (*)(struct inode *, \
char *, \
size_t, \
- _SYSIO_OFF_T *))_sysio_incore_e_notdir
+ _SYSIO_OFF_T *))_sysio_incore_illop
#define _sysio_incore_filop_mkdir \
- (int (*)(struct pnode *, mode_t))_sysio_incore_e_notdir
+ (int (*)(struct pnode *, mode_t))_sysio_incore_illop
#define _sysio_incore_filop_rmdir \
- (int (*)(struct pnode *))_sysio_incore_e_notdir
+ (int (*)(struct pnode *))_sysio_incore_illop
#define _sysio_incore_filop_symlink \
(int (*)(struct pnode *, const char *))_sysio_incore_illop
#define _sysio_incore_symlinkop_readlink \
(int (*)(struct pnode *, char *, size_t))_sysio_incore_illop
+#define _sysio_incore_filop_link \
+ (int (*)(struct pnode *old, struct pnode *new))_sysio_incore_illop
#define _sysio_incore_filop_unlink \
- (int (*)(struct pnode *pno))_sysio_incore_e_notdir
+ (int (*)(struct pnode *pno))_sysio_incore_illop
+#define _sysio_incore_filop_rename \
+ (int (*)(struct pnode *old, struct pnode *new))_sysio_incore_illop
#define _sysio_incore_filop_mknod \
- (int (*)(struct pnode *pno, mode_t, dev_t))_sysio_incore_e_notdir
+ (int (*)(struct pnode *pno, mode_t, dev_t))_sysio_incore_illop
static struct inode_ops _sysio_incore_file_ops = {
_sysio_incore_filop_lookup,
@@ -246,7 +250,9 @@ static struct inode_ops _sysio_incore_fi
_sysio_incore_symlinkop_readlink,
_sysio_incore_inop_open,
_sysio_incore_inop_close,
+ _sysio_incore_filop_link,
_sysio_incore_filop_unlink,
+ _sysio_incore_filop_rename,
_sysio_incore_filop_ipreadv,
_sysio_incore_filop_ipwritev,
_sysio_incore_filop_iodone,
@@ -255,9 +261,7 @@ static struct inode_ops _sysio_incore_fi
_sysio_incore_inop_sync,
_sysio_incore_filop_ioctl,
_sysio_incore_filop_mknod,
-#ifdef _HAVE_STATVFS
_sysio_incore_inop_statvfs,
-#endif
_sysio_incore_inop_gone
};
@@ -272,7 +276,9 @@ static struct inode_ops _sysio_incore_de
_sysio_incore_symlinkop_readlink,
_sysio_nodev_inop_open,
_sysio_nodev_inop_close,
+ _sysio_incore_filop_link,
_sysio_incore_filop_unlink,
+ _sysio_incore_filop_rename,
_sysio_nodev_inop_ipreadv,
_sysio_nodev_inop_ipwritev,
_sysio_nodev_inop_iodone,
@@ -281,9 +287,7 @@ static struct inode_ops _sysio_incore_de
_sysio_nodev_inop_sync,
_sysio_nodev_inop_ioctl,
_sysio_incore_filop_mknod,
-#ifdef _HAVE_STATVFS
_sysio_incore_inop_statvfs,
-#endif
_sysio_incore_inop_gone
};
@@ -319,7 +323,7 @@ struct lookup_data {
*/
#define INCORE_D_RECLEN(namlen) \
(((size_t )&((struct intnl_dirent *)0)->d_name + \
- (namlen) + sizeof(void *)) & \
+ (namlen) + 1 + sizeof(void *)) & \
~(sizeof(void *) - 1))
/*
@@ -369,17 +374,20 @@ _sysio_incore_init()
#ifdef _DIRENT_HAVE_D_NAMLEN
de->d_namlen = 1;
#endif
+ /*
+ * Move to entry for `..'
+ */
de = (void *)de + off;
de->d_reclen = INCORE_D_RECLEN(2);
+#ifdef _DIRENT_HAVE_D_NAMLEN
+ de->d_namlen = 2;
+#endif
#ifdef _DIRENT_HAVE_D_OFF
de->d_off =
#endif
off += de->d_reclen;
de->d_type = INCORE_D_TYPEOF(S_IFDIR);
de->d_name[0] = de->d_name[1] = '.';
-#ifdef _DIRENT_HAVE_D_NAMLEN
- de->d_namlen = 2;
-#endif
return _sysio_fssw_register("incore", &incore_fssw_ops);
}
@@ -736,12 +744,20 @@ incore_directory_probe(void *data,
de->d_off - origin;
#else
((void *)de - data) + de->d_reclen;
-#endif
+#endif/*
if (hole) {
p = (*hole)((void *)de, de->d_reclen, arg);
if (p)
return p;
}
+ */
+ if (hole && n > de->d_reclen) {
+ p = (*hole)((void *)de + de->d_reclen,
+ n-de->d_reclen,
+ arg);
+ if (p)
+ return p;
+ }
if (n >= siz)
break;
de = data + n;
@@ -764,8 +780,7 @@ incore_directory_match(struct intnl_dire
#ifdef _DIRENT_HAVE_D_NAMLEN
ld->name->len == de->d_namlen &&
#endif
- strncmp(de->d_name, ld->name->name, ld->name->len) == 0
- )
+ strncmp(de->d_name, ld->name->name, ld->name->len) == 0)
return de;
ld->de = de;
return NULL;
@@ -1041,12 +1056,18 @@ incore_directory_insert(struct incore_in
de->d_reclen;
#else
INCORE_D_RECLEN(de->d_namlen);
-#endif
+#endif/*
if (!parent->ici_st.st_size ||
- xt + r + reclen > (size_t )parent->ici_st.st_size) {
+ xt + r + reclen > (size_t )parent->ici_st.st_size) {*/
+ if (n >= (size_t) parent->ici_st.st_size) {
int err;
- err = incore_trunc(parent, xt + r + reclen, 1);
+ /* err = incore_trunc(parent, xt + r + reclen, 1);*/
+ err =
+ incore_trunc(parent,
+ ((size_t)((void *)de - parent->ici_data +
+ de->d_reclen + reclen)),
+ 1);
if (err)
return err;
de = parent->ici_data + xt;
@@ -1115,7 +1137,7 @@ _sysio_incore_dirop_mkdir(struct pnode *
struct incore_inode *icino, *parent;
ino_t inum;
int err;
- struct intnl_dirent *de;
+ struct intnl_dirent *de = NULL;
struct inode *ino;
ino = pno->p_parent->p_base->pb_ino;
@@ -1220,6 +1242,12 @@ incore_unlink_entry(struct incore_inode
lookup_data.de->d_off = off;
#endif
+ /*
+ * Adjust link count.
+ */
+ assert(icino->ici_st.st_nlink > 2);
+ icino->ici_st.st_nlink--;
+
return 0;
}
@@ -1251,6 +1279,12 @@ _sysio_incore_dirop_rmdir(struct pnode *
return err;
I_RELE(ino);
+ /*
+ * Adjust link count.
+ */
+ assert(icino->ici_st.st_nlink > 2);
+ icino->ici_st.st_nlink--;
+
return 0;
}
@@ -1348,6 +1383,94 @@ _sysio_incore_inop_close(struct inode *i
}
static int
+_sysio_incore_dirop_link(struct pnode *old, struct pnode *new)
+{
+ struct incore_inode *icino = I2IC(old->p_base->pb_ino);
+ int err;
+
+ assert(!new->p_base->pb_ino);
+ assert(!S_ISDIR(old->p_base->pb_ino->i_mode));
+
+ /*
+ * Can bump the link count?
+ */
+ if (!(icino->ici_st.st_nlink + 1))
+ return -EMLINK;
+ /*
+ * Insert into parent.
+ */
+ err =
+ incore_directory_insert(I2IC(new->p_parent->p_base->pb_ino),
+ &new->p_base->pb_name,
+ icino->ici_st.st_ino,
+ INCORE_D_TYPEOF(icino->ici_st.st_mode));
+ if (err)
+ return err;
+ /*
+ * Bump the link count.
+ */
+ icino->ici_st.st_nlink++;
+
+ return 0;
+}
+
+static int
+_sysio_incore_dirop_rename(struct pnode *old, struct pnode *new)
+{
+ int err;
+ struct incore_inode *icino = I2IC(old->p_base->pb_ino);
+
+ if (new->p_base->pb_ino) {
+ /*
+ * Have to kill off the target first.
+ */
+ if (S_ISDIR(I2IC(new->p_base->pb_ino)->ici_st.st_mode) &&
+ I2IC(new->p_base->pb_ino)->ici_st.st_nlink > 2)
+ return -ENOTEMPTY;
+ err =
+ incore_unlink_entry(I2IC(new->p_parent->p_base->pb_ino),
+ &new->p_base->pb_name);
+ if (err)
+ return err;
+ I_RELE(new->p_base->pb_ino);
+ _sysio_i_gone(new->p_base->pb_ino);
+ new->p_base->pb_ino = NULL;
+ }
+
+ /*
+ * Insert into new parent.
+ */
+ err =
+ incore_directory_insert(I2IC(new->p_parent->p_base->pb_ino),
+ &new->p_base->pb_name,
+ icino->ici_st.st_ino,
+ INCORE_D_TYPEOF(icino->ici_st.st_mode));
+ if (err)
+ abort();
+ /*
+ * Remove from the old parent.
+ */
+ err =
+ incore_unlink_entry(I2IC(old->p_parent->p_base->pb_ino),
+ &old->p_base->pb_name);
+ if (err)
+ abort();
+
+ if (S_ISDIR(icino->ici_st.st_mode)) {
+ struct intnl_dirent *de;
+
+ /*
+ * We moved a directory. The entry for `..' must be corrected.
+ */
+ de = icino->ici_data;
+ de++;
+ assert(strcmp(de->d_name, "..") == 0);
+ de->d_ino = I2IC(new->p_parent->p_base->pb_ino)->ici_st.st_ino;
+ }
+ return 0;
+}
+
+static int
_sysio_incore_dirop_unlink(struct pnode *pno)
{
struct inode *ino = pno->p_base->pb_ino;
@@ -1357,7 +1480,6 @@ _sysio_incore_dirop_unlink(struct pnode
if (S_ISDIR(icino->ici_st.st_mode))
return -EISDIR;
- pno->p_base->pb_ino = NULL;
err =
incore_unlink_entry(I2IC(pno->p_parent->p_base->pb_ino),
&pno->p_base->pb_name);
@@ -1377,7 +1499,7 @@ incore_doio(ssize_t (*f)(struct incore_i
struct ioctx *ioctx;
const struct iovec *iov;
size_t n;
- ssize_t cc;
+ ssize_t cc = 0;
ioctx = _sysio_ioctx_new(ino, ioargs);
if (!ioctx)
@@ -1558,7 +1680,6 @@ _sysio_incore_dirop_mknod(struct pnode *
return incore_create(pno, &stat);
}
-#ifdef _HAVE_STATVFS
static int
_sysio_incore_inop_statvfs(struct pnode *pno,
struct inode *ino,
@@ -1579,7 +1700,8 @@ _sysio_incore_inop_statvfs(struct pnode
*/
buf->f_bsize = fs->fs_bsize;
buf->f_frsize = buf->f_bsize;
- buf->f_blocks = (0xffffffffffffffff - 1) / buf->f_bsize;
+ buf->f_blocks = ~0;
+ buf->f_blocks /= buf->f_bsize;
buf->f_bfree = buf->f_blocks - 1;
buf->f_bavail = buf->f_bfree;
buf->f_files = buf->f_blocks;
@@ -1591,7 +1713,6 @@ _sysio_incore_inop_statvfs(struct pnode
return 0;
}
-#endif
void
_sysio_incore_inop_gone(struct inode *ino)
@@ -1606,13 +1727,6 @@ _sysio_incore_e_isdir(void)
{
return -EISDIR;
-}
-
-static int
-_sysio_incore_e_notdir(void)
-{
-
- return -ENOTDIR;
}
static int
|