Commit acf5f0be authored by Russell King's avatar Russell King Committed by Al Viro

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: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 1dd9f5ba
...@@ -125,7 +125,6 @@ struct adfs_dir_ops { ...@@ -125,7 +125,6 @@ struct adfs_dir_ops {
int (*update)(struct adfs_dir *dir, struct object_info *obj); int (*update)(struct adfs_dir *dir, struct object_info *obj);
int (*create)(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 (*remove)(struct adfs_dir *dir, struct object_info *obj);
int (*sync)(struct adfs_dir *dir);
}; };
struct adfs_discmap { struct adfs_discmap {
......
...@@ -38,6 +38,21 @@ static int adfs_dir_read(struct super_block *sb, u32 indaddr, ...@@ -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); 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) void adfs_object_fixup(struct adfs_dir *dir, struct object_info *obj)
{ {
unsigned int dots, i; unsigned int dots, i;
...@@ -135,10 +150,8 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait) ...@@ -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", printk(KERN_INFO "adfs_dir_update: object %06x in dir %06x\n",
obj->indaddr, obj->parent_id); obj->indaddr, obj->parent_id);
if (!ops->update) { if (!ops->update)
ret = -EINVAL; return -EINVAL;
goto out;
}
ret = adfs_dir_read(sb, obj->parent_id, 0, &dir); ret = adfs_dir_read(sb, obj->parent_id, 0, &dir);
if (ret) if (ret)
...@@ -149,7 +162,7 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait) ...@@ -149,7 +162,7 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait)
write_unlock(&adfs_dir_lock); write_unlock(&adfs_dir_lock);
if (wait) { if (wait) {
int err = ops->sync(&dir); int err = adfs_dir_sync(&dir);
if (!ret) if (!ret)
ret = err; ret = err;
} }
......
...@@ -414,26 +414,9 @@ adfs_f_update(struct adfs_dir *dir, struct object_info *obj) ...@@ -414,26 +414,9 @@ adfs_f_update(struct adfs_dir *dir, struct object_info *obj)
#endif #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 = { const struct adfs_dir_ops adfs_f_dir_ops = {
.read = adfs_f_read, .read = adfs_f_read,
.setpos = adfs_f_setpos, .setpos = adfs_f_setpos,
.getnext = adfs_f_getnext, .getnext = adfs_f_getnext,
.update = adfs_f_update, .update = adfs_f_update,
.sync = adfs_f_sync,
}; };
...@@ -179,25 +179,8 @@ adfs_fplus_getnext(struct adfs_dir *dir, struct object_info *obj) ...@@ -179,25 +179,8 @@ adfs_fplus_getnext(struct adfs_dir *dir, struct object_info *obj)
return ret; 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 = { const struct adfs_dir_ops adfs_fplus_dir_ops = {
.read = adfs_fplus_read, .read = adfs_fplus_read,
.setpos = adfs_fplus_setpos, .setpos = adfs_fplus_setpos,
.getnext = adfs_fplus_getnext, .getnext = adfs_fplus_getnext,
.sync = adfs_fplus_sync,
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment