unlock_kernel();
}
+static int sysv_remount(struct super_block *sb, int *flags, char *data)
+{
+ struct sysv_sb_info *sbi = SYSV_SB(sb);
+ if (sbi->s_forced_ro)
+ *flags |= MS_RDONLY;
+ if (!(*flags & MS_RDONLY))
+ sb->s_dirt = 1;
+ return 0;
+}
+
static void sysv_put_super(struct super_block *sb)
{
struct sysv_sb_info *sbi = SYSV_SB(sb);
.delete_inode = sysv_delete_inode,
.put_super = sysv_put_super,
.write_super = sysv_write_super,
+ .remount_fs = sysv_remount,
.statfs = sysv_statfs,
};
if (fs16_to_cpu(sbi, sbd->s_nfree) == 0xffff) {
sbi->s_type = FSTYPE_AFS;
+ sbi->s_forced_ro = 1;
if (!(sb->s_flags & MS_RDONLY)) {
printk("SysV FS: SCO EAFS on %s detected, "
"forcing read-only mode.\n",
sb->s_id);
- sb->s_flags |= MS_RDONLY;
}
return sbd->s_type;
}
if (sbd->s_type >= 0x10) {
printk("SysV FS: can't handle long file names on %s, "
"forcing read-only mode.\n", sb->s_id);
- sb->s_flags |= MS_RDONLY;
+ sbi->s_forced_ro = 1;
}
sbi->s_type = FSTYPE_SYSV4;
printk("SysV FS: get root dentry failed\n");
return 0;
}
+ if (sbi->s_forced_ro)
+ sb->s_flags |= MS_RDONLY;
if (sbi->s_truncate)
sb->s_root->d_op = &sysv_dentry_operations;
- sb->s_flags |= MS_RDONLY;
sb->s_dirt = 1;
return 1;
}
(fs32_to_cpu(sbi, v7i->i_size) & 017) != 0)
goto failed;
brelse(bh2);
+ bh2 = NULL;
sbi->s_bh1 = bh;
sbi->s_bh2 = bh;
u32 s_ndatazones; /* total number of data zones */
u32 s_nzones; /* same as s_sbd->s_fsize */
u16 s_namelen; /* max length of dir entry */
+ int s_forced_ro;
};
/*