create for regular file; mknod for spcial file. include simplified fuse_common.h to register file descriptor
This commit is contained in:
parent
88a15eb1a8
commit
39d6ab26ff
@ -1,5 +1,6 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <fs.h>
|
#include <fs.h>
|
||||||
|
#include "fuse_common.h"
|
||||||
#include "direntry.h"
|
#include "direntry.h"
|
||||||
|
|
||||||
class FilesOperation {
|
class FilesOperation {
|
||||||
@ -20,7 +21,8 @@ class FilesOperation {
|
|||||||
u_int64_t disk_namei(const char* path);
|
u_int64_t disk_namei(const char* path);
|
||||||
u_int64_t namei(const char* path);
|
u_int64_t namei(const char* path);
|
||||||
int fischl_mkdir(const char*, mode_t);
|
int fischl_mkdir(const char*, mode_t);
|
||||||
int fischl_mknod(const char*, mode_t);
|
int fischl_mknod(const char*, mode_t, dev_t);//for special file
|
||||||
|
int fischl_create(const char *, mode_t, struct fuse_file_info *);//for regular file
|
||||||
//int fischl_readdir(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *, enum fuse_readdir_flags);
|
//int fischl_readdir(const char *, void *, fuse_fill_dir_t, off_t, struct fuse_file_info *, enum fuse_readdir_flags);
|
||||||
int fischl_unlink (const char *);
|
int fischl_unlink (const char *);
|
||||||
//int fischl_open (const char *, struct fuse_file_info *);
|
//int fischl_open (const char *, struct fuse_file_info *);
|
||||||
|
82
include/fuse_common.h
Normal file
82
include/fuse_common.h
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#ifndef FUSE_COMMON_H_
|
||||||
|
#define FUSE_COMMON_H_
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Information about an open file.
|
||||||
|
*
|
||||||
|
* File Handles are created by the open, opendir, and create methods and closed
|
||||||
|
* by the release and releasedir methods. Multiple file handles may be
|
||||||
|
* concurrently open for the same file. Generally, a client will create one
|
||||||
|
* file handle per file descriptor, though in some cases multiple file
|
||||||
|
* descriptors can share a single file handle.
|
||||||
|
*/
|
||||||
|
struct fuse_file_info {
|
||||||
|
/** Open flags. Available in open() and release() */
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
/** In case of a write operation indicates if this was caused
|
||||||
|
by a delayed write from the page cache. If so, then the
|
||||||
|
context's pid, uid, and gid fields will not be valid, and
|
||||||
|
the *fh* value may not match the *fh* value that would
|
||||||
|
have been sent with the corresponding individual write
|
||||||
|
requests if write caching had been disabled. */
|
||||||
|
unsigned int writepage : 1;
|
||||||
|
|
||||||
|
/** Can be filled in by open/create, to use direct I/O on this file. */
|
||||||
|
unsigned int direct_io : 1;
|
||||||
|
|
||||||
|
/** Can be filled in by open and opendir. It signals the kernel that any
|
||||||
|
currently cached data (ie., data that the filesystem provided the
|
||||||
|
last time the file/directory was open) need not be invalidated when
|
||||||
|
the file/directory is closed. */
|
||||||
|
unsigned int keep_cache : 1;
|
||||||
|
|
||||||
|
/** Can be filled by open/create, to allow parallel direct writes on this
|
||||||
|
* file */
|
||||||
|
unsigned int parallel_direct_writes : 1;
|
||||||
|
|
||||||
|
/** Indicates a flush operation. Set in flush operation, also
|
||||||
|
maybe set in highlevel lock operation and lowlevel release
|
||||||
|
operation. */
|
||||||
|
unsigned int flush : 1;
|
||||||
|
|
||||||
|
/** Can be filled in by open, to indicate that the file is not
|
||||||
|
seekable. */
|
||||||
|
unsigned int nonseekable : 1;
|
||||||
|
|
||||||
|
/* Indicates that flock locks for this file should be
|
||||||
|
released. If set, lock_owner shall contain a valid value.
|
||||||
|
May only be set in ->release(). */
|
||||||
|
unsigned int flock_release : 1;
|
||||||
|
|
||||||
|
/** Can be filled in by opendir. It signals the kernel to
|
||||||
|
enable caching of entries returned by readdir(). Has no
|
||||||
|
effect when set in other contexts (in particular it does
|
||||||
|
nothing when set by open()). */
|
||||||
|
unsigned int cache_readdir : 1;
|
||||||
|
|
||||||
|
/** Can be filled in by open, to indicate that flush is not needed
|
||||||
|
on close. */
|
||||||
|
unsigned int noflush : 1;
|
||||||
|
|
||||||
|
/** Padding. Reserved for future use*/
|
||||||
|
unsigned int padding : 23;
|
||||||
|
unsigned int padding2 : 32;
|
||||||
|
|
||||||
|
/** File handle id. May be filled in by filesystem in create,
|
||||||
|
* open, and opendir(). Available in most other file operations on the
|
||||||
|
* same file handle. */
|
||||||
|
uint64_t fh;
|
||||||
|
|
||||||
|
/** Lock owner id. Available in locking operations and flush */
|
||||||
|
uint64_t lock_owner;
|
||||||
|
|
||||||
|
/** Requested poll events. Available in ->poll. Only set on kernels
|
||||||
|
which support it. If unsupported, this field is set to zero. */
|
||||||
|
uint32_t poll_events;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* FUSE_COMMON_H_ */
|
@ -281,8 +281,10 @@ int FilesOperation::fischl_mkdir(const char* path, mode_t mode) {
|
|||||||
delete pathdup;
|
delete pathdup;
|
||||||
return 0;//SUCCESS
|
return 0;//SUCCESS
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
int FilesOperation::fischl_mknod(const char* path, mode_t mode) {
|
special file
|
||||||
|
*/
|
||||||
|
int FilesOperation::fischl_mknod(const char* path, mode_t mode, dev_t dev) {
|
||||||
//check path
|
//check path
|
||||||
char *pathdup = strdup(path);
|
char *pathdup = strdup(path);
|
||||||
char *lastSlash = strrchr(pathdup, '/');
|
char *lastSlash = strrchr(pathdup, '/');
|
||||||
@ -305,6 +307,34 @@ int FilesOperation::fischl_mknod(const char* path, mode_t mode) {
|
|||||||
delete pathdup;
|
delete pathdup;
|
||||||
return 0;//SUCESS
|
return 0;//SUCESS
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
regular file
|
||||||
|
*/
|
||||||
|
int FilesOperation::fischl_create(const char* path, mode_t mode, struct fuse_file_info* fi) {
|
||||||
|
//check path
|
||||||
|
char *pathdup = strdup(path);
|
||||||
|
char *lastSlash = strrchr(pathdup, '/');
|
||||||
|
*lastSlash = '\0'; // Split the string into parent path and new directory name; <parent path>\0<direcotry name>
|
||||||
|
char *newFilename = lastSlash+1; //\0<direcotry name>, get from <direcotry name>
|
||||||
|
char *ParentPath = pathdup;//pathdup are separated by pathdup, so it take <parent path> only
|
||||||
|
// fprintf(stderr,"[%s ,%d] ParentPath:%s, strlen=%d\n",__func__,__LINE__, ParentPath, strlen(ParentPath));
|
||||||
|
FileNode *parent_filenode = strlen(ParentPath)? fischl_find_entry(root_node, ParentPath): root_node->self_info;
|
||||||
|
if (parent_filenode == NULL) {
|
||||||
|
fprintf(stderr,"[%s ,%d] ParentPath:{%s} not found\n",__func__,__LINE__, ParentPath);
|
||||||
|
delete pathdup;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
u_int64_t parent_inode_number = parent_filenode->inode_number;
|
||||||
|
//make new inode
|
||||||
|
INode* ret = create_new_inode(parent_inode_number, newFilename, mode);
|
||||||
|
if (ret == NULL) return -1;//ENOSPC but create_new_inode handle ENAMETOOLONG EEXIST
|
||||||
|
//make new node in RAM
|
||||||
|
fischl_add_entry(parent_filenode->subdirectory, ret->block_number, newFilename, ret);
|
||||||
|
//directly give inode number rather than create file descriptor table
|
||||||
|
fi->fh = ret->block_number;//assign file descriptor as inode number to fuse system
|
||||||
|
delete pathdup;
|
||||||
|
return 0;//SUCESS
|
||||||
|
}
|
||||||
|
|
||||||
void FilesOperation::unlink_inode(u_int64_t inode_number) {
|
void FilesOperation::unlink_inode(u_int64_t inode_number) {
|
||||||
INode inode;
|
INode inode;
|
||||||
|
@ -37,14 +37,15 @@ int total_free_file = 0;
|
|||||||
TEST(FileOperationTest, MkdirnodTest) {
|
TEST(FileOperationTest, MkdirnodTest) {
|
||||||
|
|
||||||
fsop->initialize_rootinode();
|
fsop->initialize_rootinode();
|
||||||
|
struct fuse_file_info fi;
|
||||||
|
|
||||||
mode_t mode;//set mode
|
mode_t mode;//set mode
|
||||||
mode = S_IRWXU | S_IRWXG | S_IRWXO;//future should test permission
|
mode = S_IRWXU | S_IRWXG | S_IRWXO;//future should test permission
|
||||||
//S_IRWXU(S_IRUSR | S_IWUSR | S_IXUSR) (owner), S_IRWXG(S_IRGRP | S_IWGRP | S_IXGRP) (group), S_IRWXO(S_IROTH | S_IWOTH | S_IXOTH)
|
//S_IRWXU(S_IRUSR | S_IWUSR | S_IXUSR) (owner), S_IRWXG(S_IRGRP | S_IWGRP | S_IXGRP) (group), S_IRWXO(S_IROTH | S_IWOTH | S_IXOTH)
|
||||||
EXPECT_EQ(fsop->fischl_mknod("/test", mode), 0); // mode here is not used yet
|
EXPECT_EQ(fsop->fischl_create("/test", mode, &fi), 0); // mode here is not used yet
|
||||||
EXPECT_EQ(fsop->fischl_mkdir("/foo", mode), 0);
|
EXPECT_EQ(fsop->fischl_mkdir("/foo", mode), 0);
|
||||||
EXPECT_EQ(fsop->fischl_mkdir("/foo/bar", mode),0);
|
EXPECT_EQ(fsop->fischl_mkdir("/foo/bar", mode),0);
|
||||||
EXPECT_EQ(fsop->fischl_mknod("/foo/bar/baz", mode), 0);
|
EXPECT_EQ(fsop->fischl_create("/foo/bar/baz", mode, &fi), 0);
|
||||||
// the following three testcases will fail
|
// the following three testcases will fail
|
||||||
EXPECT_TRUE(fsop->fischl_mkdir("foo/bar", mode) < 0);
|
EXPECT_TRUE(fsop->fischl_mkdir("foo/bar", mode) < 0);
|
||||||
EXPECT_TRUE(fsop->fischl_mkdir("/doesnt_exist/bar", mode) < 0);
|
EXPECT_TRUE(fsop->fischl_mkdir("/doesnt_exist/bar", mode) < 0);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user