- BBFS is a good starting point to develop a file system in C
- Application should keep in mind file offset before issuing a request. A write should be followed with a seek to offset zero, before issuing read.
- FUSE 2.7 reads 8K data by default, in two 4K chunks
- Read happens in last 4K and the first 4K data block
Example:
I had set the file size as 4MB in getattr () implementation.
int bb_getattr(const char *path, struct stat *statbuf)
{
int retstat = 0;
char fpath[PATH_MAX];
bb_fullpath(fpath, path);
memset(statbuf, 0, sizeof(struct stat));
if (strcmp(path, "/") == 0) {
statbuf->st_mode = S_IFDIR | 0755;
statbuf->st_nlink = 2;
} else {
statbuf->st_mode = S_IFREG | 0444;
statbuf->st_nlink = 1;
statbuf->st_size = 4 * 1024* 1024;
}
return retstat;
}
The sequence of calls and their arguments is as follows:
bb_getattr(path="/abcd.txt", statbuf=0xc5387960)
bb_fullpath: rootdir = "/tmp", path = "/abcd.txt", fpath = "/tmp/abcd.txt"
bb_open(path"/abcd.txt", fi=0xc5daaa50)
bb_fullpath: rootdir = "/tmp", path = "/abcd.txt", fpath = "/tmp/abcd.txt"
fi:
flags = 0x00008002
fh_old = 0x00000000
writepage = 0
direct_io = 0
keep_cache = 0
fh = 0x0000000000000001
lock_owner = 0x0000000000000000
bb_write(path="/abcd.txt", buf=0xc4966050, size=10, offset=0, fi=0xc5387a50)
fi:
flags = 0x00000000
fh_old = 0x00000001
writepage = 0
direct_io = 0
keep_cache = 0
fh = 0x0000000000000001
lock_owner = 0x0000000000000000
bb_read(path="/abcd.txt", buf=0x06ccbd90, size=12288, offset=4096, fi=0xc5daaa50) <- Here
fi:
flags = 0x00000000
fh_old = 0x00000001
writepage = 0
direct_io = 0
keep_cache = 0
fh = 0x0000000000000001
lock_owner = 0x0000000000000000
bb_read(path="/abcd.txt", buf=0x06ccbd90, size=4096, offset=0, fi=0xc5daaa50)
fi:
flags = 0x00000000
fh_old = 0x00000001
writepage = 0
direct_io = 0
keep_cache = 0
fh = 0x0000000000000001
lock_owner = 0x0000000000000000