static ssize_t freeze_store(struct gfs2_sbd *sdp, const char *buf, size_t len) { ssize_t ret = len; int error = 0; int n = simple_strtol(buf, NULL, 0); if (!capable(CAP_SYS_ADMIN)) return -EACCES; switch (n) { case 0: gfs2_unfreeze_fs(sdp); break; case 1: error = gfs2_freeze_fs(sdp); break; default: ret = -EINVAL; } if (error) fs_warn(sdp, "freeze %d error %d", n, error); return ret; }
static void gfs2_write_super_lockfs(struct super_block *sb) { struct gfs2_sbd *sdp = sb->s_fs_info; int error; if (test_bit(SDF_SHUTDOWN, &sdp->sd_flags)) return; for (;;) { error = gfs2_freeze_fs(sdp); if (!error) break; switch (error) { case -EBUSY: fs_err(sdp, "waiting for recovery before freeze\n"); break; default: fs_err(sdp, "error freezing FS: %d\n", error); break; } fs_err(sdp, "retrying...\n"); msleep(1000); } }