-
-/******* mount helper utilities *********/
-
-#if 0
-static void ldd_print(struct lustre_disk_data *ldd)
-{
- PRINT_CMD(PRINT_MASK, " disk data:\n");
- PRINT_CMD(PRINT_MASK, "server: %s\n", ldd->ldd_svname);
- PRINT_CMD(PRINT_MASK, "uuid: %s\n", (char *)ldd->ldd_uuid);
- PRINT_CMD(PRINT_MASK, "fs: %s\n", ldd->ldd_fsname);
- PRINT_CMD(PRINT_MASK, "index: %04x\n", ldd->ldd_svindex);
- PRINT_CMD(PRINT_MASK, "config: %d\n", ldd->ldd_config_ver);
- PRINT_CMD(PRINT_MASK, "flags: %#x\n", ldd->ldd_flags);
- PRINT_CMD(PRINT_MASK, "diskfs: %s\n", MT_STR(ldd));
- PRINT_CMD(PRINT_MASK, "options: %s\n", ldd->ldd_mount_opts);
- PRINT_CMD(PRINT_MASK, "params: %s\n", ldd->ldd_params);
- PRINT_CMD(PRINT_MASK, "comment: %s\n", ldd->ldd_userdata);
-}
-#endif
-
-static int ldd_parse(struct lvfs_run_ctxt *mount_ctxt,
- struct lustre_disk_data *ldd)
-{
- struct lvfs_run_ctxt saved;
- struct file *file;
- loff_t off = 0;
- unsigned long len;
- int rc;
- ENTRY;
-
- push_ctxt(&saved, mount_ctxt, NULL);
-
- file = filp_open(MOUNT_DATA_FILE, O_RDONLY, 0644);
- if (IS_ERR(file)) {
- rc = PTR_ERR(file);
- CERROR("cannot open %s: rc = %d\n", MOUNT_DATA_FILE, rc);
- GOTO(out, rc);
- }
-
- len = i_size_read(file->f_dentry->d_inode);
- CDEBUG(D_MOUNT, "Have %s, size %lu\n", MOUNT_DATA_FILE, len);
- if (len != sizeof(*ldd)) {
- CERROR("disk data size does not match: see %lu expect "LPSZ"\n",
- len, sizeof(*ldd));
- GOTO(out_close, rc = -EINVAL);
- }
-
- rc = lustre_fread(file, ldd, len, &off);
- if (rc != len) {
- CERROR("error reading %s: read %d of %lu\n",
- MOUNT_DATA_FILE, rc, len);
- GOTO(out_close, rc = -EINVAL);
- }
- rc = 0;
-
- if (ldd->ldd_magic != LDD_MAGIC) {
- /* FIXME add swabbing support */
- CERROR("Bad magic in %s: %x!=%x\n", MOUNT_DATA_FILE,
- ldd->ldd_magic, LDD_MAGIC);
- GOTO(out_close, rc = -EINVAL);
- }
-
- if (ldd->ldd_feature_incompat & ~LDD_INCOMPAT_SUPP) {
- CERROR("%s: unsupported incompat filesystem feature(s) %x\n",
- ldd->ldd_svname,
- ldd->ldd_feature_incompat & ~LDD_INCOMPAT_SUPP);
- GOTO(out_close, rc = -EINVAL);
- }
- if (ldd->ldd_feature_rocompat & ~LDD_ROCOMPAT_SUPP) {
- CERROR("%s: unsupported read-only filesystem feature(s) %x\n",
- ldd->ldd_svname,
- ldd->ldd_feature_rocompat & ~LDD_ROCOMPAT_SUPP);
- /* Do something like remount filesystem read-only */
- GOTO(out_close, rc = -EINVAL);
- }
-
-out_close:
- filp_close(file, 0);
-out:
- pop_ctxt(&saved, mount_ctxt, NULL);
- RETURN(rc);
-}
-
-static int ldd_write(struct lvfs_run_ctxt *mount_ctxt,
- struct lustre_disk_data *ldd)
-{
- struct lvfs_run_ctxt saved;
- struct file *file;
- loff_t off = 0;
- unsigned long len = sizeof(struct lustre_disk_data);
- int rc = 0;
- ENTRY;
-
- LASSERT(ldd->ldd_magic == LDD_MAGIC);
-
- ldd->ldd_config_ver++;
-
- push_ctxt(&saved, mount_ctxt, NULL);
-
- file = filp_open(MOUNT_DATA_FILE, O_RDWR, 0644);
- if (IS_ERR(file)) {
- rc = PTR_ERR(file);
- CERROR("cannot open %s: rc = %d\n", MOUNT_DATA_FILE, rc);
- GOTO(out, rc);
- }
-
- rc = lustre_fwrite(file, ldd, len, &off);
- if (rc != len) {
- CERROR("error writing %s: read %d of %lu\n",
- MOUNT_DATA_FILE, rc, len);
- GOTO(out_close, rc = -EINVAL);
- }
-
- rc = 0;
-
-out_close:
- filp_close(file, 0);
-out:
- pop_ctxt(&saved, mount_ctxt, NULL);
- RETURN(rc);
-}
-