diff options
Diffstat (limited to 'fs/adfs')
-rw-r--r-- | fs/adfs/adfs.h | 1 | ||||
-rw-r--r-- | fs/adfs/dir.c | 4 | ||||
-rw-r--r-- | fs/adfs/dir_f.c | 26 |
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, }; |