mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-07-22 23:04:43 +00:00
fs/adfs: dir: add generic copy functions
Directories can span multiple buffers, and we currently open-code memcpy access to these buffers, including dealing with entries that are split across multiple buffers. Such code exists in both directory format implementations. Provide common functions to allow data to be copied from/to the directory buffers as if they were a contiguous set of buffers, and use them when accessing directories. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
acf5f0be8a
commit
a317120bf7
4 changed files with 75 additions and 82 deletions
|
@ -224,24 +224,12 @@ adfs_obj2dir(struct adfs_direntry *de, struct object_info *obj)
|
|||
static int
|
||||
__adfs_dir_get(struct adfs_dir *dir, int pos, struct object_info *obj)
|
||||
{
|
||||
struct super_block *sb = dir->sb;
|
||||
struct adfs_direntry de;
|
||||
int thissize, buffer, offset;
|
||||
int ret;
|
||||
|
||||
buffer = pos >> sb->s_blocksize_bits;
|
||||
|
||||
if (buffer > dir->nr_buffers)
|
||||
return -EINVAL;
|
||||
|
||||
offset = pos & (sb->s_blocksize - 1);
|
||||
thissize = sb->s_blocksize - offset;
|
||||
if (thissize > 26)
|
||||
thissize = 26;
|
||||
|
||||
memcpy(&de, dir->bh[buffer]->b_data + offset, thissize);
|
||||
if (thissize != 26)
|
||||
memcpy(((char *)&de) + thissize, dir->bh[buffer + 1]->b_data,
|
||||
26 - thissize);
|
||||
ret = adfs_dir_copyfrom(&de, dir, pos, 26);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!de.dirobname[0])
|
||||
return -ENOENT;
|
||||
|
@ -254,42 +242,16 @@ __adfs_dir_get(struct adfs_dir *dir, int pos, struct object_info *obj)
|
|||
static int
|
||||
__adfs_dir_put(struct adfs_dir *dir, int pos, struct object_info *obj)
|
||||
{
|
||||
struct super_block *sb = dir->sb;
|
||||
struct adfs_direntry de;
|
||||
int thissize, buffer, offset;
|
||||
int ret;
|
||||
|
||||
buffer = pos >> sb->s_blocksize_bits;
|
||||
ret = adfs_dir_copyfrom(&de, dir, pos, 26);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (buffer > dir->nr_buffers)
|
||||
return -EINVAL;
|
||||
|
||||
offset = pos & (sb->s_blocksize - 1);
|
||||
thissize = sb->s_blocksize - offset;
|
||||
if (thissize > 26)
|
||||
thissize = 26;
|
||||
|
||||
/*
|
||||
* Get the entry in total
|
||||
*/
|
||||
memcpy(&de, dir->bh[buffer]->b_data + offset, thissize);
|
||||
if (thissize != 26)
|
||||
memcpy(((char *)&de) + thissize, dir->bh[buffer + 1]->b_data,
|
||||
26 - thissize);
|
||||
|
||||
/*
|
||||
* update it
|
||||
*/
|
||||
adfs_obj2dir(&de, obj);
|
||||
|
||||
/*
|
||||
* Put the new entry back
|
||||
*/
|
||||
memcpy(dir->bh[buffer]->b_data + offset, &de, thissize);
|
||||
if (thissize != 26)
|
||||
memcpy(dir->bh[buffer + 1]->b_data, ((char *)&de) + thissize,
|
||||
26 - thissize);
|
||||
|
||||
return 0;
|
||||
return adfs_dir_copyto(dir, pos, &de, 26);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue