Commit 4d429480 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'linux-next' of git://git.infradead.org/ubi-2.6

* 'linux-next' of git://git.infradead.org/ubi-2.6:
  UBI: switch to dynamic printks
  UBI: turn some macros into static inline
  UBI: improve checking in debugging prints
  UBI: fix typo in a message
  UBI: fix minor stylistic issues
  UBI: use __packed instead of __attribute__((packed))
  UBI: cleanup comments around volume properties
  UBI: re-name set volume properties ioctl
  UBI: make the control character device non-seekable
parents eb08d8ff ab50ff68
...@@ -115,7 +115,7 @@ static int vol_cdev_open(struct inode *inode, struct file *file) ...@@ -115,7 +115,7 @@ static int vol_cdev_open(struct inode *inode, struct file *file)
mode = UBI_READONLY; mode = UBI_READONLY;
dbg_gen("open device %d, volume %d, mode %d", dbg_gen("open device %d, volume %d, mode %d",
ubi_num, vol_id, mode); ubi_num, vol_id, mode);
desc = ubi_open_volume(ubi_num, vol_id, mode); desc = ubi_open_volume(ubi_num, vol_id, mode);
if (IS_ERR(desc)) if (IS_ERR(desc))
...@@ -158,7 +158,7 @@ static loff_t vol_cdev_llseek(struct file *file, loff_t offset, int origin) ...@@ -158,7 +158,7 @@ static loff_t vol_cdev_llseek(struct file *file, loff_t offset, int origin)
loff_t new_offset; loff_t new_offset;
if (vol->updating) { if (vol->updating) {
/* Update is in progress, seeking is prohibited */ /* Update is in progress, seeking is prohibited */
dbg_err("updating"); dbg_err("updating");
return -EBUSY; return -EBUSY;
} }
...@@ -561,18 +561,18 @@ static long vol_cdev_ioctl(struct file *file, unsigned int cmd, ...@@ -561,18 +561,18 @@ static long vol_cdev_ioctl(struct file *file, unsigned int cmd,
} }
/* Set volume property command */ /* Set volume property command */
case UBI_IOCSETPROP: case UBI_IOCSETVOLPROP:
{ {
struct ubi_set_prop_req req; struct ubi_set_vol_prop_req req;
err = copy_from_user(&req, argp, err = copy_from_user(&req, argp,
sizeof(struct ubi_set_prop_req)); sizeof(struct ubi_set_vol_prop_req));
if (err) { if (err) {
err = -EFAULT; err = -EFAULT;
break; break;
} }
switch (req.property) { switch (req.property) {
case UBI_PROP_DIRECT_WRITE: case UBI_VOL_PROP_DIRECT_WRITE:
mutex_lock(&ubi->device_mutex); mutex_lock(&ubi->device_mutex);
desc->vol->direct_writes = !!req.value; desc->vol->direct_writes = !!req.value;
mutex_unlock(&ubi->device_mutex); mutex_unlock(&ubi->device_mutex);
...@@ -1100,5 +1100,5 @@ const struct file_operations ubi_ctrl_cdev_operations = { ...@@ -1100,5 +1100,5 @@ const struct file_operations ubi_ctrl_cdev_operations = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.unlocked_ioctl = ctrl_cdev_ioctl, .unlocked_ioctl = ctrl_cdev_ioctl,
.compat_ioctl = ctrl_cdev_compat_ioctl, .compat_ioctl = ctrl_cdev_compat_ioctl,
.llseek = noop_llseek, .llseek = no_llseek,
}; };
...@@ -30,15 +30,12 @@ ...@@ -30,15 +30,12 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
unsigned int ubi_msg_flags;
unsigned int ubi_chk_flags; unsigned int ubi_chk_flags;
unsigned int ubi_tst_flags; unsigned int ubi_tst_flags;
module_param_named(debug_msgs, ubi_msg_flags, uint, S_IRUGO | S_IWUSR);
module_param_named(debug_chks, ubi_chk_flags, uint, S_IRUGO | S_IWUSR); module_param_named(debug_chks, ubi_chk_flags, uint, S_IRUGO | S_IWUSR);
module_param_named(debug_tsts, ubi_chk_flags, uint, S_IRUGO | S_IWUSR); module_param_named(debug_tsts, ubi_chk_flags, uint, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_msgs, "Debug message type flags");
MODULE_PARM_DESC(debug_chks, "Debug check flags"); MODULE_PARM_DESC(debug_chks, "Debug check flags");
MODULE_PARM_DESC(debug_tsts, "Debug special test flags"); MODULE_PARM_DESC(debug_tsts, "Debug special test flags");
...@@ -75,15 +72,15 @@ void ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr) ...@@ -75,15 +72,15 @@ void ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr)
{ {
printk(KERN_DEBUG "Volume identifier header dump:\n"); printk(KERN_DEBUG "Volume identifier header dump:\n");
printk(KERN_DEBUG "\tmagic %08x\n", be32_to_cpu(vid_hdr->magic)); printk(KERN_DEBUG "\tmagic %08x\n", be32_to_cpu(vid_hdr->magic));
printk(KERN_DEBUG "\tversion %d\n", (int)vid_hdr->version); printk(KERN_DEBUG "\tversion %d\n", (int)vid_hdr->version);
printk(KERN_DEBUG "\tvol_type %d\n", (int)vid_hdr->vol_type); printk(KERN_DEBUG "\tvol_type %d\n", (int)vid_hdr->vol_type);
printk(KERN_DEBUG "\tcopy_flag %d\n", (int)vid_hdr->copy_flag); printk(KERN_DEBUG "\tcopy_flag %d\n", (int)vid_hdr->copy_flag);
printk(KERN_DEBUG "\tcompat %d\n", (int)vid_hdr->compat); printk(KERN_DEBUG "\tcompat %d\n", (int)vid_hdr->compat);
printk(KERN_DEBUG "\tvol_id %d\n", be32_to_cpu(vid_hdr->vol_id)); printk(KERN_DEBUG "\tvol_id %d\n", be32_to_cpu(vid_hdr->vol_id));
printk(KERN_DEBUG "\tlnum %d\n", be32_to_cpu(vid_hdr->lnum)); printk(KERN_DEBUG "\tlnum %d\n", be32_to_cpu(vid_hdr->lnum));
printk(KERN_DEBUG "\tdata_size %d\n", be32_to_cpu(vid_hdr->data_size)); printk(KERN_DEBUG "\tdata_size %d\n", be32_to_cpu(vid_hdr->data_size));
printk(KERN_DEBUG "\tused_ebs %d\n", be32_to_cpu(vid_hdr->used_ebs)); printk(KERN_DEBUG "\tused_ebs %d\n", be32_to_cpu(vid_hdr->used_ebs));
printk(KERN_DEBUG "\tdata_pad %d\n", be32_to_cpu(vid_hdr->data_pad)); printk(KERN_DEBUG "\tdata_pad %d\n", be32_to_cpu(vid_hdr->data_pad));
printk(KERN_DEBUG "\tsqnum %llu\n", printk(KERN_DEBUG "\tsqnum %llu\n",
(unsigned long long)be64_to_cpu(vid_hdr->sqnum)); (unsigned long long)be64_to_cpu(vid_hdr->sqnum));
printk(KERN_DEBUG "\thdr_crc %08x\n", be32_to_cpu(vid_hdr->hdr_crc)); printk(KERN_DEBUG "\thdr_crc %08x\n", be32_to_cpu(vid_hdr->hdr_crc));
......
...@@ -21,11 +21,17 @@ ...@@ -21,11 +21,17 @@
#ifndef __UBI_DEBUG_H__ #ifndef __UBI_DEBUG_H__
#define __UBI_DEBUG_H__ #define __UBI_DEBUG_H__
struct ubi_ec_hdr;
struct ubi_vid_hdr;
struct ubi_volume;
struct ubi_vtbl_record;
struct ubi_scan_volume;
struct ubi_scan_leb;
struct ubi_mkvol_req;
#ifdef CONFIG_MTD_UBI_DEBUG #ifdef CONFIG_MTD_UBI_DEBUG
#include <linux/random.h> #include <linux/random.h>
#define dbg_err(fmt, ...) ubi_err(fmt, ##__VA_ARGS__)
#define ubi_assert(expr) do { \ #define ubi_assert(expr) do { \
if (unlikely(!(expr))) { \ if (unlikely(!(expr))) { \
printk(KERN_CRIT "UBI assert failed in %s at %u (pid %d)\n", \ printk(KERN_CRIT "UBI assert failed in %s at %u (pid %d)\n", \
...@@ -34,24 +40,28 @@ ...@@ -34,24 +40,28 @@
} \ } \
} while (0) } while (0)
#define dbg_msg(fmt, ...) \ #define dbg_err(fmt, ...) ubi_err(fmt, ##__VA_ARGS__)
printk(KERN_DEBUG "UBI DBG (pid %d): %s: " fmt "\n", \
current->pid, __func__, ##__VA_ARGS__)
#define dbg_do_msg(typ, fmt, ...) do { \
if (ubi_msg_flags & typ) \
dbg_msg(fmt, ##__VA_ARGS__); \
} while (0)
#define ubi_dbg_dump_stack() dump_stack() #define ubi_dbg_dump_stack() dump_stack()
struct ubi_ec_hdr; #define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a) \
struct ubi_vid_hdr; print_hex_dump(l, ps, pt, r, g, b, len, a)
struct ubi_volume;
struct ubi_vtbl_record; #define ubi_dbg_msg(type, fmt, ...) \
struct ubi_scan_volume; pr_debug("UBI DBG " type ": " fmt "\n", ##__VA_ARGS__)
struct ubi_scan_leb;
struct ubi_mkvol_req; /* Just a debugging messages not related to any specific UBI subsystem */
#define dbg_msg(fmt, ...) ubi_dbg_msg("msg", fmt, ##__VA_ARGS__)
/* General debugging messages */
#define dbg_gen(fmt, ...) ubi_dbg_msg("gen", fmt, ##__VA_ARGS__)
/* Messages from the eraseblock association sub-system */
#define dbg_eba(fmt, ...) ubi_dbg_msg("eba", fmt, ##__VA_ARGS__)
/* Messages from the wear-leveling sub-system */
#define dbg_wl(fmt, ...) ubi_dbg_msg("wl", fmt, ##__VA_ARGS__)
/* Messages from the input/output sub-system */
#define dbg_io(fmt, ...) ubi_dbg_msg("io", fmt, ##__VA_ARGS__)
/* Initialization and build messages */
#define dbg_bld(fmt, ...) ubi_dbg_msg("bld", fmt, ##__VA_ARGS__)
void ubi_dbg_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr); void ubi_dbg_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr);
void ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr); void ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr);
...@@ -62,43 +72,6 @@ void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type); ...@@ -62,43 +72,6 @@ void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type);
void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req); void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req);
void ubi_dbg_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len); void ubi_dbg_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len);
extern unsigned int ubi_msg_flags;
/*
* Debugging message type flags (must match msg_type_names in debug.c).
*
* UBI_MSG_GEN: general messages
* UBI_MSG_EBA: journal messages
* UBI_MSG_WL: mount messages
* UBI_MSG_IO: commit messages
* UBI_MSG_BLD: LEB find messages
*/
enum {
UBI_MSG_GEN = 0x1,
UBI_MSG_EBA = 0x2,
UBI_MSG_WL = 0x4,
UBI_MSG_IO = 0x8,
UBI_MSG_BLD = 0x10,
};
#define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a) \
print_hex_dump(l, ps, pt, r, g, b, len, a)
/* General debugging messages */
#define dbg_gen(fmt, ...) dbg_do_msg(UBI_MSG_GEN, fmt, ##__VA_ARGS__)
/* Messages from the eraseblock association sub-system */
#define dbg_eba(fmt, ...) dbg_do_msg(UBI_MSG_EBA, fmt, ##__VA_ARGS__)
/* Messages from the wear-leveling sub-system */
#define dbg_wl(fmt, ...) dbg_do_msg(UBI_MSG_WL, fmt, ##__VA_ARGS__)
/* Messages from the input/output sub-system */
#define dbg_io(fmt, ...) dbg_do_msg(UBI_MSG_IO, fmt, ##__VA_ARGS__)
/* Initialization and build messages */
#define dbg_bld(fmt, ...) dbg_do_msg(UBI_MSG_BLD, fmt, ##__VA_ARGS__)
extern unsigned int ubi_chk_flags; extern unsigned int ubi_chk_flags;
/* /*
...@@ -184,31 +157,61 @@ static inline int ubi_dbg_is_erase_failure(void) ...@@ -184,31 +157,61 @@ static inline int ubi_dbg_is_erase_failure(void)
#else #else
#define ubi_assert(expr) ({}) /* Use "if (0)" to make compiler check arguments even if debugging is off */
#define dbg_err(fmt, ...) ({}) #define ubi_assert(expr) do { \
#define dbg_msg(fmt, ...) ({}) if (0) { \
#define dbg_gen(fmt, ...) ({}) printk(KERN_CRIT "UBI assert failed in %s at %u (pid %d)\n", \
#define dbg_eba(fmt, ...) ({}) __func__, __LINE__, current->pid); \
#define dbg_wl(fmt, ...) ({}) } \
#define dbg_io(fmt, ...) ({}) } while (0)
#define dbg_bld(fmt, ...) ({})
#define ubi_dbg_dump_stack() ({}) #define dbg_err(fmt, ...) do { \
#define ubi_dbg_dump_ec_hdr(ec_hdr) ({}) if (0) \
#define ubi_dbg_dump_vid_hdr(vid_hdr) ({}) ubi_err(fmt, ##__VA_ARGS__); \
#define ubi_dbg_dump_vol_info(vol) ({}) } while (0)
#define ubi_dbg_dump_vtbl_record(r, idx) ({})
#define ubi_dbg_dump_sv(sv) ({}) #define ubi_dbg_msg(fmt, ...) do { \
#define ubi_dbg_dump_seb(seb, type) ({}) if (0) \
#define ubi_dbg_dump_mkvol_req(req) ({}) pr_debug(fmt "\n", ##__VA_ARGS__); \
#define ubi_dbg_dump_flash(ubi, pnum, offset, len) ({}) } while (0)
#define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a) ({})
#define dbg_msg(fmt, ...) ubi_dbg_msg(fmt, ##__VA_ARGS__)
#define ubi_dbg_is_bgt_disabled() 0 #define dbg_gen(fmt, ...) ubi_dbg_msg(fmt, ##__VA_ARGS__)
#define ubi_dbg_is_bitflip() 0 #define dbg_eba(fmt, ...) ubi_dbg_msg(fmt, ##__VA_ARGS__)
#define ubi_dbg_is_write_failure() 0 #define dbg_wl(fmt, ...) ubi_dbg_msg(fmt, ##__VA_ARGS__)
#define ubi_dbg_is_erase_failure() 0 #define dbg_io(fmt, ...) ubi_dbg_msg(fmt, ##__VA_ARGS__)
#define ubi_dbg_check_all_ff(ubi, pnum, offset, len) 0 #define dbg_bld(fmt, ...) ubi_dbg_msg(fmt, ##__VA_ARGS__)
#define ubi_dbg_check_write(ubi, buf, pnum, offset, len) 0
static inline void ubi_dbg_dump_stack(void) { return; }
static inline void
ubi_dbg_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr) { return; }
static inline void
ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr) { return; }
static inline void
ubi_dbg_dump_vol_info(const struct ubi_volume *vol) { return; }
static inline void
ubi_dbg_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx) { return; }
static inline void ubi_dbg_dump_sv(const struct ubi_scan_volume *sv) { return; }
static inline void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb,
int type) { return; }
static inline void
ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req) { return; }
static inline void ubi_dbg_dump_flash(struct ubi_device *ubi,
int pnum, int offset, int len) { return; }
static inline void
ubi_dbg_print_hex_dump(const char *l, const char *ps, int pt, int r,
int g, const void *b, size_t len, bool a) { return; }
static inline int ubi_dbg_is_bgt_disabled(void) { return 0; }
static inline int ubi_dbg_is_bitflip(void) { return 0; }
static inline int ubi_dbg_is_write_failure(void) { return 0; }
static inline int ubi_dbg_is_erase_failure(void) { return 0; }
static inline int ubi_dbg_check_all_ff(struct ubi_device *ubi,
int pnum, int offset,
int len) { return 0; }
static inline int ubi_dbg_check_write(struct ubi_device *ubi,
const void *buf, int pnum,
int offset, int len) { return 0; }
#endif /* !CONFIG_MTD_UBI_DEBUG */ #endif /* !CONFIG_MTD_UBI_DEBUG */
#endif /* !__UBI_DEBUG_H__ */ #endif /* !__UBI_DEBUG_H__ */
...@@ -189,8 +189,8 @@ int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset, ...@@ -189,8 +189,8 @@ int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
} }
if (retries++ < UBI_IO_RETRIES) { if (retries++ < UBI_IO_RETRIES) {
dbg_io("error %d%s while reading %d bytes from PEB %d:%d," dbg_io("error %d%s while reading %d bytes from PEB "
" read only %zd bytes, retry", "%d:%d, read only %zd bytes, retry",
err, errstr, len, pnum, offset, read); err, errstr, len, pnum, offset, read);
yield(); yield();
goto retry; goto retry;
...@@ -465,7 +465,7 @@ static int torture_peb(struct ubi_device *ubi, int pnum) ...@@ -465,7 +465,7 @@ static int torture_peb(struct ubi_device *ubi, int pnum)
} }
err = patt_count; err = patt_count;
ubi_msg("PEB %d passed torture test, do not mark it a bad", pnum); ubi_msg("PEB %d passed torture test, do not mark it as bad", pnum);
out: out:
mutex_unlock(&ubi->buf_mutex); mutex_unlock(&ubi->buf_mutex);
......
...@@ -1103,7 +1103,7 @@ static int check_what_we_have(struct ubi_device *ubi, struct ubi_scan_info *si) ...@@ -1103,7 +1103,7 @@ static int check_what_we_have(struct ubi_device *ubi, struct ubi_scan_info *si)
* otherwise, only print a warning. * otherwise, only print a warning.
*/ */
if (si->corr_peb_count >= max_corr) { if (si->corr_peb_count >= max_corr) {
ubi_err("too many corrupted PEBs, refusing this device"); ubi_err("too many corrupted PEBs, refusing");
return -EINVAL; return -EINVAL;
} }
} }
......
...@@ -164,7 +164,7 @@ struct ubi_ec_hdr { ...@@ -164,7 +164,7 @@ struct ubi_ec_hdr {
__be32 image_seq; __be32 image_seq;
__u8 padding2[32]; __u8 padding2[32];
__be32 hdr_crc; __be32 hdr_crc;
} __attribute__ ((packed)); } __packed;
/** /**
* struct ubi_vid_hdr - on-flash UBI volume identifier header. * struct ubi_vid_hdr - on-flash UBI volume identifier header.
...@@ -292,7 +292,7 @@ struct ubi_vid_hdr { ...@@ -292,7 +292,7 @@ struct ubi_vid_hdr {
__be64 sqnum; __be64 sqnum;
__u8 padding3[12]; __u8 padding3[12];
__be32 hdr_crc; __be32 hdr_crc;
} __attribute__ ((packed)); } __packed;
/* Internal UBI volumes count */ /* Internal UBI volumes count */
#define UBI_INT_VOL_COUNT 1 #define UBI_INT_VOL_COUNT 1
...@@ -373,6 +373,6 @@ struct ubi_vtbl_record { ...@@ -373,6 +373,6 @@ struct ubi_vtbl_record {
__u8 flags; __u8 flags;
__u8 padding[23]; __u8 padding[23];
__be32 crc; __be32 crc;
} __attribute__ ((packed)); } __packed;
#endif /* !__UBI_MEDIA_H__ */ #endif /* !__UBI_MEDIA_H__ */
...@@ -341,8 +341,8 @@ struct ubi_wl_entry; ...@@ -341,8 +341,8 @@ struct ubi_wl_entry;
* protected from the wear-leveling worker) * protected from the wear-leveling worker)
* @pq_head: protection queue head * @pq_head: protection queue head
* @wl_lock: protects the @used, @free, @pq, @pq_head, @lookuptbl, @move_from, * @wl_lock: protects the @used, @free, @pq, @pq_head, @lookuptbl, @move_from,
* @move_to, @move_to_put @erase_pending, @wl_scheduled, @works, * @move_to, @move_to_put @erase_pending, @wl_scheduled, @works,
* @erroneous, and @erroneous_peb_count fields * @erroneous, and @erroneous_peb_count fields
* @move_mutex: serializes eraseblock moves * @move_mutex: serializes eraseblock moves
* @work_sem: synchronizes the WL worker with use tasks * @work_sem: synchronizes the WL worker with use tasks
* @wl_scheduled: non-zero if the wear-leveling was scheduled * @wl_scheduled: non-zero if the wear-leveling was scheduled
......
...@@ -1570,7 +1570,8 @@ void ubi_wl_close(struct ubi_device *ubi) ...@@ -1570,7 +1570,8 @@ void ubi_wl_close(struct ubi_device *ubi)
* @ec: the erase counter to check * @ec: the erase counter to check
* *
* This function returns zero if the erase counter of physical eraseblock @pnum * This function returns zero if the erase counter of physical eraseblock @pnum
* is equivalent to @ec, and a negative error code if not or if an error occurred. * is equivalent to @ec, and a negative error code if not or if an error
* occurred.
*/ */
static int paranoid_check_ec(struct ubi_device *ubi, int pnum, int ec) static int paranoid_check_ec(struct ubi_device *ubi, int pnum, int ec)
{ {
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
#ifndef __LINUX_UBI_H__ #ifndef __LINUX_UBI_H__
#define __LINUX_UBI_H__ #define __LINUX_UBI_H__
#include <asm/ioctl.h> #include <linux/ioctl.h>
#include <linux/types.h> #include <linux/types.h>
#include <mtd/ubi-user.h> #include <mtd/ubi-user.h>
...@@ -87,7 +87,7 @@ enum { ...@@ -87,7 +87,7 @@ enum {
* physical eraseblock size and on how much bytes UBI headers consume. But * physical eraseblock size and on how much bytes UBI headers consume. But
* because of the volume alignment (@alignment), the usable size of logical * because of the volume alignment (@alignment), the usable size of logical
* eraseblocks if a volume may be less. The following equation is true: * eraseblocks if a volume may be less. The following equation is true:
* @usable_leb_size = LEB size - (LEB size mod @alignment), * @usable_leb_size = LEB size - (LEB size mod @alignment),
* where LEB size is the logical eraseblock size defined by the UBI device. * where LEB size is the logical eraseblock size defined by the UBI device.
* *
* The alignment is multiple to the minimal flash input/output unit size or %1 * The alignment is multiple to the minimal flash input/output unit size or %1
......
...@@ -131,7 +131,7 @@ ...@@ -131,7 +131,7 @@
* ~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~
* *
* To set an UBI volume property the %UBI_IOCSETPROP ioctl command should be * To set an UBI volume property the %UBI_IOCSETPROP ioctl command should be
* used. A pointer to a &struct ubi_set_prop_req object is expected to be * used. A pointer to a &struct ubi_set_vol_prop_req object is expected to be
* passed. The object describes which property should be set, and to which value * passed. The object describes which property should be set, and to which value
* it should be set. * it should be set.
*/ */
...@@ -186,7 +186,8 @@ ...@@ -186,7 +186,8 @@
/* Check if LEB is mapped command */ /* Check if LEB is mapped command */
#define UBI_IOCEBISMAP _IOR(UBI_VOL_IOC_MAGIC, 5, __s32) #define UBI_IOCEBISMAP _IOR(UBI_VOL_IOC_MAGIC, 5, __s32)
/* Set an UBI volume property */ /* Set an UBI volume property */
#define UBI_IOCSETPROP _IOW(UBI_VOL_IOC_MAGIC, 6, struct ubi_set_prop_req) #define UBI_IOCSETVOLPROP _IOW(UBI_VOL_IOC_MAGIC, 6, \
struct ubi_set_vol_prop_req)
/* 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
...@@ -223,13 +224,14 @@ enum { ...@@ -223,13 +224,14 @@ enum {
}; };
/* /*
* UBI set property ioctl constants * UBI set volume property ioctl constants.
* *
* @UBI_PROP_DIRECT_WRITE: allow / disallow user to directly write and * @UBI_VOL_PROP_DIRECT_WRITE: allow (any non-zero value) or disallow (value 0)
* erase individual eraseblocks on dynamic volumes * user to directly write and erase individual
* eraseblocks on dynamic volumes
*/ */
enum { enum {
UBI_PROP_DIRECT_WRITE = 1, UBI_VOL_PROP_DIRECT_WRITE = 1,
}; };
/** /**
...@@ -308,7 +310,7 @@ struct ubi_mkvol_req { ...@@ -308,7 +310,7 @@ struct ubi_mkvol_req {
__s16 name_len; __s16 name_len;
__s8 padding2[4]; __s8 padding2[4];
char name[UBI_MAX_VOLUME_NAME + 1]; char name[UBI_MAX_VOLUME_NAME + 1];
} __attribute__ ((packed)); } __packed;
/** /**
* struct ubi_rsvol_req - a data structure used in volume re-size requests. * struct ubi_rsvol_req - a data structure used in volume re-size requests.
...@@ -324,7 +326,7 @@ struct ubi_mkvol_req { ...@@ -324,7 +326,7 @@ struct ubi_mkvol_req {
struct ubi_rsvol_req { struct ubi_rsvol_req {
__s64 bytes; __s64 bytes;
__s32 vol_id; __s32 vol_id;
} __attribute__ ((packed)); } __packed;
/** /**
* struct ubi_rnvol_req - volumes re-name request. * struct ubi_rnvol_req - volumes re-name request.
...@@ -366,7 +368,7 @@ struct ubi_rnvol_req { ...@@ -366,7 +368,7 @@ struct ubi_rnvol_req {
__s8 padding2[2]; __s8 padding2[2];
char name[UBI_MAX_VOLUME_NAME + 1]; char name[UBI_MAX_VOLUME_NAME + 1];
} ents[UBI_MAX_RNVOL]; } ents[UBI_MAX_RNVOL];
} __attribute__ ((packed)); } __packed;
/** /**
* struct ubi_leb_change_req - a data structure used in atomic LEB change * struct ubi_leb_change_req - a data structure used in atomic LEB change
...@@ -381,7 +383,7 @@ struct ubi_leb_change_req { ...@@ -381,7 +383,7 @@ struct ubi_leb_change_req {
__s32 bytes; __s32 bytes;
__s8 dtype; __s8 dtype;
__s8 padding[7]; __s8 padding[7];
} __attribute__ ((packed)); } __packed;
/** /**
* struct ubi_map_req - a data structure used in map LEB requests. * struct ubi_map_req - a data structure used in map LEB requests.
...@@ -393,20 +395,20 @@ struct ubi_map_req { ...@@ -393,20 +395,20 @@ struct ubi_map_req {
__s32 lnum; __s32 lnum;
__s8 dtype; __s8 dtype;
__s8 padding[3]; __s8 padding[3];
} __attribute__ ((packed)); } __packed;
/** /**
* struct ubi_set_prop_req - a data structure used to set an ubi volume * struct ubi_set_vol_prop_req - a data structure used to set an UBI volume
* property. * property.
* @property: property to set (%UBI_PROP_DIRECT_WRITE) * @property: property to set (%UBI_VOL_PROP_DIRECT_WRITE)
* @padding: reserved for future, not used, has to be zeroed * @padding: reserved for future, not used, has to be zeroed
* @value: value to set * @value: value to set
*/ */
struct ubi_set_prop_req { struct ubi_set_vol_prop_req {
__u8 property; __u8 property;
__u8 padding[7]; __u8 padding[7];
__u64 value; __u64 value;
} __attribute__ ((packed)); } __packed;
#endif /* __UBI_USER_H__ */ #endif /* __UBI_USER_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment