static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data) { struct gfs2_sbd *sdp = sb->s_fs_info; int error; error = gfs2_mount_args(sdp, data, 1); if (error) return error; if (sdp->sd_args.ar_spectator) *flags |= MS_RDONLY; else { if (*flags & MS_RDONLY) { if (!(sb->s_flags & MS_RDONLY)) error = gfs2_make_fs_ro(sdp); } else if (!(*flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY)) { error = gfs2_make_fs_rw(sdp); } } if (*flags & (MS_NOATIME | MS_NODIRATIME)) set_bit(SDF_NOATIME, &sdp->sd_flags); else clear_bit(SDF_NOATIME, &sdp->sd_flags); /* Don't let the VFS update atimes. GFS2 handles this itself. */ *flags |= MS_NOATIME | MS_NODIRATIME; return error; }
static void gfs2_put_super(struct super_block *sb) { struct gfs2_sbd *sdp = sb->s_fs_info; int error; /* Unfreeze the filesystem, if we need to */ mutex_lock(&sdp->sd_freeze_lock); if (sdp->sd_freeze_count) gfs2_glock_dq_uninit(&sdp->sd_freeze_gh); mutex_unlock(&sdp->sd_freeze_lock); kthread_stop(sdp->sd_quotad_process); kthread_stop(sdp->sd_logd_process); kthread_stop(sdp->sd_recoverd_process); while (sdp->sd_glockd_num--) kthread_stop(sdp->sd_glockd_process[sdp->sd_glockd_num]); if (!(sb->s_flags & MS_RDONLY)) { error = gfs2_make_fs_ro(sdp); if (error) gfs2_io_error(sdp); } /* At this point, we're through modifying the disk */ /* Release stuff */ iput(sdp->sd_jindex); iput(sdp->sd_inum_inode); iput(sdp->sd_statfs_inode); iput(sdp->sd_rindex); iput(sdp->sd_quota_inode); gfs2_glock_put(sdp->sd_rename_gl); gfs2_glock_put(sdp->sd_trans_gl); if (!sdp->sd_args.ar_spectator) { gfs2_glock_dq_uninit(&sdp->sd_journal_gh); gfs2_glock_dq_uninit(&sdp->sd_jinode_gh); gfs2_glock_dq_uninit(&sdp->sd_ir_gh); gfs2_glock_dq_uninit(&sdp->sd_sc_gh); gfs2_glock_dq_uninit(&sdp->sd_qc_gh); iput(sdp->sd_ir_inode); iput(sdp->sd_sc_inode); iput(sdp->sd_qc_inode); } gfs2_glock_dq_uninit(&sdp->sd_live_gh); gfs2_clear_rgrpd(sdp); gfs2_jindex_free(sdp); /* Take apart glock structures and buffer lists */ gfs2_gl_hash_clear(sdp); /* Unmount the locking protocol */ gfs2_lm_unmount(sdp); /* At this point, we're through participating in the lockspace */ gfs2_sys_fs_del(sdp); kfree(sdp); }
static int gfs2_remount_fs(struct super_block *sb, int *flags, char *data) { struct gfs2_sbd *sdp = sb->s_fs_info; int error; error = gfs2_mount_args(sdp, data, 1); if (error) return error; if (sdp->sd_args.ar_spectator) *flags |= MS_RDONLY; else { if (*flags & MS_RDONLY) { if (!(sb->s_flags & MS_RDONLY)) error = gfs2_make_fs_ro(sdp); } else if (!(*flags & MS_RDONLY) && (sb->s_flags & MS_RDONLY)) { error = gfs2_make_fs_rw(sdp); } } return error; }