mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
repair sysv_write_inode(), switch sysv to simple_fsync()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
0d7916d7e9
commit
05459ca81a
4 changed files with 19 additions and 48 deletions
|
@ -24,7 +24,7 @@ static int sysv_readdir(struct file *, void *, filldir_t);
|
||||||
const struct file_operations sysv_dir_operations = {
|
const struct file_operations sysv_dir_operations = {
|
||||||
.read = generic_read_dir,
|
.read = generic_read_dir,
|
||||||
.readdir = sysv_readdir,
|
.readdir = sysv_readdir,
|
||||||
.fsync = sysv_sync_file,
|
.fsync = simple_fsync,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline void dir_put_page(struct page *page)
|
static inline void dir_put_page(struct page *page)
|
||||||
|
|
|
@ -26,7 +26,7 @@ const struct file_operations sysv_file_operations = {
|
||||||
.write = do_sync_write,
|
.write = do_sync_write,
|
||||||
.aio_write = generic_file_aio_write,
|
.aio_write = generic_file_aio_write,
|
||||||
.mmap = generic_file_mmap,
|
.mmap = generic_file_mmap,
|
||||||
.fsync = sysv_sync_file,
|
.fsync = simple_fsync,
|
||||||
.splice_read = generic_file_splice_read,
|
.splice_read = generic_file_splice_read,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -34,18 +34,3 @@ const struct inode_operations sysv_file_inode_operations = {
|
||||||
.truncate = sysv_truncate,
|
.truncate = sysv_truncate,
|
||||||
.getattr = sysv_getattr,
|
.getattr = sysv_getattr,
|
||||||
};
|
};
|
||||||
|
|
||||||
int sysv_sync_file(struct file * file, struct dentry *dentry, int datasync)
|
|
||||||
{
|
|
||||||
struct inode *inode = dentry->d_inode;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
err = sync_mapping_buffers(inode->i_mapping);
|
|
||||||
if (!(inode->i_state & I_DIRTY))
|
|
||||||
return err;
|
|
||||||
if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
|
|
||||||
return err;
|
|
||||||
|
|
||||||
err |= sysv_sync_inode(inode);
|
|
||||||
return err ? -EIO : 0;
|
|
||||||
}
|
|
||||||
|
|
|
@ -247,7 +247,7 @@ bad_inode:
|
||||||
return ERR_PTR(-EIO);
|
return ERR_PTR(-EIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct buffer_head * sysv_update_inode(struct inode * inode)
|
int sysv_write_inode(struct inode *inode, int wait)
|
||||||
{
|
{
|
||||||
struct super_block * sb = inode->i_sb;
|
struct super_block * sb = inode->i_sb;
|
||||||
struct sysv_sb_info * sbi = SYSV_SB(sb);
|
struct sysv_sb_info * sbi = SYSV_SB(sb);
|
||||||
|
@ -255,19 +255,21 @@ static struct buffer_head * sysv_update_inode(struct inode * inode)
|
||||||
struct sysv_inode * raw_inode;
|
struct sysv_inode * raw_inode;
|
||||||
struct sysv_inode_info * si;
|
struct sysv_inode_info * si;
|
||||||
unsigned int ino, block;
|
unsigned int ino, block;
|
||||||
|
int err = 0;
|
||||||
|
|
||||||
ino = inode->i_ino;
|
ino = inode->i_ino;
|
||||||
if (!ino || ino > sbi->s_ninodes) {
|
if (!ino || ino > sbi->s_ninodes) {
|
||||||
printk("Bad inode number on dev %s: %d is out of range\n",
|
printk("Bad inode number on dev %s: %d is out of range\n",
|
||||||
inode->i_sb->s_id, ino);
|
inode->i_sb->s_id, ino);
|
||||||
return NULL;
|
return -EIO;
|
||||||
}
|
}
|
||||||
raw_inode = sysv_raw_inode(sb, ino, &bh);
|
raw_inode = sysv_raw_inode(sb, ino, &bh);
|
||||||
if (!raw_inode) {
|
if (!raw_inode) {
|
||||||
printk("unable to read i-node block\n");
|
printk("unable to read i-node block\n");
|
||||||
return NULL;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lock_kernel();
|
||||||
raw_inode->i_mode = cpu_to_fs16(sbi, inode->i_mode);
|
raw_inode->i_mode = cpu_to_fs16(sbi, inode->i_mode);
|
||||||
raw_inode->i_uid = cpu_to_fs16(sbi, fs_high2lowuid(inode->i_uid));
|
raw_inode->i_uid = cpu_to_fs16(sbi, fs_high2lowuid(inode->i_uid));
|
||||||
raw_inode->i_gid = cpu_to_fs16(sbi, fs_high2lowgid(inode->i_gid));
|
raw_inode->i_gid = cpu_to_fs16(sbi, fs_high2lowgid(inode->i_gid));
|
||||||
|
@ -283,38 +285,23 @@ static struct buffer_head * sysv_update_inode(struct inode * inode)
|
||||||
for (block = 0; block < 10+1+1+1; block++)
|
for (block = 0; block < 10+1+1+1; block++)
|
||||||
write3byte(sbi, (u8 *)&si->i_data[block],
|
write3byte(sbi, (u8 *)&si->i_data[block],
|
||||||
&raw_inode->i_data[3*block]);
|
&raw_inode->i_data[3*block]);
|
||||||
mark_buffer_dirty(bh);
|
|
||||||
return bh;
|
|
||||||
}
|
|
||||||
|
|
||||||
int sysv_write_inode(struct inode * inode, int wait)
|
|
||||||
{
|
|
||||||
struct buffer_head *bh;
|
|
||||||
lock_kernel();
|
|
||||||
bh = sysv_update_inode(inode);
|
|
||||||
brelse(bh);
|
|
||||||
unlock_kernel();
|
unlock_kernel();
|
||||||
|
mark_buffer_dirty(bh);
|
||||||
|
if (wait) {
|
||||||
|
sync_dirty_buffer(bh);
|
||||||
|
if (buffer_req(bh) && !buffer_uptodate(bh)) {
|
||||||
|
printk ("IO error syncing sysv inode [%s:%08x]\n",
|
||||||
|
sb->s_id, ino);
|
||||||
|
err = -EIO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
brelse(bh);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sysv_sync_inode(struct inode * inode)
|
int sysv_sync_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
int err = 0;
|
return sysv_write_inode(inode, 1);
|
||||||
struct buffer_head *bh;
|
|
||||||
|
|
||||||
bh = sysv_update_inode(inode);
|
|
||||||
if (bh && buffer_dirty(bh)) {
|
|
||||||
sync_dirty_buffer(bh);
|
|
||||||
if (buffer_req(bh) && !buffer_uptodate(bh)) {
|
|
||||||
printk ("IO error syncing sysv inode [%s:%08lx]\n",
|
|
||||||
inode->i_sb->s_id, inode->i_ino);
|
|
||||||
err = -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!bh)
|
|
||||||
err = -1;
|
|
||||||
brelse (bh);
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sysv_delete_inode(struct inode *inode)
|
static void sysv_delete_inode(struct inode *inode)
|
||||||
|
|
|
@ -144,7 +144,6 @@ extern int __sysv_write_begin(struct file *file, struct address_space *mapping,
|
||||||
extern struct inode *sysv_iget(struct super_block *, unsigned int);
|
extern struct inode *sysv_iget(struct super_block *, unsigned int);
|
||||||
extern int sysv_write_inode(struct inode *, int);
|
extern int sysv_write_inode(struct inode *, int);
|
||||||
extern int sysv_sync_inode(struct inode *);
|
extern int sysv_sync_inode(struct inode *);
|
||||||
extern int sysv_sync_file(struct file *, struct dentry *, int);
|
|
||||||
extern void sysv_set_inode(struct inode *, dev_t);
|
extern void sysv_set_inode(struct inode *, dev_t);
|
||||||
extern int sysv_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
extern int sysv_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
||||||
extern int sysv_init_icache(void);
|
extern int sysv_init_icache(void);
|
||||||
|
|
Loading…
Reference in a new issue