+enum fs_state fs_state_get(const char *dir)
+{
+ char *path;
+ char valstr[16];
+ uint32_t val;
+ ssize_t len;
+
+ path = alloca(strlen(dir) + 1 + sizeof("/.fs_state"));
+ sprintf(path, "%s/.fs_state", dir);
+ len = readlink(path, valstr, sizeof(valstr) - 1);
+ if (len < 0)
+ return FS_STATE_UNKNOWN;
+
+ valstr[len] = 0;
+ val = atoi(valstr);
+
+ if (val > __FS_STATE_LAST)
+ return FS_STATE_UNKNOWN;
+
+ return val;
+}
+
+
+int fs_state_set(const char *dir, enum fs_state state)
+{
+ char valstr[16];
+ char *path;
+
+ if (fs_state_get(dir) == state)
+ return 0;
+
+ path = alloca(strlen(dir) + 1 + sizeof("/.fs_state"));
+ sprintf(path, "%s/.fs_state", dir);
+ unlink(path);
+ snprintf(valstr, sizeof(valstr), "%d", state);
+
+ return symlink(valstr, path);
+}
+
+