[Libsysio-commit] HEAD: libsysio/drivers/incore fs_incore.c
Brought to you by:
lward
|
From: Lee W. <lw...@us...> - 2003-09-27 20:19:13
|
Update of /cvsroot/libsysio/libsysio/drivers/incore
In directory sc8-pr-cvs1:/tmp/cvs-serv6348/drivers/incore
Modified Files:
fs_incore.c
Log Message:
- Better checking during chdir().
- Added _sysio_p_chdir() to call change working directory with a pnode.
- test_path.c doesn't follow symlinks anymore.
- sysio_stubs.c defined a bunch of disk ioctl's inappropriately. Removed.
- Added fchmod(), fchown(), rename(), link(), utime().
Index: fs_incore.c
===================================================================
RCS file: /cvsroot/libsysio/libsysio/drivers/incore/fs_incore.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -w -b -B -p -r1.5 -r1.6
--- fs_incore.c 31 Jul 2003 22:21:36 -0000 1.5
+++ fs_incore.c 27 Sep 2003 19:42:01 -0000 1.6
@@ -137,7 +137,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);
@@ -156,7 +158,6 @@ static int _sysio_incore_inop_statvfs(st
struct intnl_statvfs *buf);
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);
@@ -193,7 +194,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,
@@ -210,24 +213,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, \
- off64_t *))_sysio_incore_e_notdir
+ off64_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,
@@ -240,7 +247,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,
@@ -264,7 +273,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,
@@ -309,7 +320,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))
/*
@@ -353,11 +364,13 @@ _sysio_incore_init()
de->d_off = off = de->d_reclen = INCORE_D_RECLEN(1);
de->d_type = INCORE_D_TYPEOF(S_IFDIR);
de->d_name[0] = '.';
+ de->d_name[1] = ' ';
de = (void *)de + de->d_off;
de->d_reclen = INCORE_D_RECLEN(2);
de->d_off = off += de->d_reclen;
de->d_type = INCORE_D_TYPEOF(S_IFDIR);
de->d_name[0] = de->d_name[1] = '.';
+ de->d_name[2] = ' ';
return _sysio_fssw_register("incore", &incore_fssw_ops);
}
@@ -719,7 +732,8 @@ incore_directory_match(struct intnl_dire
struct lookup_data *ld)
{
- if (strncmp(de->d_name, ld->name->name, ld->name->len) == 0)
+ if (strlen(de->d_name) == ld->name->len &&
+ strncmp(de->d_name, ld->name->name, ld->name->len) == 0)
return de;
ld->de = de;
return NULL;
@@ -1006,6 +1020,7 @@ incore_directory_insert(struct incore_in
de->d_reclen = reclen;
de->d_type = type;
(void )memcpy(de->d_name, name->name, name->len);
+ de->d_name[name->len] = '\0';
/*
* Update attributes to reflect the new entry.
@@ -1114,6 +1129,12 @@ incore_unlink_entry(struct incore_inode
lookup_data.de->d_off = de->d_off; /* unlink */
(void )memset(de, 0, de->d_reclen); /* clear */
+ /*
+ * Adjust link count.
+ */
+ assert(icino->ici_st.st_nlink > 2);
+ icino->ici_st.st_nlink--;
+
return 0;
}
@@ -1145,6 +1166,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;
}
@@ -1242,6 +1269,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;
@@ -1251,7 +1366,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);
@@ -1472,7 +1586,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;
@@ -1498,13 +1613,6 @@ _sysio_incore_e_isdir(void)
{
return -EISDIR;
-}
-
-static int
-_sysio_incore_e_notdir(void)
-{
-
- return -ENOTDIR;
}
static int
|