diff --git a/fs/adfs/adfs.h b/fs/adfs/adfs.h index 1f431a42e14c8e1e91bcc86d2c6bc5182076563e..c05555252fecf7fefb3b7581c9ae5286e23a4224 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 7fda44464121efcf4dbceeb2eff0f2cdb82c0322..3d4bbe836fb58401772ac52f2f00ed70001d74c8 100644 --- a/fs/adfs/dir.c +++ b/fs/adfs/dir.c @@ -293,6 +293,10 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait) goto unlock; ret = ops->update(&dir, obj); + if (ret) + goto forget; + + ret = ops->commit(&dir); if (ret) goto forget; up_write(&adfs_dir_rwsem); diff --git a/fs/adfs/dir_f.c b/fs/adfs/dir_f.c index 36cfadb2b893651452e71438963426295259fc7f..30d526fecc3f40fbd69c0b216e2f89a6fe44e3e2 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, };