UBI: introduce atomic LEB change ioctl

We have to be able to change individual LEBs for utilities like
ubifsck, ubifstune. For example, ubifsck has to be able to fix
errors on the media, ubifstune has to be able to change the
the superblock, hence this ioctl.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
Artem Bityutskiy 2008-01-24 16:15:14 +02:00
Родитель 60c031531a
Коммит 866136827b
2 изменённых файлов: 47 добавлений и 21 удалений

Просмотреть файл

@ -25,23 +25,6 @@
#include <linux/types.h> #include <linux/types.h>
#include <mtd/ubi-user.h> #include <mtd/ubi-user.h>
/*
* UBI data type hint constants.
*
* UBI_LONGTERM: long-term data
* UBI_SHORTTERM: short-term data
* UBI_UNKNOWN: data persistence is unknown
*
* These constants are used when data is written to UBI volumes in order to
* help the UBI wear-leveling unit to find more appropriate physical
* eraseblocks.
*/
enum {
UBI_LONGTERM = 1,
UBI_SHORTTERM,
UBI_UNKNOWN
};
/* /*
* enum ubi_open_mode - UBI volume open mode constants. * enum ubi_open_mode - UBI volume open mode constants.
* *

Просмотреть файл

@ -63,7 +63,7 @@
* *
* Volume update should be done via the %UBI_IOCVOLUP IOCTL command of the * Volume update should be done via the %UBI_IOCVOLUP IOCTL command of the
* corresponding UBI volume character device. A pointer to a 64-bit update * corresponding UBI volume character device. A pointer to a 64-bit update
* size should be passed to the IOCTL. After then, UBI expects user to write * size should be passed to the IOCTL. After this, UBI expects user to write
* this number of bytes to the volume character device. The update is finished * this number of bytes to the volume character device. The update is finished
* when the claimed number of bytes is passed. So, the volume update sequence * when the claimed number of bytes is passed. So, the volume update sequence
* is something like: * is something like:
@ -72,6 +72,15 @@
* ioctl(fd, UBI_IOCVOLUP, &image_size); * ioctl(fd, UBI_IOCVOLUP, &image_size);
* write(fd, buf, image_size); * write(fd, buf, image_size);
* close(fd); * close(fd);
*
* Atomic eraseblock change
* ~~~~~~~~~~~~~~~~~~~~~~~~
*
* Atomic eraseblock change operation is done via the %UBI_IOCEBCH IOCTL
* command of the corresponding UBI volume character device. A pointer to
* &struct ubi_leb_change_req has to be passed to the IOCTL. Then the user is
* expected to write the requested amount of bytes. This is similar to the
* "volume update" IOCTL.
*/ */
/* /*
@ -113,10 +122,29 @@
#define UBI_IOCVOLUP _IOW(UBI_VOL_IOC_MAGIC, 0, int64_t) #define UBI_IOCVOLUP _IOW(UBI_VOL_IOC_MAGIC, 0, int64_t)
/* An eraseblock erasure command, used for debugging, disabled by default */ /* An eraseblock erasure command, used for debugging, disabled by default */
#define UBI_IOCEBER _IOW(UBI_VOL_IOC_MAGIC, 1, int32_t) #define UBI_IOCEBER _IOW(UBI_VOL_IOC_MAGIC, 1, int32_t)
/* An atomic eraseblock change command */
#define UBI_IOCEBCH _IOW(UBI_VOL_IOC_MAGIC, 2, int32_t)
/* Maximum MTD device name length supported by UBI */ /* Maximum MTD device name length supported by UBI */
#define MAX_UBI_MTD_NAME_LEN 127 #define MAX_UBI_MTD_NAME_LEN 127
/*
* UBI data type hint constants.
*
* UBI_LONGTERM: long-term data
* UBI_SHORTTERM: short-term data
* UBI_UNKNOWN: data persistence is unknown
*
* These constants are used when data is written to UBI volumes in order to
* help the UBI wear-leveling unit to find more appropriate physical
* eraseblocks.
*/
enum {
UBI_LONGTERM = 1,
UBI_SHORTTERM = 2,
UBI_UNKNOWN = 3,
};
/* /*
* UBI volume type constants. * UBI volume type constants.
* *
@ -125,7 +153,7 @@
*/ */
enum { enum {
UBI_DYNAMIC_VOLUME = 3, UBI_DYNAMIC_VOLUME = 3,
UBI_STATIC_VOLUME = 4, UBI_STATIC_VOLUME = 4,
}; };
/** /**
@ -137,7 +165,7 @@ enum {
* *
* This data structure is used to specify MTD device UBI has to attach and the * This data structure is used to specify MTD device UBI has to attach and the
* parameters it has to use. The number which should be assigned to the new UBI * parameters it has to use. The number which should be assigned to the new UBI
* device is passed in @ubi_num. UBI may automatically assing the number if * device is passed in @ubi_num. UBI may automatically assign the number if
* @UBI_DEV_NUM_AUTO is passed. In this case, the device number is returned in * @UBI_DEV_NUM_AUTO is passed. In this case, the device number is returned in
* @ubi_num. * @ubi_num.
* *
@ -176,7 +204,7 @@ struct ubi_attach_req {
* @padding2: reserved for future, not used, has to be zeroed * @padding2: reserved for future, not used, has to be zeroed
* @name: volume name * @name: volume name
* *
* This structure is used by userspace programs when creating new volumes. The * This structure is used by user-space programs when creating new volumes. The
* @used_bytes field is only necessary when creating static volumes. * @used_bytes field is only necessary when creating static volumes.
* *
* The @alignment field specifies the required alignment of the volume logical * The @alignment field specifies the required alignment of the volume logical
@ -222,4 +250,19 @@ struct ubi_rsvol_req {
int32_t vol_id; int32_t vol_id;
} __attribute__ ((packed)); } __attribute__ ((packed));
/**
* struct ubi_leb_change_req - a data structure used in atomic logical
* eraseblock change requests.
* @lnum: logical eraseblock number to change
* @bytes: how many bytes will be written to the logical eraseblock
* @dtype: data type (%UBI_LONGTERM, %UBI_SHORTTERM, %UBI_UNKNOWN)
* @padding: reserved for future, not used, has to be zeroed
*/
struct ubi_leb_change_req {
int32_t lnum;
int32_t bytes;
uint8_t dtype;
uint8_t padding[7];
} __attribute__ ((packed));
#endif /* __UBI_USER_H__ */ #endif /* __UBI_USER_H__ */