summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/adfs/adfs.h1
-rw-r--r--fs/adfs/dir.c4
-rw-r--r--fs/adfs/dir_f.c26
3 files changed, 18 insertions, 13 deletions
diff --git a/fs/adfs/adfs.h b/fs/adfs/adfs.h
index 1f431a42e14c..c05555252fec 100644
--- a/fs/adfs/adfs.h
+++ b/fs/adfs/adfs.h
@@ -130,6 +130,7 @@ 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 (*commit)(struct adfs_dir *dir);
};
struct adfs_discmap {
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c
index 7fda44464121..3d4bbe836fb5 100644
--- a/fs/adfs/dir.c
+++ b/fs/adfs/dir.c
@@ -295,6 +295,10 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait)
ret = ops->update(&dir, obj);
if (ret)
goto forget;
+
+ ret = ops->commit(&dir);
+ if (ret)
+ goto forget;
up_write(&adfs_dir_rwsem);
adfs_dir_mark_dirty(&dir);
diff --git a/fs/adfs/dir_f.c b/fs/adfs/dir_f.c
index 36cfadb2b893..30d526fecc3f 100644
--- a/fs/adfs/dir_f.c
+++ b/fs/adfs/dir_f.c
@@ -292,25 +292,24 @@ static int adfs_f_update(struct adfs_dir *dir, struct object_info *obj)
adfs_obj2dir(&de, obj);
/* Write the directory entry back to the directory */
- ret = adfs_dir_copyto(dir, pos, &de, 26);
- if (ret)
- return ret;
-
- /*
- * Increment directory sequence number
- */
+ return adfs_dir_copyto(dir, offset, &de, 26);
+}
+
+static int adfs_f_commit(struct adfs_dir *dir)
+{
+ int ret;
+
+ /* Increment directory sequence number */
dir->dirhead->startmasseq += 1;
dir->newtail->endmasseq += 1;
- ret = adfs_dir_checkbyte(dir);
- /*
- * Update directory check byte
- */
- dir->newtail->dircheckbyte = ret;
+ /* Update directory check byte */
+ dir->newtail->dircheckbyte = adfs_dir_checkbyte(dir);
+ /* Make sure the directory still validates correctly */
ret = adfs_f_validate(dir);
if (ret)
- adfs_error(dir->sb, "whoops! I broke a directory!");
+ adfs_msg(dir->sb, KERN_ERR, "error: update broke directory");
return ret;
}
@@ -321,4 +320,5 @@ const struct adfs_dir_ops adfs_f_dir_ops = {
.setpos = adfs_f_setpos,
.getnext = adfs_f_getnext,
.update = adfs_f_update,
+ .commit = adfs_f_commit,
};