[dfsv2] add dfs pwrite pread
This commit is contained in:
parent
d08ae0bfd1
commit
651f23a604
@ -151,7 +151,9 @@ int dfs_file_close(struct dfs_file *file);
|
|||||||
|
|
||||||
off_t dfs_file_get_fpos(struct dfs_file *file);
|
off_t dfs_file_get_fpos(struct dfs_file *file);
|
||||||
void dfs_file_set_fpos(struct dfs_file *file, off_t fpos);
|
void dfs_file_set_fpos(struct dfs_file *file, off_t fpos);
|
||||||
|
ssize_t dfs_file_pread(struct dfs_file *file, void *buf, size_t len, off_t offset);
|
||||||
ssize_t dfs_file_read(struct dfs_file *file, void *buf, size_t len);
|
ssize_t dfs_file_read(struct dfs_file *file, void *buf, size_t len);
|
||||||
|
ssize_t dfs_file_pwrite(struct dfs_file *file, const void *buf, size_t len, off_t offset);
|
||||||
ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len);
|
ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len);
|
||||||
off_t generic_dfs_lseek(struct dfs_file *file, off_t offset, int whence);
|
off_t generic_dfs_lseek(struct dfs_file *file, off_t offset, int whence);
|
||||||
off_t dfs_file_lseek(struct dfs_file *file, off_t offset, int wherece);
|
off_t dfs_file_lseek(struct dfs_file *file, off_t offset, int wherece);
|
||||||
|
@ -626,6 +626,54 @@ int dfs_file_close(struct dfs_file *file)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t dfs_file_pread(struct dfs_file *file, void *buf, size_t len, off_t offset)
|
||||||
|
{
|
||||||
|
ssize_t ret = -EBADF;
|
||||||
|
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
/* check whether read */
|
||||||
|
if (!(dfs_fflags(file->flags) & DFS_F_FREAD))
|
||||||
|
{
|
||||||
|
ret = -EPERM;
|
||||||
|
}
|
||||||
|
else if (!file->fops || !file->fops->read)
|
||||||
|
{
|
||||||
|
ret = -ENOSYS;
|
||||||
|
}
|
||||||
|
else if (file->vnode && file->vnode->type != FT_DIRECTORY)
|
||||||
|
{
|
||||||
|
off_t pos = offset;
|
||||||
|
|
||||||
|
ret = rw_verify_area(file, &pos, len);
|
||||||
|
if (ret > 0)
|
||||||
|
{
|
||||||
|
len = ret;
|
||||||
|
|
||||||
|
if (dfs_is_mounted(file->vnode->mnt) == 0)
|
||||||
|
{
|
||||||
|
#ifdef RT_USING_PAGECACHE
|
||||||
|
if (file->vnode->aspace && !(file->flags & O_DIRECT))
|
||||||
|
{
|
||||||
|
ret = dfs_aspace_read(file, buf, len, &pos);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
ret = file->fops->read(file, buf, len, &pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ssize_t dfs_file_read(struct dfs_file *file, void *buf, size_t len)
|
ssize_t dfs_file_read(struct dfs_file *file, void *buf, size_t len)
|
||||||
{
|
{
|
||||||
ssize_t ret = -EBADF;
|
ssize_t ret = -EBADF;
|
||||||
@ -677,9 +725,9 @@ ssize_t dfs_file_read(struct dfs_file *file, void *buf, size_t len)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len)
|
ssize_t dfs_file_pwrite(struct dfs_file *file, const void *buf, size_t len, off_t offset)
|
||||||
{
|
{
|
||||||
size_t ret = -EBADF;
|
ssize_t ret = -EBADF;
|
||||||
|
|
||||||
if (file)
|
if (file)
|
||||||
{
|
{
|
||||||
@ -695,8 +743,7 @@ ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len)
|
|||||||
}
|
}
|
||||||
else if (file->vnode && file->vnode->type != FT_DIRECTORY)
|
else if (file->vnode && file->vnode->type != FT_DIRECTORY)
|
||||||
{
|
{
|
||||||
/* fpos lock */
|
off_t pos = offset;
|
||||||
off_t pos = dfs_file_get_fpos(file);
|
|
||||||
|
|
||||||
ret = rw_verify_area(file, &pos, len);
|
ret = rw_verify_area(file, &pos, len);
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
@ -728,8 +775,77 @@ ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len)
|
|||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* fpos unlock */
|
}
|
||||||
dfs_file_set_fpos(file, pos);
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t dfs_file_write(struct dfs_file *file, const void *buf, size_t len)
|
||||||
|
{
|
||||||
|
ssize_t ret = -EBADF;
|
||||||
|
|
||||||
|
if (file)
|
||||||
|
{
|
||||||
|
if (!(dfs_fflags(file->flags) & DFS_F_FWRITE))
|
||||||
|
{
|
||||||
|
LOG_W("bad write flags.");
|
||||||
|
ret = -EBADF;
|
||||||
|
}
|
||||||
|
else if (!file->fops || !file->fops->write)
|
||||||
|
{
|
||||||
|
LOG_W("no fops write.");
|
||||||
|
ret = -ENOSYS;
|
||||||
|
}
|
||||||
|
else if (file->vnode && file->vnode->type != FT_DIRECTORY)
|
||||||
|
{
|
||||||
|
off_t pos;
|
||||||
|
|
||||||
|
if (!(file->flags & O_APPEND))
|
||||||
|
{
|
||||||
|
/* fpos lock */
|
||||||
|
pos = dfs_file_get_fpos(file);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pos = file->vnode->size;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = rw_verify_area(file, &pos, len);
|
||||||
|
if (ret > 0)
|
||||||
|
{
|
||||||
|
len = ret;
|
||||||
|
DLOG(msg, "dfs_file", file->dentry->mnt->fs_ops->name, DLOG_MSG,
|
||||||
|
"dfs_file_write(fd, buf, %d)", len);
|
||||||
|
|
||||||
|
if (dfs_is_mounted(file->vnode->mnt) == 0)
|
||||||
|
{
|
||||||
|
#ifdef RT_USING_PAGECACHE
|
||||||
|
if (file->vnode->aspace && !(file->flags & O_DIRECT))
|
||||||
|
{
|
||||||
|
ret = dfs_aspace_write(file, buf, len, &pos);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
ret = file->fops->write(file, buf, len, &pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file->flags & O_SYNC)
|
||||||
|
{
|
||||||
|
file->fops->flush(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret = -EINVAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!(file->flags & O_APPEND))
|
||||||
|
{
|
||||||
|
/* fpos unlock */
|
||||||
|
dfs_file_set_fpos(file, pos);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1363,9 +1363,7 @@ ssize_t pread(int fd, void *buf, size_t len, off_t offset)
|
|||||||
|
|
||||||
/* fpos lock */
|
/* fpos lock */
|
||||||
fpos = dfs_file_get_fpos(file);
|
fpos = dfs_file_get_fpos(file);
|
||||||
dfs_file_lseek(file, offset, SEEK_SET);
|
result = dfs_file_pread(file, buf, len, offset);
|
||||||
result = dfs_file_read(file, buf, len);
|
|
||||||
dfs_file_lseek(file, fpos, SEEK_SET);
|
|
||||||
/* fpos unlock */
|
/* fpos unlock */
|
||||||
dfs_file_set_fpos(file, fpos);
|
dfs_file_set_fpos(file, fpos);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
@ -1411,9 +1409,7 @@ ssize_t pwrite(int fd, const void *buf, size_t len, off_t offset)
|
|||||||
}
|
}
|
||||||
/* fpos lock */
|
/* fpos lock */
|
||||||
fpos = dfs_file_get_fpos(file);
|
fpos = dfs_file_get_fpos(file);
|
||||||
dfs_file_lseek(file, offset, SEEK_SET);
|
result = dfs_file_pwrite(file, buf, len, offset);
|
||||||
result = dfs_file_write(file, buf, len);
|
|
||||||
dfs_file_lseek(file, fpos, SEEK_SET);
|
|
||||||
/* fpos unlock */
|
/* fpos unlock */
|
||||||
dfs_file_set_fpos(file, fpos);
|
dfs_file_set_fpos(file, fpos);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user