fs/adfs: dir: add common directory sync method
adfs_fplus_sync() can be used for both directory formats since we now have a common way to access the buffer heads, so move it into dir.c and appropriately rename it. Remove the directory-format specific implementations. 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
1dd9f5babf
commit
acf5f0be8a
|
@ -125,7 +125,6 @@ struct adfs_dir_ops {
|
|||
int (*update)(struct adfs_dir *dir, struct object_info *obj);
|
||||
int (*create)(struct adfs_dir *dir, struct object_info *obj);
|
||||
int (*remove)(struct adfs_dir *dir, struct object_info *obj);
|
||||
int (*sync)(struct adfs_dir *dir);
|
||||
};
|
||||
|
||||
struct adfs_discmap {
|
||||
|
|
|
@ -38,6 +38,21 @@ static int adfs_dir_read(struct super_block *sb, u32 indaddr,
|
|||
return ADFS_SB(sb)->s_dir->read(sb, indaddr, size, dir);
|
||||
}
|
||||
|
||||
static int adfs_dir_sync(struct adfs_dir *dir)
|
||||
{
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
for (i = dir->nr_buffers - 1; i >= 0; i--) {
|
||||
struct buffer_head *bh = dir->bhs[i];
|
||||
sync_dirty_buffer(bh);
|
||||
if (buffer_req(bh) && !buffer_uptodate(bh))
|
||||
err = -EIO;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
void adfs_object_fixup(struct adfs_dir *dir, struct object_info *obj)
|
||||
{
|
||||
unsigned int dots, i;
|
||||
|
@ -135,10 +150,8 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait)
|
|||
printk(KERN_INFO "adfs_dir_update: object %06x in dir %06x\n",
|
||||
obj->indaddr, obj->parent_id);
|
||||
|
||||
if (!ops->update) {
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
if (!ops->update)
|
||||
return -EINVAL;
|
||||
|
||||
ret = adfs_dir_read(sb, obj->parent_id, 0, &dir);
|
||||
if (ret)
|
||||
|
@ -149,7 +162,7 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait)
|
|||
write_unlock(&adfs_dir_lock);
|
||||
|
||||
if (wait) {
|
||||
int err = ops->sync(&dir);
|
||||
int err = adfs_dir_sync(&dir);
|
||||
if (!ret)
|
||||
ret = err;
|
||||
}
|
||||
|
|
|
@ -414,26 +414,9 @@ adfs_f_update(struct adfs_dir *dir, struct object_info *obj)
|
|||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
adfs_f_sync(struct adfs_dir *dir)
|
||||
{
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
for (i = dir->nr_buffers - 1; i >= 0; i--) {
|
||||
struct buffer_head *bh = dir->bh[i];
|
||||
sync_dirty_buffer(bh);
|
||||
if (buffer_req(bh) && !buffer_uptodate(bh))
|
||||
err = -EIO;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
const struct adfs_dir_ops adfs_f_dir_ops = {
|
||||
.read = adfs_f_read,
|
||||
.setpos = adfs_f_setpos,
|
||||
.getnext = adfs_f_getnext,
|
||||
.update = adfs_f_update,
|
||||
.sync = adfs_f_sync,
|
||||
};
|
||||
|
|
|
@ -179,25 +179,8 @@ adfs_fplus_getnext(struct adfs_dir *dir, struct object_info *obj)
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
adfs_fplus_sync(struct adfs_dir *dir)
|
||||
{
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
for (i = dir->nr_buffers - 1; i >= 0; i--) {
|
||||
struct buffer_head *bh = dir->bhs[i];
|
||||
sync_dirty_buffer(bh);
|
||||
if (buffer_req(bh) && !buffer_uptodate(bh))
|
||||
err = -EIO;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
const struct adfs_dir_ops adfs_fplus_dir_ops = {
|
||||
.read = adfs_fplus_read,
|
||||
.setpos = adfs_fplus_setpos,
|
||||
.getnext = adfs_fplus_getnext,
|
||||
.sync = adfs_fplus_sync,
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue
Block a user