Merge branch 'core/urgent' into core/futexes
Merge reason: this branch was on an pre -rc1 base, merge it up to -rc6+ to get the latest upstream fixes. Conflicts: kernel/futex.c Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
@@ -138,6 +138,7 @@ header-y += qnxtypes.h
|
||||
header-y += radeonfb.h
|
||||
header-y += raw.h
|
||||
header-y += resource.h
|
||||
header-y += romfs_fs.h
|
||||
header-y += rose.h
|
||||
header-y += serial_reg.h
|
||||
header-y += smbno.h
|
||||
@@ -314,7 +315,6 @@ unifdef-y += irqnr.h
|
||||
unifdef-y += reboot.h
|
||||
unifdef-y += reiserfs_fs.h
|
||||
unifdef-y += reiserfs_xattr.h
|
||||
unifdef-y += romfs_fs.h
|
||||
unifdef-y += route.h
|
||||
unifdef-y += rtc.h
|
||||
unifdef-y += rtnetlink.h
|
||||
|
@@ -97,6 +97,7 @@ void acpi_table_print_madt_entry (struct acpi_subtable_header *madt);
|
||||
/* the following four functions are architecture-dependent */
|
||||
void acpi_numa_slit_init (struct acpi_table_slit *slit);
|
||||
void acpi_numa_processor_affinity_init (struct acpi_srat_cpu_affinity *pa);
|
||||
void acpi_numa_x2apic_affinity_init(struct acpi_srat_x2apic_cpu_affinity *pa);
|
||||
void acpi_numa_memory_affinity_init (struct acpi_srat_mem_affinity *ma);
|
||||
void acpi_numa_arch_fixup(void);
|
||||
|
||||
@@ -110,6 +111,7 @@ int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base);
|
||||
int acpi_unregister_ioapic(acpi_handle handle, u32 gsi_base);
|
||||
void acpi_irq_stats_init(void);
|
||||
extern u32 acpi_irq_handled;
|
||||
extern u32 acpi_irq_not_handled;
|
||||
|
||||
extern struct acpi_mcfg_allocation *pci_mmcfg_config;
|
||||
extern int pci_mmcfg_config_num;
|
||||
|
@@ -29,6 +29,8 @@
|
||||
#ifndef __LINUX_ATA_H__
|
||||
#define __LINUX_ATA_H__
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
@@ -91,6 +93,7 @@ enum {
|
||||
ATA_ID_CFA_POWER = 160,
|
||||
ATA_ID_CFA_KEY_MGMT = 162,
|
||||
ATA_ID_CFA_MODES = 163,
|
||||
ATA_ID_DATA_SET_MGMT = 169,
|
||||
ATA_ID_ROT_SPEED = 217,
|
||||
ATA_ID_PIO4 = (1 << 1),
|
||||
|
||||
@@ -248,6 +251,7 @@ enum {
|
||||
ATA_CMD_SMART = 0xB0,
|
||||
ATA_CMD_MEDIA_LOCK = 0xDE,
|
||||
ATA_CMD_MEDIA_UNLOCK = 0xDF,
|
||||
ATA_CMD_DSM = 0x06,
|
||||
/* marked obsolete in the ATA/ATAPI-7 spec */
|
||||
ATA_CMD_RESTORE = 0x10,
|
||||
|
||||
@@ -321,6 +325,9 @@ enum {
|
||||
ATA_SMART_READ_VALUES = 0xD0,
|
||||
ATA_SMART_READ_THRESHOLDS = 0xD1,
|
||||
|
||||
/* feature values for Data Set Management */
|
||||
ATA_DSM_TRIM = 0x01,
|
||||
|
||||
/* password used in LBA Mid / LBA High for executing SMART commands */
|
||||
ATA_SMART_LBAM_PASS = 0x4F,
|
||||
ATA_SMART_LBAH_PASS = 0xC2,
|
||||
@@ -723,6 +730,42 @@ static inline int ata_id_has_unload(const u16 *id)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int ata_id_form_factor(const u16 *id)
|
||||
{
|
||||
u16 val = id[168];
|
||||
|
||||
if (ata_id_major_version(id) < 7 || val == 0 || val == 0xffff)
|
||||
return 0;
|
||||
|
||||
val &= 0xf;
|
||||
|
||||
if (val > 5)
|
||||
return 0;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline int ata_id_rotation_rate(const u16 *id)
|
||||
{
|
||||
u16 val = id[217];
|
||||
|
||||
if (ata_id_major_version(id) < 7 || val == 0 || val == 0xffff)
|
||||
return 0;
|
||||
|
||||
if (val > 1 && val < 0x401)
|
||||
return 0;
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static inline int ata_id_has_trim(const u16 *id)
|
||||
{
|
||||
if (ata_id_major_version(id) >= 7 &&
|
||||
(id[ATA_ID_DATA_SET_MGMT] & 1))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int ata_id_current_chs_valid(const u16 *id)
|
||||
{
|
||||
/* For ATA-1 devices, if the INITIALIZE DEVICE PARAMETERS command
|
||||
@@ -863,6 +906,32 @@ static inline void ata_id_to_hd_driveid(u16 *id)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Write up to 'max' LBA Range Entries to the buffer that will cover the
|
||||
* extent from sector to sector + count. This is used for TRIM and for
|
||||
* ADD LBA(S) TO NV CACHE PINNED SET.
|
||||
*/
|
||||
static inline unsigned ata_set_lba_range_entries(void *_buffer, unsigned max,
|
||||
u64 sector, unsigned long count)
|
||||
{
|
||||
__le64 *buffer = _buffer;
|
||||
unsigned i = 0;
|
||||
|
||||
while (i < max) {
|
||||
u64 entry = sector |
|
||||
((u64)(count > 0xffff ? 0xffff : count) << 48);
|
||||
buffer[i++] = __cpu_to_le64(entry);
|
||||
if (count <= 0xffff)
|
||||
break;
|
||||
count -= 0xffff;
|
||||
sector += 0xffff;
|
||||
}
|
||||
|
||||
max = ALIGN(i * 8, 512);
|
||||
memset(buffer + i, 0, max - i * 8);
|
||||
return max;
|
||||
}
|
||||
|
||||
static inline int is_multi_taskfile(struct ata_taskfile *tf)
|
||||
{
|
||||
return (tf->command == ATA_CMD_READ_MULTI) ||
|
||||
|
@@ -24,8 +24,8 @@ struct dentry;
|
||||
*/
|
||||
enum bdi_state {
|
||||
BDI_pdflush, /* A pdflush thread is working this device */
|
||||
BDI_write_congested, /* The write queue is getting full */
|
||||
BDI_read_congested, /* The read queue is getting full */
|
||||
BDI_async_congested, /* The async (write) queue is getting full */
|
||||
BDI_sync_congested, /* The sync queue is getting full */
|
||||
BDI_unused, /* Available bits start here */
|
||||
};
|
||||
|
||||
@@ -215,18 +215,18 @@ static inline int bdi_congested(struct backing_dev_info *bdi, int bdi_bits)
|
||||
|
||||
static inline int bdi_read_congested(struct backing_dev_info *bdi)
|
||||
{
|
||||
return bdi_congested(bdi, 1 << BDI_read_congested);
|
||||
return bdi_congested(bdi, 1 << BDI_sync_congested);
|
||||
}
|
||||
|
||||
static inline int bdi_write_congested(struct backing_dev_info *bdi)
|
||||
{
|
||||
return bdi_congested(bdi, 1 << BDI_write_congested);
|
||||
return bdi_congested(bdi, 1 << BDI_async_congested);
|
||||
}
|
||||
|
||||
static inline int bdi_rw_congested(struct backing_dev_info *bdi)
|
||||
{
|
||||
return bdi_congested(bdi, (1 << BDI_read_congested)|
|
||||
(1 << BDI_write_congested));
|
||||
return bdi_congested(bdi, (1 << BDI_sync_congested) |
|
||||
(1 << BDI_async_congested));
|
||||
}
|
||||
|
||||
void clear_bdi_congested(struct backing_dev_info *bdi, int rw);
|
||||
|
@@ -82,7 +82,19 @@ struct linux_binfmt {
|
||||
int hasvdso;
|
||||
};
|
||||
|
||||
extern int register_binfmt(struct linux_binfmt *);
|
||||
extern int __register_binfmt(struct linux_binfmt *fmt, int insert);
|
||||
|
||||
/* Registration of default binfmt handlers */
|
||||
static inline int register_binfmt(struct linux_binfmt *fmt)
|
||||
{
|
||||
return __register_binfmt(fmt, 0);
|
||||
}
|
||||
/* Same as above, but adds a new binfmt at the top of the list */
|
||||
static inline int insert_binfmt(struct linux_binfmt *fmt)
|
||||
{
|
||||
return __register_binfmt(fmt, 1);
|
||||
}
|
||||
|
||||
extern void unregister_binfmt(struct linux_binfmt *);
|
||||
|
||||
extern int prepare_binprm(struct linux_binprm *);
|
||||
|
@@ -132,6 +132,7 @@ struct bio {
|
||||
* top 4 bits of bio flags indicate the pool this bio came from
|
||||
*/
|
||||
#define BIO_POOL_BITS (4)
|
||||
#define BIO_POOL_NONE ((1UL << BIO_POOL_BITS) - 1)
|
||||
#define BIO_POOL_OFFSET (BITS_PER_LONG - BIO_POOL_BITS)
|
||||
#define BIO_POOL_MASK (1UL << BIO_POOL_OFFSET)
|
||||
#define BIO_POOL_IDX(bio) ((bio)->bi_flags >> BIO_POOL_OFFSET)
|
||||
@@ -145,20 +146,21 @@ struct bio {
|
||||
* bit 2 -- barrier
|
||||
* Insert a serialization point in the IO queue, forcing previously
|
||||
* submitted IO to be completed before this one is issued.
|
||||
* bit 3 -- synchronous I/O hint: the block layer will unplug immediately
|
||||
* Note that this does NOT indicate that the IO itself is sync, just
|
||||
* that the block layer will not postpone issue of this IO by plugging.
|
||||
* bit 4 -- metadata request
|
||||
* bit 3 -- synchronous I/O hint.
|
||||
* bit 4 -- Unplug the device immediately after submitting this bio.
|
||||
* bit 5 -- metadata request
|
||||
* Used for tracing to differentiate metadata and data IO. May also
|
||||
* get some preferential treatment in the IO scheduler
|
||||
* bit 5 -- discard sectors
|
||||
* bit 6 -- discard sectors
|
||||
* Informs the lower level device that this range of sectors is no longer
|
||||
* used by the file system and may thus be freed by the device. Used
|
||||
* for flash based storage.
|
||||
* bit 6 -- fail fast device errors
|
||||
* bit 7 -- fail fast transport errors
|
||||
* bit 8 -- fail fast driver errors
|
||||
* bit 7 -- fail fast device errors
|
||||
* bit 8 -- fail fast transport errors
|
||||
* bit 9 -- fail fast driver errors
|
||||
* Don't want driver retries for any fast fail whatever the reason.
|
||||
* bit 10 -- Tell the IO scheduler not to wait for more requests after this
|
||||
one has been submitted, even if it is a SYNC request.
|
||||
*/
|
||||
#define BIO_RW 0 /* Must match RW in req flags (blkdev.h) */
|
||||
#define BIO_RW_AHEAD 1 /* Must match FAILFAST in req flags */
|
||||
@@ -170,6 +172,7 @@ struct bio {
|
||||
#define BIO_RW_FAILFAST_DEV 7
|
||||
#define BIO_RW_FAILFAST_TRANSPORT 8
|
||||
#define BIO_RW_FAILFAST_DRIVER 9
|
||||
#define BIO_RW_NOIDLE 10
|
||||
|
||||
#define bio_rw_flagged(bio, flag) ((bio)->bi_rw & (1 << (flag)))
|
||||
|
||||
@@ -188,6 +191,7 @@ struct bio {
|
||||
#define bio_rw_ahead(bio) bio_rw_flagged(bio, BIO_RW_AHEAD)
|
||||
#define bio_rw_meta(bio) bio_rw_flagged(bio, BIO_RW_META)
|
||||
#define bio_discard(bio) bio_rw_flagged(bio, BIO_RW_DISCARD)
|
||||
#define bio_noidle(bio) bio_rw_flagged(bio, BIO_RW_NOIDLE)
|
||||
|
||||
/*
|
||||
* upper 16 bits of bi_rw define the io priority of this bio
|
||||
@@ -501,6 +505,115 @@ static inline int bio_has_data(struct bio *bio)
|
||||
return bio && bio->bi_io_vec != NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* BIO list managment for use by remapping drivers (e.g. DM or MD).
|
||||
*
|
||||
* A bio_list anchors a singly-linked list of bios chained through the bi_next
|
||||
* member of the bio. The bio_list also caches the last list member to allow
|
||||
* fast access to the tail.
|
||||
*/
|
||||
struct bio_list {
|
||||
struct bio *head;
|
||||
struct bio *tail;
|
||||
};
|
||||
|
||||
static inline int bio_list_empty(const struct bio_list *bl)
|
||||
{
|
||||
return bl->head == NULL;
|
||||
}
|
||||
|
||||
static inline void bio_list_init(struct bio_list *bl)
|
||||
{
|
||||
bl->head = bl->tail = NULL;
|
||||
}
|
||||
|
||||
#define bio_list_for_each(bio, bl) \
|
||||
for (bio = (bl)->head; bio; bio = bio->bi_next)
|
||||
|
||||
static inline unsigned bio_list_size(const struct bio_list *bl)
|
||||
{
|
||||
unsigned sz = 0;
|
||||
struct bio *bio;
|
||||
|
||||
bio_list_for_each(bio, bl)
|
||||
sz++;
|
||||
|
||||
return sz;
|
||||
}
|
||||
|
||||
static inline void bio_list_add(struct bio_list *bl, struct bio *bio)
|
||||
{
|
||||
bio->bi_next = NULL;
|
||||
|
||||
if (bl->tail)
|
||||
bl->tail->bi_next = bio;
|
||||
else
|
||||
bl->head = bio;
|
||||
|
||||
bl->tail = bio;
|
||||
}
|
||||
|
||||
static inline void bio_list_add_head(struct bio_list *bl, struct bio *bio)
|
||||
{
|
||||
bio->bi_next = bl->head;
|
||||
|
||||
bl->head = bio;
|
||||
|
||||
if (!bl->tail)
|
||||
bl->tail = bio;
|
||||
}
|
||||
|
||||
static inline void bio_list_merge(struct bio_list *bl, struct bio_list *bl2)
|
||||
{
|
||||
if (!bl2->head)
|
||||
return;
|
||||
|
||||
if (bl->tail)
|
||||
bl->tail->bi_next = bl2->head;
|
||||
else
|
||||
bl->head = bl2->head;
|
||||
|
||||
bl->tail = bl2->tail;
|
||||
}
|
||||
|
||||
static inline void bio_list_merge_head(struct bio_list *bl,
|
||||
struct bio_list *bl2)
|
||||
{
|
||||
if (!bl2->head)
|
||||
return;
|
||||
|
||||
if (bl->head)
|
||||
bl2->tail->bi_next = bl->head;
|
||||
else
|
||||
bl->tail = bl2->tail;
|
||||
|
||||
bl->head = bl2->head;
|
||||
}
|
||||
|
||||
static inline struct bio *bio_list_pop(struct bio_list *bl)
|
||||
{
|
||||
struct bio *bio = bl->head;
|
||||
|
||||
if (bio) {
|
||||
bl->head = bl->head->bi_next;
|
||||
if (!bl->head)
|
||||
bl->tail = NULL;
|
||||
|
||||
bio->bi_next = NULL;
|
||||
}
|
||||
|
||||
return bio;
|
||||
}
|
||||
|
||||
static inline struct bio *bio_list_get(struct bio_list *bl)
|
||||
{
|
||||
struct bio *bio = bl->head;
|
||||
|
||||
bl->head = bl->tail = NULL;
|
||||
|
||||
return bio;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
|
||||
#define bip_vec_idx(bip, idx) (&(bip->bip_vec[(idx)]))
|
||||
|
@@ -112,6 +112,25 @@ static inline unsigned fls_long(unsigned long l)
|
||||
return fls64(l);
|
||||
}
|
||||
|
||||
/**
|
||||
* __ffs64 - find first set bit in a 64 bit word
|
||||
* @word: The 64 bit word
|
||||
*
|
||||
* On 64 bit arches this is a synomyn for __ffs
|
||||
* The result is not defined if no bits are set, so check that @word
|
||||
* is non-zero before calling this.
|
||||
*/
|
||||
static inline unsigned long __ffs64(u64 word)
|
||||
{
|
||||
#if BITS_PER_LONG == 32
|
||||
if (((u32)word) == 0UL)
|
||||
return __ffs((u32)(word >> 32)) + 32;
|
||||
#elif BITS_PER_LONG != 64
|
||||
#error BITS_PER_LONG not 32 or 64
|
||||
#endif
|
||||
return __ffs((unsigned long)word);
|
||||
}
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#ifdef CONFIG_GENERIC_FIND_FIRST_BIT
|
||||
|
||||
|
@@ -38,6 +38,10 @@ struct request;
|
||||
typedef void (rq_end_io_fn)(struct request *, int);
|
||||
|
||||
struct request_list {
|
||||
/*
|
||||
* count[], starved[], and wait[] are indexed by
|
||||
* BLK_RW_SYNC/BLK_RW_ASYNC
|
||||
*/
|
||||
int count[2];
|
||||
int starved[2];
|
||||
int elvpriv;
|
||||
@@ -66,6 +70,11 @@ enum rq_cmd_type_bits {
|
||||
REQ_TYPE_ATA_PC,
|
||||
};
|
||||
|
||||
enum {
|
||||
BLK_RW_ASYNC = 0,
|
||||
BLK_RW_SYNC = 1,
|
||||
};
|
||||
|
||||
/*
|
||||
* For request of type REQ_TYPE_LINUX_BLOCK, rq->cmd[0] is the opcode being
|
||||
* sent down (similar to how REQ_TYPE_BLOCK_PC means that ->cmd[] holds a
|
||||
@@ -103,12 +112,13 @@ enum rq_flag_bits {
|
||||
__REQ_QUIET, /* don't worry about errors */
|
||||
__REQ_PREEMPT, /* set for "ide_preempt" requests */
|
||||
__REQ_ORDERED_COLOR, /* is before or after barrier */
|
||||
__REQ_RW_SYNC, /* request is sync (O_DIRECT) */
|
||||
__REQ_RW_SYNC, /* request is sync (sync write or read) */
|
||||
__REQ_ALLOCED, /* request came from our alloc pool */
|
||||
__REQ_RW_META, /* metadata io request */
|
||||
__REQ_COPY_USER, /* contains copies of user pages */
|
||||
__REQ_INTEGRITY, /* integrity metadata has been remapped */
|
||||
__REQ_UNPLUG, /* unplug queue on submission */
|
||||
__REQ_NOIDLE, /* Don't anticipate more IO after this one */
|
||||
__REQ_IO_STAT, /* account I/O stat */
|
||||
__REQ_NR_BITS, /* stops here */
|
||||
};
|
||||
|
||||
@@ -135,7 +145,8 @@ enum rq_flag_bits {
|
||||
#define REQ_RW_META (1 << __REQ_RW_META)
|
||||
#define REQ_COPY_USER (1 << __REQ_COPY_USER)
|
||||
#define REQ_INTEGRITY (1 << __REQ_INTEGRITY)
|
||||
#define REQ_UNPLUG (1 << __REQ_UNPLUG)
|
||||
#define REQ_NOIDLE (1 << __REQ_NOIDLE)
|
||||
#define REQ_IO_STAT (1 << __REQ_IO_STAT)
|
||||
|
||||
#define BLK_MAX_CDB 16
|
||||
|
||||
@@ -438,8 +449,8 @@ struct request_queue
|
||||
#define QUEUE_FLAG_CLUSTER 0 /* cluster several segments into 1 */
|
||||
#define QUEUE_FLAG_QUEUED 1 /* uses generic tag queueing */
|
||||
#define QUEUE_FLAG_STOPPED 2 /* queue is stopped */
|
||||
#define QUEUE_FLAG_READFULL 3 /* read queue has been filled */
|
||||
#define QUEUE_FLAG_WRITEFULL 4 /* write queue has been filled */
|
||||
#define QUEUE_FLAG_SYNCFULL 3 /* read queue has been filled */
|
||||
#define QUEUE_FLAG_ASYNCFULL 4 /* write queue has been filled */
|
||||
#define QUEUE_FLAG_DEAD 5 /* queue being torn down */
|
||||
#define QUEUE_FLAG_REENTER 6 /* Re-entrancy avoidance */
|
||||
#define QUEUE_FLAG_PLUGGED 7 /* queue is plugged */
|
||||
@@ -589,6 +600,8 @@ enum {
|
||||
blk_failfast_transport(rq) || \
|
||||
blk_failfast_driver(rq))
|
||||
#define blk_rq_started(rq) ((rq)->cmd_flags & REQ_STARTED)
|
||||
#define blk_rq_io_stat(rq) ((rq)->cmd_flags & REQ_IO_STAT)
|
||||
#define blk_rq_quiet(rq) ((rq)->cmd_flags & REQ_QUIET)
|
||||
|
||||
#define blk_account_rq(rq) (blk_rq_started(rq) && (blk_fs_request(rq) || blk_discard_rq(rq)))
|
||||
|
||||
@@ -611,32 +624,42 @@ enum {
|
||||
#define rq_data_dir(rq) ((rq)->cmd_flags & 1)
|
||||
|
||||
/*
|
||||
* We regard a request as sync, if it's a READ or a SYNC write.
|
||||
* We regard a request as sync, if either a read or a sync write
|
||||
*/
|
||||
#define rq_is_sync(rq) (rq_data_dir((rq)) == READ || (rq)->cmd_flags & REQ_RW_SYNC)
|
||||
static inline bool rw_is_sync(unsigned int rw_flags)
|
||||
{
|
||||
return !(rw_flags & REQ_RW) || (rw_flags & REQ_RW_SYNC);
|
||||
}
|
||||
|
||||
static inline bool rq_is_sync(struct request *rq)
|
||||
{
|
||||
return rw_is_sync(rq->cmd_flags);
|
||||
}
|
||||
|
||||
#define rq_is_meta(rq) ((rq)->cmd_flags & REQ_RW_META)
|
||||
#define rq_noidle(rq) ((rq)->cmd_flags & REQ_NOIDLE)
|
||||
|
||||
static inline int blk_queue_full(struct request_queue *q, int rw)
|
||||
static inline int blk_queue_full(struct request_queue *q, int sync)
|
||||
{
|
||||
if (rw == READ)
|
||||
return test_bit(QUEUE_FLAG_READFULL, &q->queue_flags);
|
||||
return test_bit(QUEUE_FLAG_WRITEFULL, &q->queue_flags);
|
||||
if (sync)
|
||||
return test_bit(QUEUE_FLAG_SYNCFULL, &q->queue_flags);
|
||||
return test_bit(QUEUE_FLAG_ASYNCFULL, &q->queue_flags);
|
||||
}
|
||||
|
||||
static inline void blk_set_queue_full(struct request_queue *q, int rw)
|
||||
static inline void blk_set_queue_full(struct request_queue *q, int sync)
|
||||
{
|
||||
if (rw == READ)
|
||||
queue_flag_set(QUEUE_FLAG_READFULL, q);
|
||||
if (sync)
|
||||
queue_flag_set(QUEUE_FLAG_SYNCFULL, q);
|
||||
else
|
||||
queue_flag_set(QUEUE_FLAG_WRITEFULL, q);
|
||||
queue_flag_set(QUEUE_FLAG_ASYNCFULL, q);
|
||||
}
|
||||
|
||||
static inline void blk_clear_queue_full(struct request_queue *q, int rw)
|
||||
static inline void blk_clear_queue_full(struct request_queue *q, int sync)
|
||||
{
|
||||
if (rw == READ)
|
||||
queue_flag_clear(QUEUE_FLAG_READFULL, q);
|
||||
if (sync)
|
||||
queue_flag_clear(QUEUE_FLAG_SYNCFULL, q);
|
||||
else
|
||||
queue_flag_clear(QUEUE_FLAG_WRITEFULL, q);
|
||||
queue_flag_clear(QUEUE_FLAG_ASYNCFULL, q);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -144,6 +144,9 @@ struct blk_user_trace_setup {
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#if defined(CONFIG_BLK_DEV_IO_TRACE)
|
||||
|
||||
#include <linux/sysfs.h>
|
||||
|
||||
struct blk_trace {
|
||||
int trace_state;
|
||||
struct rchan *rchan;
|
||||
@@ -194,6 +197,8 @@ extern int blk_trace_setup(struct request_queue *q, char *name, dev_t dev,
|
||||
extern int blk_trace_startstop(struct request_queue *q, int start);
|
||||
extern int blk_trace_remove(struct request_queue *q);
|
||||
|
||||
extern struct attribute_group blk_trace_attr_group;
|
||||
|
||||
#else /* !CONFIG_BLK_DEV_IO_TRACE */
|
||||
#define blk_trace_ioctl(bdev, cmd, arg) (-ENOTTY)
|
||||
#define blk_trace_shutdown(q) do { } while (0)
|
||||
|
@@ -155,6 +155,7 @@ void create_empty_buffers(struct page *, unsigned long,
|
||||
unsigned long b_state);
|
||||
void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
|
||||
void end_buffer_write_sync(struct buffer_head *bh, int uptodate);
|
||||
void end_buffer_async_write(struct buffer_head *bh, int uptodate);
|
||||
|
||||
/* Things to do with buffers at mapping->private_list */
|
||||
void mark_buffer_dirty_inode(struct buffer_head *bh, struct inode *inode);
|
||||
@@ -197,6 +198,8 @@ extern int buffer_heads_over_limit;
|
||||
void block_invalidatepage(struct page *page, unsigned long offset);
|
||||
int block_write_full_page(struct page *page, get_block_t *get_block,
|
||||
struct writeback_control *wbc);
|
||||
int block_write_full_page_endio(struct page *page, get_block_t *get_block,
|
||||
struct writeback_control *wbc, bh_end_io_t *handler);
|
||||
int block_read_full_page(struct page*, get_block_t*);
|
||||
int block_is_partially_uptodate(struct page *page, read_descriptor_t *desc,
|
||||
unsigned long from);
|
||||
|
@@ -377,7 +377,21 @@ struct cpu_vfs_cap_data {
|
||||
#define CAP_FOR_EACH_U32(__capi) \
|
||||
for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi)
|
||||
|
||||
/*
|
||||
* CAP_FS_MASK and CAP_NFSD_MASKS:
|
||||
*
|
||||
* The fs mask is all the privileges that fsuid==0 historically meant.
|
||||
* At one time in the past, that included CAP_MKNOD and CAP_LINUX_IMMUTABLE.
|
||||
*
|
||||
* It has never meant setting security.* and trusted.* xattrs.
|
||||
*
|
||||
* We could also define fsmask as follows:
|
||||
* 1. CAP_FS_MASK is the privilege to bypass all fs-related DAC permissions
|
||||
* 2. The security.* and trusted.* xattrs are fs-related MAC permissions
|
||||
*/
|
||||
|
||||
# define CAP_FS_MASK_B0 (CAP_TO_MASK(CAP_CHOWN) \
|
||||
| CAP_TO_MASK(CAP_MKNOD) \
|
||||
| CAP_TO_MASK(CAP_DAC_OVERRIDE) \
|
||||
| CAP_TO_MASK(CAP_DAC_READ_SEARCH) \
|
||||
| CAP_TO_MASK(CAP_FOWNER) \
|
||||
@@ -392,11 +406,12 @@ struct cpu_vfs_cap_data {
|
||||
# define CAP_EMPTY_SET ((kernel_cap_t){{ 0, 0 }})
|
||||
# define CAP_FULL_SET ((kernel_cap_t){{ ~0, ~0 }})
|
||||
# define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }})
|
||||
# define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } })
|
||||
# define CAP_FS_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \
|
||||
| CAP_TO_MASK(CAP_LINUX_IMMUTABLE), \
|
||||
CAP_FS_MASK_B1 } })
|
||||
# define CAP_NFSD_SET ((kernel_cap_t){{ CAP_FS_MASK_B0 \
|
||||
| CAP_TO_MASK(CAP_SYS_RESOURCE) \
|
||||
| CAP_TO_MASK(CAP_MKNOD), \
|
||||
CAP_FS_MASK_B1 } })
|
||||
| CAP_TO_MASK(CAP_SYS_RESOURCE), \
|
||||
CAP_FS_MASK_B1 } })
|
||||
|
||||
#endif /* _KERNEL_CAPABILITY_U32S != 2 */
|
||||
|
||||
|
@@ -143,7 +143,9 @@ extern u64 timecounter_cyc2time(struct timecounter *tc,
|
||||
* 400-499: Perfect
|
||||
* The ideal clocksource. A must-use where
|
||||
* available.
|
||||
* @read: returns a cycle value
|
||||
* @read: returns a cycle value, passes clocksource as argument
|
||||
* @enable: optional function to enable the clocksource
|
||||
* @disable: optional function to disable the clocksource
|
||||
* @mask: bitmask for two's complement
|
||||
* subtraction of non 64 bit counters
|
||||
* @mult: cycle to nanosecond multiplier (adjusted by NTP)
|
||||
@@ -162,7 +164,9 @@ struct clocksource {
|
||||
char *name;
|
||||
struct list_head list;
|
||||
int rating;
|
||||
cycle_t (*read)(void);
|
||||
cycle_t (*read)(struct clocksource *cs);
|
||||
int (*enable)(struct clocksource *cs);
|
||||
void (*disable)(struct clocksource *cs);
|
||||
cycle_t mask;
|
||||
u32 mult;
|
||||
u32 mult_orig;
|
||||
@@ -271,7 +275,34 @@ static inline u32 clocksource_hz2mult(u32 hz, u32 shift_constant)
|
||||
*/
|
||||
static inline cycle_t clocksource_read(struct clocksource *cs)
|
||||
{
|
||||
return cs->read();
|
||||
return cs->read(cs);
|
||||
}
|
||||
|
||||
/**
|
||||
* clocksource_enable: - enable clocksource
|
||||
* @cs: pointer to clocksource
|
||||
*
|
||||
* Enables the specified clocksource. The clocksource callback
|
||||
* function should start up the hardware and setup mult and field
|
||||
* members of struct clocksource to reflect hardware capabilities.
|
||||
*/
|
||||
static inline int clocksource_enable(struct clocksource *cs)
|
||||
{
|
||||
return cs->enable ? cs->enable(cs) : 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* clocksource_disable: - disable clocksource
|
||||
* @cs: pointer to clocksource
|
||||
*
|
||||
* Disables the specified clocksource. The clocksource callback
|
||||
* function should power down the now unused hardware block to
|
||||
* save power.
|
||||
*/
|
||||
static inline void clocksource_disable(struct clocksource *cs)
|
||||
{
|
||||
if (cs->disable)
|
||||
cs->disable(cs);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -193,10 +193,10 @@ asmlinkage ssize_t compat_sys_writev(unsigned long fd,
|
||||
const struct compat_iovec __user *vec, unsigned long vlen);
|
||||
asmlinkage ssize_t compat_sys_preadv(unsigned long fd,
|
||||
const struct compat_iovec __user *vec,
|
||||
unsigned long vlen, u32 pos_high, u32 pos_low);
|
||||
unsigned long vlen, u32 pos_low, u32 pos_high);
|
||||
asmlinkage ssize_t compat_sys_pwritev(unsigned long fd,
|
||||
const struct compat_iovec __user *vec,
|
||||
unsigned long vlen, u32 pos_high, u32 pos_low);
|
||||
unsigned long vlen, u32 pos_low, u32 pos_high);
|
||||
|
||||
int compat_do_execve(char * filename, compat_uptr_t __user *argv,
|
||||
compat_uptr_t __user *envp, struct pt_regs * regs);
|
||||
|
@@ -68,6 +68,7 @@ struct ftrace_branch_data {
|
||||
unsigned long miss;
|
||||
unsigned long hit;
|
||||
};
|
||||
unsigned long miss_hit[2];
|
||||
};
|
||||
};
|
||||
|
||||
@@ -75,7 +76,8 @@ struct ftrace_branch_data {
|
||||
* Note: DISABLE_BRANCH_PROFILING can be used by special lowlevel code
|
||||
* to disable branch tracing on a per file basis.
|
||||
*/
|
||||
#if defined(CONFIG_TRACE_BRANCH_PROFILING) && !defined(DISABLE_BRANCH_PROFILING)
|
||||
#if defined(CONFIG_TRACE_BRANCH_PROFILING) \
|
||||
&& !defined(DISABLE_BRANCH_PROFILING) && !defined(__CHECKER__)
|
||||
void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||
|
||||
#define likely_notrace(x) __builtin_expect(!!(x), 1)
|
||||
@@ -113,7 +115,9 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||
* "Define 'is'", Bill Clinton
|
||||
* "Define 'if'", Steven Rostedt
|
||||
*/
|
||||
#define if(cond) if (__builtin_constant_p((cond)) ? !!(cond) : \
|
||||
#define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) )
|
||||
#define __trace_if(cond) \
|
||||
if (__builtin_constant_p((cond)) ? !!(cond) : \
|
||||
({ \
|
||||
int ______r; \
|
||||
static struct ftrace_branch_data \
|
||||
@@ -125,10 +129,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect);
|
||||
.line = __LINE__, \
|
||||
}; \
|
||||
______r = !!(cond); \
|
||||
if (______r) \
|
||||
______f.hit++; \
|
||||
else \
|
||||
______f.miss++; \
|
||||
______f.miss_hit[______r]++; \
|
||||
______r; \
|
||||
}))
|
||||
#endif /* CONFIG_PROFILE_ALL_BRANCHES */
|
||||
|
@@ -39,8 +39,10 @@
|
||||
#define CN_IDX_V86D 0x4
|
||||
#define CN_VAL_V86D_UVESAFB 0x1
|
||||
#define CN_IDX_BB 0x5 /* BlackBoard, from the TSP GPL sampling framework */
|
||||
#define CN_DST_IDX 0x6
|
||||
#define CN_DST_VAL 0x1
|
||||
|
||||
#define CN_NETLINK_USERS 6
|
||||
#define CN_NETLINK_USERS 7
|
||||
|
||||
/*
|
||||
* Maximum connector's message size.
|
||||
|
@@ -2,12 +2,20 @@
|
||||
#define __LINUX_DEBUG_LOCKING_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
struct task_struct;
|
||||
|
||||
extern int debug_locks;
|
||||
extern int debug_locks_silent;
|
||||
|
||||
|
||||
static inline int __debug_locks_off(void)
|
||||
{
|
||||
return xchg(&debug_locks, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Generic 'turn off all lock debugging' function:
|
||||
*/
|
||||
|
@@ -71,6 +71,9 @@ struct dentry *debugfs_create_bool(const char *name, mode_t mode,
|
||||
struct dentry *debugfs_create_blob(const char *name, mode_t mode,
|
||||
struct dentry *parent,
|
||||
struct debugfs_blob_wrapper *blob);
|
||||
|
||||
bool debugfs_initialized(void);
|
||||
|
||||
#else
|
||||
|
||||
#include <linux/err.h>
|
||||
@@ -183,6 +186,11 @@ static inline struct dentry *debugfs_create_blob(const char *name, mode_t mode,
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline bool debugfs_initialized(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@@ -116,7 +116,6 @@ void dm_put_device(struct dm_target *ti, struct dm_dev *d);
|
||||
/*
|
||||
* Target features
|
||||
*/
|
||||
#define DM_TARGET_SUPPORTS_BARRIERS 0x00000001
|
||||
|
||||
struct target_type {
|
||||
uint64_t features;
|
||||
|
@@ -384,13 +384,8 @@ struct device {
|
||||
struct device_driver *driver; /* which driver has allocated this
|
||||
device */
|
||||
void *driver_data; /* data private to the driver */
|
||||
|
||||
void *platform_data; /* We will remove platform_data
|
||||
field if all platform devices
|
||||
pass its platform specific data
|
||||
from platform_device->platform_data,
|
||||
other kind of devices should not
|
||||
use platform_data. */
|
||||
void *platform_data; /* Platform specific data, device
|
||||
core doesn't touch it */
|
||||
struct dev_pm_info power;
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
@@ -551,6 +546,7 @@ extern int (*platform_notify_remove)(struct device *dev);
|
||||
extern struct device *get_device(struct device *dev);
|
||||
extern void put_device(struct device *dev);
|
||||
|
||||
extern void wait_for_device_probe(void);
|
||||
|
||||
/* drivers/base/power/shutdown.c */
|
||||
extern void device_shutdown(void);
|
||||
|
@@ -115,7 +115,7 @@ static inline u64 dma_get_mask(struct device *dev)
|
||||
{
|
||||
if (dev && dev->dma_mask && *dev->dma_mask)
|
||||
return *dev->dma_mask;
|
||||
return DMA_32BIT_MASK;
|
||||
return DMA_BIT_MASK(32);
|
||||
}
|
||||
|
||||
extern u64 dma_get_required_mask(struct device *dev);
|
||||
|
@@ -78,12 +78,18 @@ enum dma_transaction_type {
|
||||
* dependency chains
|
||||
* @DMA_COMPL_SKIP_SRC_UNMAP - set to disable dma-unmapping the source buffer(s)
|
||||
* @DMA_COMPL_SKIP_DEST_UNMAP - set to disable dma-unmapping the destination(s)
|
||||
* @DMA_COMPL_SRC_UNMAP_SINGLE - set to do the source dma-unmapping as single
|
||||
* (if not set, do the source dma-unmapping as page)
|
||||
* @DMA_COMPL_DEST_UNMAP_SINGLE - set to do the destination dma-unmapping as single
|
||||
* (if not set, do the destination dma-unmapping as page)
|
||||
*/
|
||||
enum dma_ctrl_flags {
|
||||
DMA_PREP_INTERRUPT = (1 << 0),
|
||||
DMA_CTRL_ACK = (1 << 1),
|
||||
DMA_COMPL_SKIP_SRC_UNMAP = (1 << 2),
|
||||
DMA_COMPL_SKIP_DEST_UNMAP = (1 << 3),
|
||||
DMA_COMPL_SRC_UNMAP_SINGLE = (1 << 4),
|
||||
DMA_COMPL_DEST_UNMAP_SINGLE = (1 << 5),
|
||||
};
|
||||
|
||||
/**
|
||||
|
@@ -34,6 +34,7 @@ struct dmar_drhd_unit {
|
||||
u64 reg_base_addr; /* register base address*/
|
||||
struct pci_dev **devices; /* target device array */
|
||||
int devices_cnt; /* target device count */
|
||||
u16 segment; /* PCI domain */
|
||||
u8 ignored:1; /* ignore drhd */
|
||||
u8 include_all:1;
|
||||
struct intel_iommu *iommu;
|
||||
@@ -44,6 +45,14 @@ extern struct list_head dmar_drhd_units;
|
||||
#define for_each_drhd_unit(drhd) \
|
||||
list_for_each_entry(drhd, &dmar_drhd_units, list)
|
||||
|
||||
#define for_each_active_iommu(i, drhd) \
|
||||
list_for_each_entry(drhd, &dmar_drhd_units, list) \
|
||||
if (i=drhd->iommu, drhd->ignored) {} else
|
||||
|
||||
#define for_each_iommu(i, drhd) \
|
||||
list_for_each_entry(drhd, &dmar_drhd_units, list) \
|
||||
if (i=drhd->iommu, 0) {} else
|
||||
|
||||
extern int dmar_table_init(void);
|
||||
extern int dmar_dev_scope_init(void);
|
||||
|
||||
@@ -100,6 +109,8 @@ struct irte {
|
||||
#ifdef CONFIG_INTR_REMAP
|
||||
extern int intr_remapping_enabled;
|
||||
extern int enable_intr_remapping(int);
|
||||
extern void disable_intr_remapping(void);
|
||||
extern int reenable_intr_remapping(int);
|
||||
|
||||
extern int get_irte(int irq, struct irte *entry);
|
||||
extern int modify_irte(int irq, struct irte *irte_modified);
|
||||
|
@@ -1,12 +0,0 @@
|
||||
/* platform data for the DS1WM driver */
|
||||
|
||||
struct ds1wm_platform_data {
|
||||
int bus_shift; /* number of shifts needed to calculate the
|
||||
* offset between DS1WM registers;
|
||||
* e.g. on h5xxx and h2200 this is 2
|
||||
* (registers aligned to 4-byte boundaries),
|
||||
* while on hx4700 this is 1 */
|
||||
int active_high;
|
||||
void (*enable)(struct platform_device *pdev);
|
||||
void (*disable)(struct platform_device *pdev);
|
||||
};
|
587
include/linux/dst.h
Normal file
587
include/linux/dst.h
Normal file
@@ -0,0 +1,587 @@
|
||||
/*
|
||||
* 2007+ Copyright (c) Evgeniy Polyakov <johnpol@2ka.mipt.ru>
|
||||
* All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __DST_H
|
||||
#define __DST_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/connector.h>
|
||||
|
||||
#define DST_NAMELEN 32
|
||||
#define DST_NAME "dst"
|
||||
|
||||
enum {
|
||||
/* Remove node with given id from storage */
|
||||
DST_DEL_NODE = 0,
|
||||
/* Add remote node with given id to the storage */
|
||||
DST_ADD_REMOTE,
|
||||
/* Add local node with given id to the storage to be exported and used by remote peers */
|
||||
DST_ADD_EXPORT,
|
||||
/* Crypto initialization command (hash/cipher used to protect the connection) */
|
||||
DST_CRYPTO,
|
||||
/* Security attributes for given connection (permissions for example) */
|
||||
DST_SECURITY,
|
||||
/* Register given node in the block layer subsystem */
|
||||
DST_START,
|
||||
DST_CMD_MAX
|
||||
};
|
||||
|
||||
struct dst_ctl
|
||||
{
|
||||
/* Storage name */
|
||||
char name[DST_NAMELEN];
|
||||
/* Command flags */
|
||||
__u32 flags;
|
||||
/* Command itself (see above) */
|
||||
__u32 cmd;
|
||||
/* Maximum number of pages per single request in this device */
|
||||
__u32 max_pages;
|
||||
/* Stale/error transaction scanning timeout in milliseconds */
|
||||
__u32 trans_scan_timeout;
|
||||
/* Maximum number of retry sends before completing transaction as broken */
|
||||
__u32 trans_max_retries;
|
||||
/* Storage size */
|
||||
__u64 size;
|
||||
};
|
||||
|
||||
/* Reply command carries completion status */
|
||||
struct dst_ctl_ack
|
||||
{
|
||||
struct cn_msg msg;
|
||||
int error;
|
||||
int unused[3];
|
||||
};
|
||||
|
||||
/*
|
||||
* Unfortunaltely socket address structure is not exported to userspace
|
||||
* and is redefined there.
|
||||
*/
|
||||
#define SADDR_MAX_DATA 128
|
||||
|
||||
struct saddr {
|
||||
/* address family, AF_xxx */
|
||||
unsigned short sa_family;
|
||||
/* 14 bytes of protocol address */
|
||||
char sa_data[SADDR_MAX_DATA];
|
||||
/* Number of bytes used in sa_data */
|
||||
unsigned short sa_data_len;
|
||||
};
|
||||
|
||||
/* Address structure */
|
||||
struct dst_network_ctl
|
||||
{
|
||||
/* Socket type: datagram, stream...*/
|
||||
unsigned int type;
|
||||
/* Let me guess, is it a Jupiter diameter? */
|
||||
unsigned int proto;
|
||||
/* Peer's address */
|
||||
struct saddr addr;
|
||||
};
|
||||
|
||||
struct dst_crypto_ctl
|
||||
{
|
||||
/* Cipher and hash names */
|
||||
char cipher_algo[DST_NAMELEN];
|
||||
char hash_algo[DST_NAMELEN];
|
||||
|
||||
/* Key sizes. Can be zero for digest for example */
|
||||
unsigned int cipher_keysize, hash_keysize;
|
||||
/* Alignment. Calculated by the DST itself. */
|
||||
unsigned int crypto_attached_size;
|
||||
/* Number of threads to perform crypto operations */
|
||||
int thread_num;
|
||||
};
|
||||
|
||||
/* Export security attributes have this bits checked in when client connects */
|
||||
#define DST_PERM_READ (1<<0)
|
||||
#define DST_PERM_WRITE (1<<1)
|
||||
|
||||
/*
|
||||
* Right now it is simple model, where each remote address
|
||||
* is assigned to set of permissions it is allowed to perform.
|
||||
* In real world block device does not know anything but
|
||||
* reading and writing, so it should be more than enough.
|
||||
*/
|
||||
struct dst_secure_user
|
||||
{
|
||||
unsigned int permissions;
|
||||
struct saddr addr;
|
||||
};
|
||||
|
||||
/*
|
||||
* Export control command: device to export and network address to accept
|
||||
* clients to work with given device
|
||||
*/
|
||||
struct dst_export_ctl
|
||||
{
|
||||
char device[DST_NAMELEN];
|
||||
struct dst_network_ctl ctl;
|
||||
};
|
||||
|
||||
enum {
|
||||
DST_CFG = 1, /* Request remote configuration */
|
||||
DST_IO, /* IO command */
|
||||
DST_IO_RESPONSE, /* IO response */
|
||||
DST_PING, /* Keepalive message */
|
||||
DST_NCMD_MAX,
|
||||
};
|
||||
|
||||
struct dst_cmd
|
||||
{
|
||||
/* Network command itself, see above */
|
||||
__u32 cmd;
|
||||
/*
|
||||
* Size of the attached data
|
||||
* (in most cases, for READ command it means how many bytes were requested)
|
||||
*/
|
||||
__u32 size;
|
||||
/* Crypto size: number of attached bytes with digest/hmac */
|
||||
__u32 csize;
|
||||
/* Here we can carry secret data */
|
||||
__u32 reserved;
|
||||
/* Read/write bits, see how they are encoded in bio structure */
|
||||
__u64 rw;
|
||||
/* BIO flags */
|
||||
__u64 flags;
|
||||
/* Unique command id (like transaction ID) */
|
||||
__u64 id;
|
||||
/* Sector to start IO from */
|
||||
__u64 sector;
|
||||
/* Hash data is placed after this header */
|
||||
__u8 hash[0];
|
||||
};
|
||||
|
||||
/*
|
||||
* Convert command to/from network byte order.
|
||||
* We do not use hton*() functions, since there is
|
||||
* no 64-bit implementation.
|
||||
*/
|
||||
static inline void dst_convert_cmd(struct dst_cmd *c)
|
||||
{
|
||||
c->cmd = __cpu_to_be32(c->cmd);
|
||||
c->csize = __cpu_to_be32(c->csize);
|
||||
c->size = __cpu_to_be32(c->size);
|
||||
c->sector = __cpu_to_be64(c->sector);
|
||||
c->id = __cpu_to_be64(c->id);
|
||||
c->flags = __cpu_to_be64(c->flags);
|
||||
c->rw = __cpu_to_be64(c->rw);
|
||||
}
|
||||
|
||||
/* Transaction id */
|
||||
typedef __u64 dst_gen_t;
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/bio.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mempool.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/poll.h>
|
||||
#include <linux/rbtree.h>
|
||||
|
||||
#ifdef CONFIG_DST_DEBUG
|
||||
#define dprintk(f, a...) printk(KERN_NOTICE f, ##a)
|
||||
#else
|
||||
static inline void __attribute__ ((format (printf, 1, 2)))
|
||||
dprintk(const char *fmt, ...) {}
|
||||
#endif
|
||||
|
||||
struct dst_node;
|
||||
|
||||
struct dst_trans
|
||||
{
|
||||
/* DST node we are working with */
|
||||
struct dst_node *n;
|
||||
|
||||
/* Entry inside transaction tree */
|
||||
struct rb_node trans_entry;
|
||||
|
||||
/* Merlin kills this transaction when this memory cell equals zero */
|
||||
atomic_t refcnt;
|
||||
|
||||
/* How this transaction should be processed by crypto engine */
|
||||
short enc;
|
||||
/* How many times this transaction was resent */
|
||||
short retries;
|
||||
/* Completion status */
|
||||
int error;
|
||||
|
||||
/* When did we send it to the remote peer */
|
||||
long send_time;
|
||||
|
||||
/* My name is...
|
||||
* Well, computers does not speak, they have unique id instead */
|
||||
dst_gen_t gen;
|
||||
|
||||
/* Block IO we are working with */
|
||||
struct bio *bio;
|
||||
|
||||
/* Network command for above block IO request */
|
||||
struct dst_cmd cmd;
|
||||
};
|
||||
|
||||
struct dst_crypto_engine
|
||||
{
|
||||
/* What should we do with all block requests */
|
||||
struct crypto_hash *hash;
|
||||
struct crypto_ablkcipher *cipher;
|
||||
|
||||
/* Pool of pages used to encrypt data into before sending */
|
||||
int page_num;
|
||||
struct page **pages;
|
||||
|
||||
/* What to do with current request */
|
||||
int enc;
|
||||
/* Who we are and where do we go */
|
||||
struct scatterlist *src, *dst;
|
||||
|
||||
/* Maximum timeout waiting for encryption to be completed */
|
||||
long timeout;
|
||||
/* IV is a 64-bit sequential counter */
|
||||
u64 iv;
|
||||
|
||||
/* Secret data */
|
||||
void *private;
|
||||
|
||||
/* Cached temporary data lives here */
|
||||
int size;
|
||||
void *data;
|
||||
};
|
||||
|
||||
struct dst_state
|
||||
{
|
||||
/* The main state protection */
|
||||
struct mutex state_lock;
|
||||
|
||||
/* Polling machinery for sockets */
|
||||
wait_queue_t wait;
|
||||
wait_queue_head_t *whead;
|
||||
/* Most of events are being waited here */
|
||||
wait_queue_head_t thread_wait;
|
||||
|
||||
/* Who owns this? */
|
||||
struct dst_node *node;
|
||||
|
||||
/* Network address for this state */
|
||||
struct dst_network_ctl ctl;
|
||||
|
||||
/* Permissions to work with: read-only or rw connection */
|
||||
u32 permissions;
|
||||
|
||||
/* Called when we need to clean private data */
|
||||
void (* cleanup)(struct dst_state *st);
|
||||
|
||||
/* Used by the server: BIO completion queues BIOs here */
|
||||
struct list_head request_list;
|
||||
spinlock_t request_lock;
|
||||
|
||||
/* Guess what? No, it is not number of planets */
|
||||
atomic_t refcnt;
|
||||
|
||||
/* This flags is set when connection should be dropped */
|
||||
int need_exit;
|
||||
|
||||
/*
|
||||
* Socket to work with. Second pointer is used for
|
||||
* lockless check if socket was changed before performing
|
||||
* next action (like working with cached polling result)
|
||||
*/
|
||||
struct socket *socket, *read_socket;
|
||||
|
||||
/* Cached preallocated data */
|
||||
void *data;
|
||||
unsigned int size;
|
||||
|
||||
/* Currently processed command */
|
||||
struct dst_cmd cmd;
|
||||
};
|
||||
|
||||
struct dst_info
|
||||
{
|
||||
/* Device size */
|
||||
u64 size;
|
||||
|
||||
/* Local device name for export devices */
|
||||
char local[DST_NAMELEN];
|
||||
|
||||
/* Network setup */
|
||||
struct dst_network_ctl net;
|
||||
|
||||
/* Sysfs bits use this */
|
||||
struct device device;
|
||||
};
|
||||
|
||||
struct dst_node
|
||||
{
|
||||
struct list_head node_entry;
|
||||
|
||||
/* Hi, my name is stored here */
|
||||
char name[DST_NAMELEN];
|
||||
/* My cache name is stored here */
|
||||
char cache_name[DST_NAMELEN];
|
||||
|
||||
/* Block device attached to given node.
|
||||
* Only valid for exporting nodes */
|
||||
struct block_device *bdev;
|
||||
/* Network state machine for given peer */
|
||||
struct dst_state *state;
|
||||
|
||||
/* Block IO machinery */
|
||||
struct request_queue *queue;
|
||||
struct gendisk *disk;
|
||||
|
||||
/* Number of threads in processing pool */
|
||||
int thread_num;
|
||||
/* Maximum number of pages in single IO */
|
||||
int max_pages;
|
||||
|
||||
/* I'm that big in bytes */
|
||||
loff_t size;
|
||||
|
||||
/* Exported to userspace node information */
|
||||
struct dst_info *info;
|
||||
|
||||
/*
|
||||
* Security attribute list.
|
||||
* Used only by exporting node currently.
|
||||
*/
|
||||
struct list_head security_list;
|
||||
struct mutex security_lock;
|
||||
|
||||
/*
|
||||
* When this unerflows below zero, university collapses.
|
||||
* But this will not happen, since node will be freed,
|
||||
* when reference counter reaches zero.
|
||||
*/
|
||||
atomic_t refcnt;
|
||||
|
||||
/* How precisely should I be started? */
|
||||
int (*start)(struct dst_node *);
|
||||
|
||||
/* Crypto capabilities */
|
||||
struct dst_crypto_ctl crypto;
|
||||
u8 *hash_key;
|
||||
u8 *cipher_key;
|
||||
|
||||
/* Pool of processing thread */
|
||||
struct thread_pool *pool;
|
||||
|
||||
/* Transaction IDs live here */
|
||||
atomic_long_t gen;
|
||||
|
||||
/*
|
||||
* How frequently and how many times transaction
|
||||
* tree should be scanned to drop stale objects.
|
||||
*/
|
||||
long trans_scan_timeout;
|
||||
int trans_max_retries;
|
||||
|
||||
/* Small gnomes live here */
|
||||
struct rb_root trans_root;
|
||||
struct mutex trans_lock;
|
||||
|
||||
/*
|
||||
* Transaction cache/memory pool.
|
||||
* It is big enough to contain not only transaction
|
||||
* itself, but additional crypto data (digest/hmac).
|
||||
*/
|
||||
struct kmem_cache *trans_cache;
|
||||
mempool_t *trans_pool;
|
||||
|
||||
/* This entity scans transaction tree */
|
||||
struct delayed_work trans_work;
|
||||
|
||||
wait_queue_head_t wait;
|
||||
};
|
||||
|
||||
/* Kernel representation of the security attribute */
|
||||
struct dst_secure
|
||||
{
|
||||
struct list_head sec_entry;
|
||||
struct dst_secure_user sec;
|
||||
};
|
||||
|
||||
int dst_process_bio(struct dst_node *n, struct bio *bio);
|
||||
|
||||
int dst_node_init_connected(struct dst_node *n, struct dst_network_ctl *r);
|
||||
int dst_node_init_listened(struct dst_node *n, struct dst_export_ctl *le);
|
||||
|
||||
static inline struct dst_state *dst_state_get(struct dst_state *st)
|
||||
{
|
||||
BUG_ON(atomic_read(&st->refcnt) == 0);
|
||||
atomic_inc(&st->refcnt);
|
||||
return st;
|
||||
}
|
||||
|
||||
void dst_state_put(struct dst_state *st);
|
||||
|
||||
struct dst_state *dst_state_alloc(struct dst_node *n);
|
||||
int dst_state_socket_create(struct dst_state *st);
|
||||
void dst_state_socket_release(struct dst_state *st);
|
||||
|
||||
void dst_state_exit_connected(struct dst_state *st);
|
||||
|
||||
int dst_state_schedule_receiver(struct dst_state *st);
|
||||
|
||||
void dst_dump_addr(struct socket *sk, struct sockaddr *sa, char *str);
|
||||
|
||||
static inline void dst_state_lock(struct dst_state *st)
|
||||
{
|
||||
mutex_lock(&st->state_lock);
|
||||
}
|
||||
|
||||
static inline void dst_state_unlock(struct dst_state *st)
|
||||
{
|
||||
mutex_unlock(&st->state_lock);
|
||||
}
|
||||
|
||||
void dst_poll_exit(struct dst_state *st);
|
||||
int dst_poll_init(struct dst_state *st);
|
||||
|
||||
static inline unsigned int dst_state_poll(struct dst_state *st)
|
||||
{
|
||||
unsigned int revents = POLLHUP | POLLERR;
|
||||
|
||||
dst_state_lock(st);
|
||||
if (st->socket)
|
||||
revents = st->socket->ops->poll(NULL, st->socket, NULL);
|
||||
dst_state_unlock(st);
|
||||
|
||||
return revents;
|
||||
}
|
||||
|
||||
static inline int dst_thread_setup(void *private, void *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
void dst_node_put(struct dst_node *n);
|
||||
|
||||
static inline struct dst_node *dst_node_get(struct dst_node *n)
|
||||
{
|
||||
atomic_inc(&n->refcnt);
|
||||
return n;
|
||||
}
|
||||
|
||||
int dst_data_recv(struct dst_state *st, void *data, unsigned int size);
|
||||
int dst_recv_cdata(struct dst_state *st, void *cdata);
|
||||
int dst_data_send_header(struct socket *sock,
|
||||
void *data, unsigned int size, int more);
|
||||
|
||||
int dst_send_bio(struct dst_state *st, struct dst_cmd *cmd, struct bio *bio);
|
||||
|
||||
int dst_process_io(struct dst_state *st);
|
||||
int dst_export_crypto(struct dst_node *n, struct bio *bio);
|
||||
int dst_export_send_bio(struct bio *bio);
|
||||
int dst_start_export(struct dst_node *n);
|
||||
|
||||
int __init dst_export_init(void);
|
||||
void dst_export_exit(void);
|
||||
|
||||
/* Private structure for export block IO requests */
|
||||
struct dst_export_priv
|
||||
{
|
||||
struct list_head request_entry;
|
||||
struct dst_state *state;
|
||||
struct bio *bio;
|
||||
struct dst_cmd cmd;
|
||||
};
|
||||
|
||||
static inline void dst_trans_get(struct dst_trans *t)
|
||||
{
|
||||
atomic_inc(&t->refcnt);
|
||||
}
|
||||
|
||||
struct dst_trans *dst_trans_search(struct dst_node *node, dst_gen_t gen);
|
||||
int dst_trans_remove(struct dst_trans *t);
|
||||
int dst_trans_remove_nolock(struct dst_trans *t);
|
||||
void dst_trans_put(struct dst_trans *t);
|
||||
|
||||
/*
|
||||
* Convert bio into network command.
|
||||
*/
|
||||
static inline void dst_bio_to_cmd(struct bio *bio, struct dst_cmd *cmd,
|
||||
u32 command, u64 id)
|
||||
{
|
||||
cmd->cmd = command;
|
||||
cmd->flags = (bio->bi_flags << BIO_POOL_BITS) >> BIO_POOL_BITS;
|
||||
cmd->rw = bio->bi_rw;
|
||||
cmd->size = bio->bi_size;
|
||||
cmd->csize = 0;
|
||||
cmd->id = id;
|
||||
cmd->sector = bio->bi_sector;
|
||||
};
|
||||
|
||||
int dst_trans_send(struct dst_trans *t);
|
||||
int dst_trans_crypto(struct dst_trans *t);
|
||||
|
||||
int dst_node_crypto_init(struct dst_node *n, struct dst_crypto_ctl *ctl);
|
||||
void dst_node_crypto_exit(struct dst_node *n);
|
||||
|
||||
static inline int dst_need_crypto(struct dst_node *n)
|
||||
{
|
||||
struct dst_crypto_ctl *c = &n->crypto;
|
||||
/*
|
||||
* Logical OR is appropriate here, but boolean one produces
|
||||
* more optimal code, so it is used instead.
|
||||
*/
|
||||
return (c->hash_algo[0] | c->cipher_algo[0]);
|
||||
}
|
||||
|
||||
int dst_node_trans_init(struct dst_node *n, unsigned int size);
|
||||
void dst_node_trans_exit(struct dst_node *n);
|
||||
|
||||
/*
|
||||
* Pool of threads.
|
||||
* Ready list contains threads currently free to be used,
|
||||
* active one contains threads with some work scheduled for them.
|
||||
* Caller can wait in given queue when thread is ready.
|
||||
*/
|
||||
struct thread_pool
|
||||
{
|
||||
int thread_num;
|
||||
struct mutex thread_lock;
|
||||
struct list_head ready_list, active_list;
|
||||
|
||||
wait_queue_head_t wait;
|
||||
};
|
||||
|
||||
void thread_pool_del_worker(struct thread_pool *p);
|
||||
void thread_pool_del_worker_id(struct thread_pool *p, unsigned int id);
|
||||
int thread_pool_add_worker(struct thread_pool *p,
|
||||
char *name,
|
||||
unsigned int id,
|
||||
void *(* init)(void *data),
|
||||
void (* cleanup)(void *data),
|
||||
void *data);
|
||||
|
||||
void thread_pool_destroy(struct thread_pool *p);
|
||||
struct thread_pool *thread_pool_create(int num, char *name,
|
||||
void *(* init)(void *data),
|
||||
void (* cleanup)(void *data),
|
||||
void *data);
|
||||
|
||||
int thread_pool_schedule(struct thread_pool *p,
|
||||
int (* setup)(void *stored_private, void *setup_data),
|
||||
int (* action)(void *stored_private, void *setup_data),
|
||||
void *setup_data, long timeout);
|
||||
int thread_pool_schedule_private(struct thread_pool *p,
|
||||
int (* setup)(void *private, void *data),
|
||||
int (* action)(void *private, void *data),
|
||||
void *data, long timeout, void *id);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __DST_H */
|
@@ -70,7 +70,7 @@ extern int ddebug_remove_module(char *mod_name);
|
||||
DEBUG_HASH2, __LINE__, _DPRINTK_FLAGS_DEFAULT }; \
|
||||
if (__dynamic_dbg_enabled(descriptor)) \
|
||||
dev_printk(KERN_DEBUG, dev, \
|
||||
KBUILD_MODNAME ": " pr_fmt(fmt),\
|
||||
KBUILD_MODNAME ": " fmt, \
|
||||
##__VA_ARGS__); \
|
||||
} while (0)
|
||||
|
||||
|
@@ -116,6 +116,7 @@ extern void elv_abort_queue(struct request_queue *);
|
||||
extern void elv_completed_request(struct request_queue *, struct request *);
|
||||
extern int elv_set_request(struct request_queue *, struct request *, gfp_t);
|
||||
extern void elv_put_request(struct request_queue *, struct request *);
|
||||
extern void elv_drain_elevator(struct request_queue *);
|
||||
|
||||
/*
|
||||
* io scheduler registration
|
||||
|
@@ -173,8 +173,12 @@ struct fb_fix_screeninfo {
|
||||
/* Interpretation of offset for color fields: All offsets are from the right,
|
||||
* inside a "pixel" value, which is exactly 'bits_per_pixel' wide (means: you
|
||||
* can use the offset as right argument to <<). A pixel afterwards is a bit
|
||||
* stream and is written to video memory as that unmodified. This implies
|
||||
* big-endian byte order if bits_per_pixel is greater than 8.
|
||||
* stream and is written to video memory as that unmodified.
|
||||
*
|
||||
* For pseudocolor: offset and length should be the same for all color
|
||||
* components. Offset specifies the position of the least significant bit
|
||||
* of the pallette index in a pixel value. Length indicates the number
|
||||
* of available palette entries (i.e. # of entries = 1 << length).
|
||||
*/
|
||||
struct fb_bitfield {
|
||||
__u32 offset; /* beginning of bitfield */
|
||||
|
@@ -5,12 +5,14 @@
|
||||
#ifndef __LINUX_FDTABLE_H
|
||||
#define __LINUX_FDTABLE_H
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <linux/posix_types.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
|
||||
/*
|
||||
* The default fd array needs to be at least BITS_PER_LONG,
|
||||
|
@@ -11,6 +11,8 @@
|
||||
#ifndef _LINUX_FIEMAP_H
|
||||
#define _LINUX_FIEMAP_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct fiemap_extent {
|
||||
__u64 fe_logical; /* logical offset in bytes for the start of
|
||||
* the extent from the beginning of the file */
|
||||
|
@@ -87,6 +87,60 @@ struct inodes_stat_t {
|
||||
*/
|
||||
#define FMODE_NOCMTIME ((__force fmode_t)2048)
|
||||
|
||||
/*
|
||||
* The below are the various read and write types that we support. Some of
|
||||
* them include behavioral modifiers that send information down to the
|
||||
* block layer and IO scheduler. Terminology:
|
||||
*
|
||||
* The block layer uses device plugging to defer IO a little bit, in
|
||||
* the hope that we will see more IO very shortly. This increases
|
||||
* coalescing of adjacent IO and thus reduces the number of IOs we
|
||||
* have to send to the device. It also allows for better queuing,
|
||||
* if the IO isn't mergeable. If the caller is going to be waiting
|
||||
* for the IO, then he must ensure that the device is unplugged so
|
||||
* that the IO is dispatched to the driver.
|
||||
*
|
||||
* All IO is handled async in Linux. This is fine for background
|
||||
* writes, but for reads or writes that someone waits for completion
|
||||
* on, we want to notify the block layer and IO scheduler so that they
|
||||
* know about it. That allows them to make better scheduling
|
||||
* decisions. So when the below references 'sync' and 'async', it
|
||||
* is referencing this priority hint.
|
||||
*
|
||||
* With that in mind, the available types are:
|
||||
*
|
||||
* READ A normal read operation. Device will be plugged.
|
||||
* READ_SYNC A synchronous read. Device is not plugged, caller can
|
||||
* immediately wait on this read without caring about
|
||||
* unplugging.
|
||||
* READA Used for read-ahead operations. Lower priority, and the
|
||||
* block layer could (in theory) choose to ignore this
|
||||
* request if it runs into resource problems.
|
||||
* WRITE A normal async write. Device will be plugged.
|
||||
* SWRITE Like WRITE, but a special case for ll_rw_block() that
|
||||
* tells it to lock the buffer first. Normally a buffer
|
||||
* must be locked before doing IO.
|
||||
* WRITE_SYNC_PLUG Synchronous write. Identical to WRITE, but passes down
|
||||
* the hint that someone will be waiting on this IO
|
||||
* shortly. The device must still be unplugged explicitly,
|
||||
* WRITE_SYNC_PLUG does not do this as we could be
|
||||
* submitting more writes before we actually wait on any
|
||||
* of them.
|
||||
* WRITE_SYNC Like WRITE_SYNC_PLUG, but also unplugs the device
|
||||
* immediately after submission. The write equivalent
|
||||
* of READ_SYNC.
|
||||
* WRITE_ODIRECT Special case write for O_DIRECT only.
|
||||
* SWRITE_SYNC
|
||||
* SWRITE_SYNC_PLUG Like WRITE_SYNC/WRITE_SYNC_PLUG, but locks the buffer.
|
||||
* See SWRITE.
|
||||
* WRITE_BARRIER Like WRITE, but tells the block layer that all
|
||||
* previously submitted writes must be safely on storage
|
||||
* before this one is started. Also guarantees that when
|
||||
* this write is complete, it itself is also safely on
|
||||
* storage. Prevents reordering of writes on both sides
|
||||
* of this IO.
|
||||
*
|
||||
*/
|
||||
#define RW_MASK 1
|
||||
#define RWA_MASK 2
|
||||
#define READ 0
|
||||
@@ -95,9 +149,18 @@ struct inodes_stat_t {
|
||||
#define SWRITE 3 /* for ll_rw_block() - wait for buffer lock */
|
||||
#define READ_SYNC (READ | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
|
||||
#define READ_META (READ | (1 << BIO_RW_META))
|
||||
#define WRITE_SYNC (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
|
||||
#define SWRITE_SYNC (SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
|
||||
#define WRITE_SYNC_PLUG (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE))
|
||||
#define WRITE_SYNC (WRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG))
|
||||
#define WRITE_ODIRECT (WRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_UNPLUG))
|
||||
#define SWRITE_SYNC_PLUG \
|
||||
(SWRITE | (1 << BIO_RW_SYNCIO) | (1 << BIO_RW_NOIDLE))
|
||||
#define SWRITE_SYNC (SWRITE_SYNC_PLUG | (1 << BIO_RW_UNPLUG))
|
||||
#define WRITE_BARRIER (WRITE | (1 << BIO_RW_BARRIER))
|
||||
|
||||
/*
|
||||
* These aren't really reads or writes, they pass down information about
|
||||
* parts of device that are now unused by the file system.
|
||||
*/
|
||||
#define DISCARD_NOBARRIER (1 << BIO_RW_DISCARD)
|
||||
#define DISCARD_BARRIER ((1 << BIO_RW_DISCARD) | (1 << BIO_RW_BARRIER))
|
||||
|
||||
@@ -734,9 +797,6 @@ enum inode_i_mutex_lock_class
|
||||
I_MUTEX_QUOTA
|
||||
};
|
||||
|
||||
extern void inode_double_lock(struct inode *inode1, struct inode *inode2);
|
||||
extern void inode_double_unlock(struct inode *inode1, struct inode *inode2);
|
||||
|
||||
/*
|
||||
* NOTE: in a 32bit arch with a preemptable kernel and
|
||||
* an UP compile the i_size_read/write must be atomic
|
||||
@@ -1695,6 +1755,9 @@ struct file_system_type {
|
||||
struct lock_class_key i_alloc_sem_key;
|
||||
};
|
||||
|
||||
extern int get_sb_ns(struct file_system_type *fs_type, int flags, void *data,
|
||||
int (*fill_super)(struct super_block *, void *, int),
|
||||
struct vfsmount *mnt);
|
||||
extern int get_sb_bdev(struct file_system_type *fs_type,
|
||||
int flags, const char *dev_name, void *data,
|
||||
int (*fill_super)(struct super_block *, void *, int),
|
||||
@@ -1712,6 +1775,7 @@ void kill_block_super(struct super_block *sb);
|
||||
void kill_anon_super(struct super_block *sb);
|
||||
void kill_litter_super(struct super_block *sb);
|
||||
void deactivate_super(struct super_block *sb);
|
||||
void deactivate_locked_super(struct super_block *sb);
|
||||
int set_anon_super(struct super_block *s, void *data);
|
||||
struct super_block *sget(struct file_system_type *type,
|
||||
int (*test)(struct super_block *,void *),
|
||||
@@ -2054,7 +2118,7 @@ extern struct file *create_write_pipe(int flags);
|
||||
extern void free_write_pipe(struct file *);
|
||||
|
||||
extern struct file *do_filp_open(int dfd, const char *pathname,
|
||||
int open_flag, int mode);
|
||||
int open_flag, int mode, int acc_mode);
|
||||
extern int may_open(struct path *, int, int);
|
||||
|
||||
extern int kernel_read(struct file *, unsigned long, char *, unsigned long);
|
||||
@@ -2143,8 +2207,6 @@ extern ssize_t generic_file_splice_read(struct file *, loff_t *,
|
||||
struct pipe_inode_info *, size_t, unsigned int);
|
||||
extern ssize_t generic_file_splice_write(struct pipe_inode_info *,
|
||||
struct file *, loff_t *, size_t, unsigned int);
|
||||
extern ssize_t generic_file_splice_write_nolock(struct pipe_inode_info *,
|
||||
struct file *, loff_t *, size_t, unsigned int);
|
||||
extern ssize_t generic_splice_sendpage(struct pipe_inode_info *pipe,
|
||||
struct file *out, loff_t *, size_t len, unsigned int flags);
|
||||
extern long do_splice_direct(struct file *in, loff_t *ppos, struct file *out,
|
||||
@@ -2238,9 +2300,8 @@ extern int vfs_readdir(struct file *, filldir_t, void *);
|
||||
|
||||
extern int vfs_stat(char __user *, struct kstat *);
|
||||
extern int vfs_lstat(char __user *, struct kstat *);
|
||||
extern int vfs_stat_fd(int dfd, char __user *, struct kstat *);
|
||||
extern int vfs_lstat_fd(int dfd, char __user *, struct kstat *);
|
||||
extern int vfs_fstat(unsigned int, struct kstat *);
|
||||
extern int vfs_fstatat(int , char __user *, struct kstat *, int);
|
||||
|
||||
extern int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
|
||||
unsigned long arg);
|
||||
@@ -2307,6 +2368,7 @@ extern void file_update_time(struct file *file);
|
||||
|
||||
extern int generic_show_options(struct seq_file *m, struct vfsmount *mnt);
|
||||
extern void save_mount_options(struct super_block *sb, char *options);
|
||||
extern void replace_mount_options(struct super_block *sb, char *options);
|
||||
|
||||
static inline ino_t parent_ino(struct dentry *dentry)
|
||||
{
|
||||
@@ -2337,19 +2399,7 @@ ssize_t simple_transaction_read(struct file *file, char __user *buf,
|
||||
size_t size, loff_t *pos);
|
||||
int simple_transaction_release(struct inode *inode, struct file *file);
|
||||
|
||||
static inline void simple_transaction_set(struct file *file, size_t n)
|
||||
{
|
||||
struct simple_transaction_argresp *ar = file->private_data;
|
||||
|
||||
BUG_ON(n > SIMPLE_TRANSACTION_LIMIT);
|
||||
|
||||
/*
|
||||
* The barrier ensures that ar->size will really remain zero until
|
||||
* ar->data is ready for reading.
|
||||
*/
|
||||
smp_mb();
|
||||
ar->size = n;
|
||||
}
|
||||
void simple_transaction_set(struct file *file, size_t n);
|
||||
|
||||
/*
|
||||
* simple attribute files
|
||||
@@ -2396,32 +2446,11 @@ ssize_t simple_attr_read(struct file *file, char __user *buf,
|
||||
ssize_t simple_attr_write(struct file *file, const char __user *buf,
|
||||
size_t len, loff_t *ppos);
|
||||
|
||||
|
||||
#ifdef CONFIG_SECURITY
|
||||
static inline char *alloc_secdata(void)
|
||||
{
|
||||
return (char *)get_zeroed_page(GFP_KERNEL);
|
||||
}
|
||||
|
||||
static inline void free_secdata(void *secdata)
|
||||
{
|
||||
free_page((unsigned long)secdata);
|
||||
}
|
||||
#else
|
||||
static inline char *alloc_secdata(void)
|
||||
{
|
||||
return (char *)1;
|
||||
}
|
||||
|
||||
static inline void free_secdata(void *secdata)
|
||||
{ }
|
||||
#endif /* CONFIG_SECURITY */
|
||||
|
||||
struct ctl_table;
|
||||
int proc_nr_files(struct ctl_table *table, int write, struct file *filp,
|
||||
void __user *buffer, size_t *lenp, loff_t *ppos);
|
||||
|
||||
int get_filesystem_list(char * buf);
|
||||
int __init get_filesystem_list(char *buf);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _LINUX_FS_H */
|
||||
|
@@ -18,7 +18,6 @@
|
||||
#define _FSL_DEVICE_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/phy.h>
|
||||
|
||||
/*
|
||||
* Some conventions on how we handle peripherals on Freescale chips
|
||||
@@ -44,31 +43,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
struct gianfar_platform_data {
|
||||
/* device specific information */
|
||||
u32 device_flags;
|
||||
char bus_id[BUS_ID_SIZE];
|
||||
phy_interface_t interface;
|
||||
};
|
||||
|
||||
struct gianfar_mdio_data {
|
||||
/* board specific information */
|
||||
int irq[32];
|
||||
};
|
||||
|
||||
/* Flags in gianfar_platform_data */
|
||||
#define FSL_GIANFAR_BRD_HAS_PHY_INTR 0x00000001 /* set or use a timer */
|
||||
#define FSL_GIANFAR_BRD_IS_REDUCED 0x00000002 /* Set if RGMII, RMII */
|
||||
|
||||
struct fsl_i2c_platform_data {
|
||||
/* device specific information */
|
||||
u32 device_flags;
|
||||
};
|
||||
|
||||
/* Flags related to I2C device features */
|
||||
#define FSL_I2C_DEV_SEPARATE_DFSRR 0x00000001
|
||||
#define FSL_I2C_DEV_CLOCK_5200 0x00000002
|
||||
|
||||
enum fsl_usb2_operating_modes {
|
||||
FSL_USB2_MPH_HOST,
|
||||
FSL_USB2_DR_HOST,
|
||||
@@ -105,6 +79,10 @@ struct fsl_spi_platform_data {
|
||||
u16 max_chipselect;
|
||||
void (*cs_control)(struct spi_device *spi, bool on);
|
||||
u32 sysclk;
|
||||
|
||||
/* Legacy hooks, used by mpc52xx_psc_spi driver. */
|
||||
void (*activate_cs)(u8 cs, u8 polarity);
|
||||
void (*deactivate_cs)(u8 cs, u8 polarity);
|
||||
};
|
||||
|
||||
struct mpc8xx_pcmcia_ops {
|
||||
|
@@ -1,15 +1,18 @@
|
||||
#ifndef _LINUX_FTRACE_H
|
||||
#define _LINUX_FTRACE_H
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/trace_clock.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/ktime.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/fs.h>
|
||||
|
||||
#include <asm/ftrace.h>
|
||||
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
|
||||
@@ -95,9 +98,41 @@ stack_trace_sysctl(struct ctl_table *table, int write,
|
||||
loff_t *ppos);
|
||||
#endif
|
||||
|
||||
struct ftrace_func_command {
|
||||
struct list_head list;
|
||||
char *name;
|
||||
int (*func)(char *func, char *cmd,
|
||||
char *params, int enable);
|
||||
};
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
/* asm/ftrace.h must be defined for archs supporting dynamic ftrace */
|
||||
#include <asm/ftrace.h>
|
||||
|
||||
int ftrace_arch_code_modify_prepare(void);
|
||||
int ftrace_arch_code_modify_post_process(void);
|
||||
|
||||
struct seq_file;
|
||||
|
||||
struct ftrace_probe_ops {
|
||||
void (*func)(unsigned long ip,
|
||||
unsigned long parent_ip,
|
||||
void **data);
|
||||
int (*callback)(unsigned long ip, void **data);
|
||||
void (*free)(void **data);
|
||||
int (*print)(struct seq_file *m,
|
||||
unsigned long ip,
|
||||
struct ftrace_probe_ops *ops,
|
||||
void *data);
|
||||
};
|
||||
|
||||
extern int
|
||||
register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
|
||||
void *data);
|
||||
extern void
|
||||
unregister_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
|
||||
void *data);
|
||||
extern void
|
||||
unregister_ftrace_function_probe_func(char *glob, struct ftrace_probe_ops *ops);
|
||||
extern void unregister_ftrace_function_probe_all(char *glob);
|
||||
|
||||
enum {
|
||||
FTRACE_FL_FREE = (1 << 0),
|
||||
@@ -110,15 +145,23 @@ enum {
|
||||
};
|
||||
|
||||
struct dyn_ftrace {
|
||||
struct list_head list;
|
||||
unsigned long ip; /* address of mcount call-site */
|
||||
unsigned long flags;
|
||||
struct dyn_arch_ftrace arch;
|
||||
union {
|
||||
unsigned long ip; /* address of mcount call-site */
|
||||
struct dyn_ftrace *freelist;
|
||||
};
|
||||
union {
|
||||
unsigned long flags;
|
||||
struct dyn_ftrace *newlist;
|
||||
};
|
||||
struct dyn_arch_ftrace arch;
|
||||
};
|
||||
|
||||
int ftrace_force_update(void);
|
||||
void ftrace_set_filter(unsigned char *buf, int len, int reset);
|
||||
|
||||
int register_ftrace_command(struct ftrace_func_command *cmd);
|
||||
int unregister_ftrace_command(struct ftrace_func_command *cmd);
|
||||
|
||||
/* defined in arch */
|
||||
extern int ftrace_ip_converted(unsigned long ip);
|
||||
extern int ftrace_dyn_arch_init(void *data);
|
||||
@@ -126,6 +169,10 @@ extern int ftrace_update_ftrace_func(ftrace_func_t func);
|
||||
extern void ftrace_caller(void);
|
||||
extern void ftrace_call(void);
|
||||
extern void mcount_call(void);
|
||||
|
||||
#ifndef FTRACE_ADDR
|
||||
#define FTRACE_ADDR ((unsigned long)ftrace_caller)
|
||||
#endif
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
extern void ftrace_graph_caller(void);
|
||||
extern int ftrace_enable_ftrace_graph_caller(void);
|
||||
@@ -136,7 +183,7 @@ static inline int ftrace_disable_ftrace_graph_caller(void) { return 0; }
|
||||
#endif
|
||||
|
||||
/**
|
||||
* ftrace_make_nop - convert code into top
|
||||
* ftrace_make_nop - convert code into nop
|
||||
* @mod: module structure if called by module load initialization
|
||||
* @rec: the mcount call site record
|
||||
* @addr: the address that the call site should be calling
|
||||
@@ -181,7 +228,6 @@ extern int ftrace_make_nop(struct module *mod,
|
||||
*/
|
||||
extern int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr);
|
||||
|
||||
|
||||
/* May be defined in arch */
|
||||
extern int ftrace_arch_read_dyn_info(char *buf, int size);
|
||||
|
||||
@@ -198,6 +244,14 @@ extern void ftrace_enable_daemon(void);
|
||||
# define ftrace_disable_daemon() do { } while (0)
|
||||
# define ftrace_enable_daemon() do { } while (0)
|
||||
static inline void ftrace_release(void *start, unsigned long size) { }
|
||||
static inline int register_ftrace_command(struct ftrace_func_command *cmd)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline int unregister_ftrace_command(char *cmd_name)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||
|
||||
/* totally disable ftrace - can not re-enable after this */
|
||||
@@ -233,24 +287,25 @@ static inline void __ftrace_enabled_restore(int enabled)
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
/* TODO: need to fix this for ARM */
|
||||
# define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
|
||||
# define CALLER_ADDR1 ((unsigned long)__builtin_return_address(1))
|
||||
# define CALLER_ADDR2 ((unsigned long)__builtin_return_address(2))
|
||||
# define CALLER_ADDR3 ((unsigned long)__builtin_return_address(3))
|
||||
# define CALLER_ADDR4 ((unsigned long)__builtin_return_address(4))
|
||||
# define CALLER_ADDR5 ((unsigned long)__builtin_return_address(5))
|
||||
# define CALLER_ADDR6 ((unsigned long)__builtin_return_address(6))
|
||||
#else
|
||||
# define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
|
||||
# define CALLER_ADDR1 0UL
|
||||
# define CALLER_ADDR2 0UL
|
||||
# define CALLER_ADDR3 0UL
|
||||
# define CALLER_ADDR4 0UL
|
||||
# define CALLER_ADDR5 0UL
|
||||
# define CALLER_ADDR6 0UL
|
||||
#endif
|
||||
#ifndef HAVE_ARCH_CALLER_ADDR
|
||||
# ifdef CONFIG_FRAME_POINTER
|
||||
# define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
|
||||
# define CALLER_ADDR1 ((unsigned long)__builtin_return_address(1))
|
||||
# define CALLER_ADDR2 ((unsigned long)__builtin_return_address(2))
|
||||
# define CALLER_ADDR3 ((unsigned long)__builtin_return_address(3))
|
||||
# define CALLER_ADDR4 ((unsigned long)__builtin_return_address(4))
|
||||
# define CALLER_ADDR5 ((unsigned long)__builtin_return_address(5))
|
||||
# define CALLER_ADDR6 ((unsigned long)__builtin_return_address(6))
|
||||
# else
|
||||
# define CALLER_ADDR0 ((unsigned long)__builtin_return_address(0))
|
||||
# define CALLER_ADDR1 0UL
|
||||
# define CALLER_ADDR2 0UL
|
||||
# define CALLER_ADDR3 0UL
|
||||
# define CALLER_ADDR4 0UL
|
||||
# define CALLER_ADDR5 0UL
|
||||
# define CALLER_ADDR6 0UL
|
||||
# endif
|
||||
#endif /* ifndef HAVE_ARCH_CALLER_ADDR */
|
||||
|
||||
#ifdef CONFIG_IRQSOFF_TRACER
|
||||
extern void time_hardirqs_on(unsigned long a0, unsigned long a1);
|
||||
@@ -268,54 +323,6 @@ static inline void __ftrace_enabled_restore(int enabled)
|
||||
# define trace_preempt_off(a0, a1) do { } while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TRACING
|
||||
extern int ftrace_dump_on_oops;
|
||||
|
||||
extern void tracing_start(void);
|
||||
extern void tracing_stop(void);
|
||||
extern void ftrace_off_permanent(void);
|
||||
|
||||
extern void
|
||||
ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3);
|
||||
|
||||
/**
|
||||
* ftrace_printk - printf formatting in the ftrace buffer
|
||||
* @fmt: the printf format for printing
|
||||
*
|
||||
* Note: __ftrace_printk is an internal function for ftrace_printk and
|
||||
* the @ip is passed in via the ftrace_printk macro.
|
||||
*
|
||||
* This function allows a kernel developer to debug fast path sections
|
||||
* that printk is not appropriate for. By scattering in various
|
||||
* printk like tracing in the code, a developer can quickly see
|
||||
* where problems are occurring.
|
||||
*
|
||||
* This is intended as a debugging tool for the developer only.
|
||||
* Please refrain from leaving ftrace_printks scattered around in
|
||||
* your code.
|
||||
*/
|
||||
# define ftrace_printk(fmt...) __ftrace_printk(_THIS_IP_, fmt)
|
||||
extern int
|
||||
__ftrace_printk(unsigned long ip, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
extern void ftrace_dump(void);
|
||||
#else
|
||||
static inline void
|
||||
ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { }
|
||||
static inline int
|
||||
ftrace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
|
||||
static inline void tracing_start(void) { }
|
||||
static inline void tracing_stop(void) { }
|
||||
static inline void ftrace_off_permanent(void) { }
|
||||
static inline int
|
||||
ftrace_printk(const char *fmt, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void ftrace_dump(void) { }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
|
||||
extern void ftrace_init(void);
|
||||
extern void ftrace_init_module(struct module *mod,
|
||||
@@ -327,36 +334,6 @@ ftrace_init_module(struct module *mod,
|
||||
unsigned long *start, unsigned long *end) { }
|
||||
#endif
|
||||
|
||||
enum {
|
||||
POWER_NONE = 0,
|
||||
POWER_CSTATE = 1,
|
||||
POWER_PSTATE = 2,
|
||||
};
|
||||
|
||||
struct power_trace {
|
||||
#ifdef CONFIG_POWER_TRACER
|
||||
ktime_t stamp;
|
||||
ktime_t end;
|
||||
int type;
|
||||
int state;
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_POWER_TRACER
|
||||
extern void trace_power_start(struct power_trace *it, unsigned int type,
|
||||
unsigned int state);
|
||||
extern void trace_power_mark(struct power_trace *it, unsigned int type,
|
||||
unsigned int state);
|
||||
extern void trace_power_end(struct power_trace *it);
|
||||
#else
|
||||
static inline void trace_power_start(struct power_trace *it, unsigned int type,
|
||||
unsigned int state) { }
|
||||
static inline void trace_power_mark(struct power_trace *it, unsigned int type,
|
||||
unsigned int state) { }
|
||||
static inline void trace_power_end(struct power_trace *it) { }
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Structure that defines an entry function trace.
|
||||
*/
|
||||
@@ -379,6 +356,9 @@ struct ftrace_graph_ret {
|
||||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
|
||||
/* for init task */
|
||||
#define INIT_FTRACE_GRAPH .ret_stack = NULL,
|
||||
|
||||
/*
|
||||
* Stack of return addresses for functions
|
||||
* of a thread.
|
||||
@@ -398,8 +378,7 @@ struct ftrace_ret_stack {
|
||||
extern void return_to_handler(void);
|
||||
|
||||
extern int
|
||||
ftrace_push_return_trace(unsigned long ret, unsigned long long time,
|
||||
unsigned long func, int *depth);
|
||||
ftrace_push_return_trace(unsigned long ret, unsigned long func, int *depth);
|
||||
extern void
|
||||
ftrace_pop_return_trace(struct ftrace_graph_ret *trace, unsigned long *ret);
|
||||
|
||||
@@ -454,10 +433,11 @@ static inline void unpause_graph_tracing(void)
|
||||
{
|
||||
atomic_dec(¤t->tracing_graph_pause);
|
||||
}
|
||||
#else
|
||||
#else /* !CONFIG_FUNCTION_GRAPH_TRACER */
|
||||
|
||||
#define __notrace_funcgraph
|
||||
#define __irq_entry
|
||||
#define INIT_FTRACE_GRAPH
|
||||
|
||||
static inline void ftrace_graph_init_task(struct task_struct *t) { }
|
||||
static inline void ftrace_graph_exit_task(struct task_struct *t) { }
|
||||
@@ -469,7 +449,7 @@ static inline int task_curr_ret_stack(struct task_struct *tsk)
|
||||
|
||||
static inline void pause_graph_tracing(void) { }
|
||||
static inline void unpause_graph_tracing(void) { }
|
||||
#endif
|
||||
#endif /* CONFIG_FUNCTION_GRAPH_TRACER */
|
||||
|
||||
#ifdef CONFIG_TRACING
|
||||
#include <linux/sched.h>
|
||||
@@ -514,6 +494,21 @@ static inline int test_tsk_trace_graph(struct task_struct *tsk)
|
||||
return tsk->trace & TSK_TRACE_FL_GRAPH;
|
||||
}
|
||||
|
||||
extern int ftrace_dump_on_oops;
|
||||
|
||||
#endif /* CONFIG_TRACING */
|
||||
|
||||
|
||||
#ifdef CONFIG_HW_BRANCH_TRACER
|
||||
|
||||
void trace_hw_branch(u64 from, u64 to);
|
||||
void trace_hw_branch_oops(void);
|
||||
|
||||
#else /* CONFIG_HW_BRANCH_TRACER */
|
||||
|
||||
static inline void trace_hw_branch(u64 from, u64 to) {}
|
||||
static inline void trace_hw_branch_oops(void) {}
|
||||
|
||||
#endif /* CONFIG_HW_BRANCH_TRACER */
|
||||
|
||||
#endif /* _LINUX_FTRACE_H */
|
||||
|
@@ -2,7 +2,7 @@
|
||||
#define _LINUX_FTRACE_IRQ_H
|
||||
|
||||
|
||||
#if defined(CONFIG_DYNAMIC_FTRACE) || defined(CONFIG_FUNCTION_GRAPH_TRACER)
|
||||
#ifdef CONFIG_FTRACE_NMI_ENTER
|
||||
extern void ftrace_nmi_enter(void);
|
||||
extern void ftrace_nmi_exit(void);
|
||||
#else
|
||||
|
@@ -214,6 +214,7 @@ static inline void disk_put_part(struct hd_struct *part)
|
||||
#define DISK_PITER_REVERSE (1 << 0) /* iterate in the reverse direction */
|
||||
#define DISK_PITER_INCL_EMPTY (1 << 1) /* include 0-sized parts */
|
||||
#define DISK_PITER_INCL_PART0 (1 << 2) /* include partition 0 */
|
||||
#define DISK_PITER_INCL_EMPTY_PART0 (1 << 3) /* include empty partition 0 */
|
||||
|
||||
struct disk_part_iter {
|
||||
struct gendisk *disk;
|
||||
|
@@ -4,6 +4,7 @@
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/stddef.h>
|
||||
#include <linux/linkage.h>
|
||||
#include <linux/topology.h>
|
||||
|
||||
struct vm_area_struct;
|
||||
|
||||
|
@@ -15,55 +15,61 @@
|
||||
* - bits 0-7 are the preemption count (max preemption depth: 256)
|
||||
* - bits 8-15 are the softirq count (max # of softirqs: 256)
|
||||
*
|
||||
* The hardirq count can be overridden per architecture, the default is:
|
||||
* The hardirq count can in theory reach the same as NR_IRQS.
|
||||
* In reality, the number of nested IRQS is limited to the stack
|
||||
* size as well. For archs with over 1000 IRQS it is not practical
|
||||
* to expect that they will all nest. We give a max of 10 bits for
|
||||
* hardirq nesting. An arch may choose to give less than 10 bits.
|
||||
* m68k expects it to be 8.
|
||||
*
|
||||
* - bits 16-27 are the hardirq count (max # of hardirqs: 4096)
|
||||
* - ( bit 28 is the PREEMPT_ACTIVE flag. )
|
||||
* - bits 16-25 are the hardirq count (max # of nested hardirqs: 1024)
|
||||
* - bit 26 is the NMI_MASK
|
||||
* - bit 28 is the PREEMPT_ACTIVE flag
|
||||
*
|
||||
* PREEMPT_MASK: 0x000000ff
|
||||
* SOFTIRQ_MASK: 0x0000ff00
|
||||
* HARDIRQ_MASK: 0x0fff0000
|
||||
* HARDIRQ_MASK: 0x03ff0000
|
||||
* NMI_MASK: 0x04000000
|
||||
*/
|
||||
#define PREEMPT_BITS 8
|
||||
#define SOFTIRQ_BITS 8
|
||||
#define NMI_BITS 1
|
||||
|
||||
#define MAX_HARDIRQ_BITS 10
|
||||
|
||||
#ifndef HARDIRQ_BITS
|
||||
#define HARDIRQ_BITS 12
|
||||
|
||||
#ifndef MAX_HARDIRQS_PER_CPU
|
||||
#define MAX_HARDIRQS_PER_CPU NR_IRQS
|
||||
# define HARDIRQ_BITS MAX_HARDIRQ_BITS
|
||||
#endif
|
||||
|
||||
/*
|
||||
* The hardirq mask has to be large enough to have space for potentially
|
||||
* all IRQ sources in the system nesting on a single CPU.
|
||||
*/
|
||||
#if (1 << HARDIRQ_BITS) < MAX_HARDIRQS_PER_CPU
|
||||
# error HARDIRQ_BITS is too low!
|
||||
#endif
|
||||
#if HARDIRQ_BITS > MAX_HARDIRQ_BITS
|
||||
#error HARDIRQ_BITS too high!
|
||||
#endif
|
||||
|
||||
#define PREEMPT_SHIFT 0
|
||||
#define SOFTIRQ_SHIFT (PREEMPT_SHIFT + PREEMPT_BITS)
|
||||
#define HARDIRQ_SHIFT (SOFTIRQ_SHIFT + SOFTIRQ_BITS)
|
||||
#define NMI_SHIFT (HARDIRQ_SHIFT + HARDIRQ_BITS)
|
||||
|
||||
#define __IRQ_MASK(x) ((1UL << (x))-1)
|
||||
|
||||
#define PREEMPT_MASK (__IRQ_MASK(PREEMPT_BITS) << PREEMPT_SHIFT)
|
||||
#define SOFTIRQ_MASK (__IRQ_MASK(SOFTIRQ_BITS) << SOFTIRQ_SHIFT)
|
||||
#define HARDIRQ_MASK (__IRQ_MASK(HARDIRQ_BITS) << HARDIRQ_SHIFT)
|
||||
#define NMI_MASK (__IRQ_MASK(NMI_BITS) << NMI_SHIFT)
|
||||
|
||||
#define PREEMPT_OFFSET (1UL << PREEMPT_SHIFT)
|
||||
#define SOFTIRQ_OFFSET (1UL << SOFTIRQ_SHIFT)
|
||||
#define HARDIRQ_OFFSET (1UL << HARDIRQ_SHIFT)
|
||||
#define NMI_OFFSET (1UL << NMI_SHIFT)
|
||||
|
||||
#if PREEMPT_ACTIVE < (1 << (HARDIRQ_SHIFT + HARDIRQ_BITS))
|
||||
#if PREEMPT_ACTIVE < (1 << (NMI_SHIFT + NMI_BITS))
|
||||
#error PREEMPT_ACTIVE is too low!
|
||||
#endif
|
||||
|
||||
#define hardirq_count() (preempt_count() & HARDIRQ_MASK)
|
||||
#define softirq_count() (preempt_count() & SOFTIRQ_MASK)
|
||||
#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK))
|
||||
#define irq_count() (preempt_count() & (HARDIRQ_MASK | SOFTIRQ_MASK \
|
||||
| NMI_MASK))
|
||||
|
||||
/*
|
||||
* Are we doing bottom half or hardware interrupt processing?
|
||||
@@ -73,6 +79,11 @@
|
||||
#define in_softirq() (softirq_count())
|
||||
#define in_interrupt() (irq_count())
|
||||
|
||||
/*
|
||||
* Are we in NMI context?
|
||||
*/
|
||||
#define in_nmi() (preempt_count() & NMI_MASK)
|
||||
|
||||
#if defined(CONFIG_PREEMPT)
|
||||
# define PREEMPT_INATOMIC_BASE kernel_locked()
|
||||
# define PREEMPT_CHECK_OFFSET 1
|
||||
@@ -105,7 +116,7 @@
|
||||
# define IRQ_EXIT_OFFSET HARDIRQ_OFFSET
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#if defined(CONFIG_SMP) || defined(CONFIG_GENERIC_HARDIRQS)
|
||||
extern void synchronize_irq(unsigned int irq);
|
||||
#else
|
||||
# define synchronize_irq(irq) barrier()
|
||||
@@ -164,20 +175,24 @@ extern void irq_enter(void);
|
||||
*/
|
||||
extern void irq_exit(void);
|
||||
|
||||
#define nmi_enter() \
|
||||
do { \
|
||||
ftrace_nmi_enter(); \
|
||||
lockdep_off(); \
|
||||
rcu_nmi_enter(); \
|
||||
__irq_enter(); \
|
||||
#define nmi_enter() \
|
||||
do { \
|
||||
ftrace_nmi_enter(); \
|
||||
BUG_ON(in_nmi()); \
|
||||
add_preempt_count(NMI_OFFSET + HARDIRQ_OFFSET); \
|
||||
lockdep_off(); \
|
||||
rcu_nmi_enter(); \
|
||||
trace_hardirq_enter(); \
|
||||
} while (0)
|
||||
|
||||
#define nmi_exit() \
|
||||
do { \
|
||||
__irq_exit(); \
|
||||
rcu_nmi_exit(); \
|
||||
lockdep_on(); \
|
||||
ftrace_nmi_exit(); \
|
||||
#define nmi_exit() \
|
||||
do { \
|
||||
trace_hardirq_exit(); \
|
||||
rcu_nmi_exit(); \
|
||||
lockdep_on(); \
|
||||
BUG_ON(!in_nmi()); \
|
||||
sub_preempt_count(NMI_OFFSET + HARDIRQ_OFFSET); \
|
||||
ftrace_nmi_exit(); \
|
||||
} while (0)
|
||||
|
||||
#endif /* LINUX_HARDIRQ_H */
|
||||
|
@@ -336,6 +336,11 @@ extern int hrtimer_start(struct hrtimer *timer, ktime_t tim,
|
||||
const enum hrtimer_mode mode);
|
||||
extern int hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
||||
unsigned long range_ns, const enum hrtimer_mode mode);
|
||||
extern int
|
||||
__hrtimer_start_range_ns(struct hrtimer *timer, ktime_t tim,
|
||||
unsigned long delta_ns,
|
||||
const enum hrtimer_mode mode, int wakeup);
|
||||
|
||||
extern int hrtimer_cancel(struct hrtimer *timer);
|
||||
extern int hrtimer_try_to_cancel(struct hrtimer *timer);
|
||||
|
||||
|
@@ -1,26 +0,0 @@
|
||||
/*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* Copyright (C) 2003 Ladislav Michl <ladis@linux-mips.org>
|
||||
*/
|
||||
|
||||
#ifndef I2C_ALGO_SGI_H
|
||||
#define I2C_ALGO_SGI_H 1
|
||||
|
||||
#include <linux/i2c.h>
|
||||
|
||||
struct i2c_algo_sgi_data {
|
||||
void *data; /* private data for lowlevel routines */
|
||||
unsigned (*getctrl)(void *data);
|
||||
void (*setctrl)(void *data, unsigned val);
|
||||
unsigned (*rdata)(void *data);
|
||||
void (*wdata)(void *data, unsigned val);
|
||||
|
||||
int xfer_timeout;
|
||||
int ack_timeout;
|
||||
};
|
||||
|
||||
int i2c_sgi_add_bus(struct i2c_adapter *);
|
||||
|
||||
#endif /* I2C_ALGO_SGI_H */
|
@@ -33,47 +33,10 @@
|
||||
|
||||
#define I2C_DRIVERID_MSP3400 1
|
||||
#define I2C_DRIVERID_TUNER 2
|
||||
#define I2C_DRIVERID_TEA6420 5 /* audio matrix switch */
|
||||
#define I2C_DRIVERID_TEA6415C 6 /* video matrix switch */
|
||||
#define I2C_DRIVERID_TDA9840 7 /* stereo sound processor */
|
||||
#define I2C_DRIVERID_SAA7111A 8 /* video input processor */
|
||||
#define I2C_DRIVERID_SAA7185B 13 /* video encoder */
|
||||
#define I2C_DRIVERID_SAA7110 22 /* video decoder */
|
||||
#define I2C_DRIVERID_SAA5249 24 /* SAA5249 and compatibles */
|
||||
#define I2C_DRIVERID_TDA7432 27 /* Stereo sound processor */
|
||||
#define I2C_DRIVERID_TVAUDIO 29 /* Generic TV sound driver */
|
||||
#define I2C_DRIVERID_TDA9875 32 /* TV sound decoder chip */
|
||||
#define I2C_DRIVERID_BT819 40 /* video decoder */
|
||||
#define I2C_DRIVERID_BT856 41 /* video encoder */
|
||||
#define I2C_DRIVERID_VPX3220 42 /* video decoder+vbi/vtxt */
|
||||
#define I2C_DRIVERID_ADV7175 48 /* ADV 7175/7176 video encoder */
|
||||
#define I2C_DRIVERID_SAA7114 49 /* video decoder */
|
||||
#define I2C_DRIVERID_ADV7170 54 /* video encoder */
|
||||
#define I2C_DRIVERID_SAA7191 57 /* video decoder */
|
||||
#define I2C_DRIVERID_INDYCAM 58 /* SGI IndyCam */
|
||||
#define I2C_DRIVERID_OVCAMCHIP 61 /* OmniVision CMOS image sens. */
|
||||
#define I2C_DRIVERID_SAA6752HS 67 /* MPEG2 encoder */
|
||||
#define I2C_DRIVERID_TVEEPROM 68 /* TV EEPROM */
|
||||
#define I2C_DRIVERID_WM8775 69 /* wm8775 audio processor */
|
||||
#define I2C_DRIVERID_CS53L32A 70 /* cs53l32a audio processor */
|
||||
#define I2C_DRIVERID_CX25840 71 /* cx2584x video encoder */
|
||||
#define I2C_DRIVERID_SAA7127 72 /* saa7127 video encoder */
|
||||
#define I2C_DRIVERID_SAA711X 73 /* saa711x video encoders */
|
||||
#define I2C_DRIVERID_INFRARED 75 /* I2C InfraRed on Video boards */
|
||||
#define I2C_DRIVERID_TVP5150 76 /* TVP5150 video decoder */
|
||||
#define I2C_DRIVERID_WM8739 77 /* wm8739 audio processor */
|
||||
#define I2C_DRIVERID_UPD64083 78 /* upd64083 video processor */
|
||||
#define I2C_DRIVERID_UPD64031A 79 /* upd64031a video processor */
|
||||
#define I2C_DRIVERID_SAA717X 80 /* saa717x video encoder */
|
||||
#define I2C_DRIVERID_BT866 85 /* Conexant bt866 video encoder */
|
||||
#define I2C_DRIVERID_KS0127 86 /* Samsung ks0127 video decoder */
|
||||
#define I2C_DRIVERID_TLV320AIC23B 87 /* TI TLV320AIC23B audio codec */
|
||||
#define I2C_DRIVERID_VP27SMPX 93 /* Panasonic VP27s tuner internal MPX */
|
||||
#define I2C_DRIVERID_M52790 95 /* Mitsubishi M52790SP/FP AV switch */
|
||||
#define I2C_DRIVERID_CS5345 96 /* cs5345 audio processor */
|
||||
#define I2C_DRIVERID_AU8522 97 /* Auvitek au8522 */
|
||||
|
||||
#define I2C_DRIVERID_OV7670 1048 /* Omnivision 7670 camera */
|
||||
|
||||
/*
|
||||
* ---- Adapter types ----------------------------------------------------
|
||||
@@ -88,6 +51,7 @@
|
||||
#define I2C_HW_B_CX2341X 0x010020 /* Conexant CX2341X MPEG encoder cards */
|
||||
#define I2C_HW_B_CX23885 0x010022 /* conexant 23885 based tv cards (bus1) */
|
||||
#define I2C_HW_B_AU0828 0x010023 /* auvitek au0828 usb bridge */
|
||||
#define I2C_HW_B_CX231XX 0x010024 /* Conexant CX231XX USB based cards */
|
||||
#define I2C_HW_B_HDPVR 0x010025 /* Hauppauge HD PVR */
|
||||
|
||||
/* --- SGI adapters */
|
||||
|
@@ -274,7 +274,7 @@ struct i2c_board_info {
|
||||
* are provided using conventional syntax.
|
||||
*/
|
||||
#define I2C_BOARD_INFO(dev_type, dev_addr) \
|
||||
.type = (dev_type), .addr = (dev_addr)
|
||||
.type = dev_type, .addr = (dev_addr)
|
||||
|
||||
|
||||
/* Add-on boards should register/unregister their devices; e.g. a board
|
||||
@@ -353,8 +353,8 @@ struct i2c_adapter {
|
||||
void *algo_data;
|
||||
|
||||
/* --- administration stuff. */
|
||||
int (*client_register)(struct i2c_client *);
|
||||
int (*client_unregister)(struct i2c_client *);
|
||||
int (*client_register)(struct i2c_client *) __deprecated;
|
||||
int (*client_unregister)(struct i2c_client *) __deprecated;
|
||||
|
||||
/* data fields that are valid for all devices */
|
||||
u8 level; /* nesting level for lockdep */
|
||||
|
10
include/linux/i2c/s6000.h
Normal file
10
include/linux/i2c/s6000.h
Normal file
@@ -0,0 +1,10 @@
|
||||
#ifndef __LINUX_I2C_S6000_H
|
||||
#define __LINUX_I2C_S6000_H
|
||||
|
||||
struct s6_i2c_platform_data {
|
||||
const char *clock; /* the clock to use */
|
||||
int bus_num; /* the bus number to register */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -239,66 +239,39 @@ typedef enum {
|
||||
ide_started, /* a drive operation was started, handler was set */
|
||||
} ide_startstop_t;
|
||||
|
||||
enum {
|
||||
IDE_VALID_ERROR = (1 << 1),
|
||||
IDE_VALID_FEATURE = IDE_VALID_ERROR,
|
||||
IDE_VALID_NSECT = (1 << 2),
|
||||
IDE_VALID_LBAL = (1 << 3),
|
||||
IDE_VALID_LBAM = (1 << 4),
|
||||
IDE_VALID_LBAH = (1 << 5),
|
||||
IDE_VALID_DEVICE = (1 << 6),
|
||||
IDE_VALID_LBA = IDE_VALID_LBAL |
|
||||
IDE_VALID_LBAM |
|
||||
IDE_VALID_LBAH,
|
||||
IDE_VALID_OUT_TF = IDE_VALID_FEATURE |
|
||||
IDE_VALID_NSECT |
|
||||
IDE_VALID_LBA,
|
||||
IDE_VALID_IN_TF = IDE_VALID_NSECT |
|
||||
IDE_VALID_LBA,
|
||||
IDE_VALID_OUT_HOB = IDE_VALID_OUT_TF,
|
||||
IDE_VALID_IN_HOB = IDE_VALID_ERROR |
|
||||
IDE_VALID_NSECT |
|
||||
IDE_VALID_LBA,
|
||||
};
|
||||
|
||||
enum {
|
||||
IDE_TFLAG_LBA48 = (1 << 0),
|
||||
IDE_TFLAG_OUT_HOB_FEATURE = (1 << 1),
|
||||
IDE_TFLAG_OUT_HOB_NSECT = (1 << 2),
|
||||
IDE_TFLAG_OUT_HOB_LBAL = (1 << 3),
|
||||
IDE_TFLAG_OUT_HOB_LBAM = (1 << 4),
|
||||
IDE_TFLAG_OUT_HOB_LBAH = (1 << 5),
|
||||
IDE_TFLAG_OUT_HOB = IDE_TFLAG_OUT_HOB_FEATURE |
|
||||
IDE_TFLAG_OUT_HOB_NSECT |
|
||||
IDE_TFLAG_OUT_HOB_LBAL |
|
||||
IDE_TFLAG_OUT_HOB_LBAM |
|
||||
IDE_TFLAG_OUT_HOB_LBAH,
|
||||
IDE_TFLAG_OUT_FEATURE = (1 << 6),
|
||||
IDE_TFLAG_OUT_NSECT = (1 << 7),
|
||||
IDE_TFLAG_OUT_LBAL = (1 << 8),
|
||||
IDE_TFLAG_OUT_LBAM = (1 << 9),
|
||||
IDE_TFLAG_OUT_LBAH = (1 << 10),
|
||||
IDE_TFLAG_OUT_TF = IDE_TFLAG_OUT_FEATURE |
|
||||
IDE_TFLAG_OUT_NSECT |
|
||||
IDE_TFLAG_OUT_LBAL |
|
||||
IDE_TFLAG_OUT_LBAM |
|
||||
IDE_TFLAG_OUT_LBAH,
|
||||
IDE_TFLAG_OUT_DEVICE = (1 << 11),
|
||||
IDE_TFLAG_WRITE = (1 << 12),
|
||||
IDE_TFLAG_CUSTOM_HANDLER = (1 << 13),
|
||||
IDE_TFLAG_DMA_PIO_FALLBACK = (1 << 14),
|
||||
IDE_TFLAG_IN_HOB_ERROR = (1 << 15),
|
||||
IDE_TFLAG_IN_HOB_NSECT = (1 << 16),
|
||||
IDE_TFLAG_IN_HOB_LBAL = (1 << 17),
|
||||
IDE_TFLAG_IN_HOB_LBAM = (1 << 18),
|
||||
IDE_TFLAG_IN_HOB_LBAH = (1 << 19),
|
||||
IDE_TFLAG_IN_HOB_LBA = IDE_TFLAG_IN_HOB_LBAL |
|
||||
IDE_TFLAG_IN_HOB_LBAM |
|
||||
IDE_TFLAG_IN_HOB_LBAH,
|
||||
IDE_TFLAG_IN_HOB = IDE_TFLAG_IN_HOB_ERROR |
|
||||
IDE_TFLAG_IN_HOB_NSECT |
|
||||
IDE_TFLAG_IN_HOB_LBA,
|
||||
IDE_TFLAG_IN_ERROR = (1 << 20),
|
||||
IDE_TFLAG_IN_NSECT = (1 << 21),
|
||||
IDE_TFLAG_IN_LBAL = (1 << 22),
|
||||
IDE_TFLAG_IN_LBAM = (1 << 23),
|
||||
IDE_TFLAG_IN_LBAH = (1 << 24),
|
||||
IDE_TFLAG_IN_LBA = IDE_TFLAG_IN_LBAL |
|
||||
IDE_TFLAG_IN_LBAM |
|
||||
IDE_TFLAG_IN_LBAH,
|
||||
IDE_TFLAG_IN_TF = IDE_TFLAG_IN_NSECT |
|
||||
IDE_TFLAG_IN_LBA,
|
||||
IDE_TFLAG_IN_DEVICE = (1 << 25),
|
||||
IDE_TFLAG_HOB = IDE_TFLAG_OUT_HOB |
|
||||
IDE_TFLAG_IN_HOB,
|
||||
IDE_TFLAG_TF = IDE_TFLAG_OUT_TF |
|
||||
IDE_TFLAG_IN_TF,
|
||||
IDE_TFLAG_DEVICE = IDE_TFLAG_OUT_DEVICE |
|
||||
IDE_TFLAG_IN_DEVICE,
|
||||
IDE_TFLAG_WRITE = (1 << 1),
|
||||
IDE_TFLAG_CUSTOM_HANDLER = (1 << 2),
|
||||
IDE_TFLAG_DMA_PIO_FALLBACK = (1 << 3),
|
||||
/* force 16-bit I/O operations */
|
||||
IDE_TFLAG_IO_16BIT = (1 << 26),
|
||||
IDE_TFLAG_IO_16BIT = (1 << 4),
|
||||
/* struct ide_cmd was allocated using kmalloc() */
|
||||
IDE_TFLAG_DYN = (1 << 27),
|
||||
IDE_TFLAG_FS = (1 << 28),
|
||||
IDE_TFLAG_MULTI_PIO = (1 << 29),
|
||||
IDE_TFLAG_DYN = (1 << 5),
|
||||
IDE_TFLAG_FS = (1 << 6),
|
||||
IDE_TFLAG_MULTI_PIO = (1 << 7),
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -309,45 +282,34 @@ enum {
|
||||
};
|
||||
|
||||
struct ide_taskfile {
|
||||
u8 hob_data; /* 0: high data byte (for TASKFILE IOCTL) */
|
||||
/* 1-5: additional data to support LBA48 */
|
||||
union {
|
||||
u8 hob_error; /* read: error */
|
||||
u8 hob_feature; /* write: feature */
|
||||
u8 data; /* 0: data byte (for TASKFILE ioctl) */
|
||||
union { /* 1: */
|
||||
u8 error; /* read: error */
|
||||
u8 feature; /* write: feature */
|
||||
};
|
||||
|
||||
u8 hob_nsect;
|
||||
u8 hob_lbal;
|
||||
u8 hob_lbam;
|
||||
u8 hob_lbah;
|
||||
|
||||
u8 data; /* 6: low data byte (for TASKFILE IOCTL) */
|
||||
|
||||
union { /* 7: */
|
||||
u8 error; /* read: error */
|
||||
u8 feature; /* write: feature */
|
||||
};
|
||||
|
||||
u8 nsect; /* 8: number of sectors */
|
||||
u8 lbal; /* 9: LBA low */
|
||||
u8 lbam; /* 10: LBA mid */
|
||||
u8 lbah; /* 11: LBA high */
|
||||
|
||||
u8 device; /* 12: device select */
|
||||
|
||||
union { /* 13: */
|
||||
u8 status; /* read: status */
|
||||
u8 nsect; /* 2: number of sectors */
|
||||
u8 lbal; /* 3: LBA low */
|
||||
u8 lbam; /* 4: LBA mid */
|
||||
u8 lbah; /* 5: LBA high */
|
||||
u8 device; /* 6: device select */
|
||||
union { /* 7: */
|
||||
u8 status; /* read: status */
|
||||
u8 command; /* write: command */
|
||||
};
|
||||
};
|
||||
|
||||
struct ide_cmd {
|
||||
union {
|
||||
struct ide_taskfile tf;
|
||||
u8 tf_array[14];
|
||||
};
|
||||
struct ide_taskfile tf;
|
||||
struct ide_taskfile hob;
|
||||
struct {
|
||||
struct {
|
||||
u8 tf;
|
||||
u8 hob;
|
||||
} out, in;
|
||||
} valid;
|
||||
|
||||
u8 tf_flags;
|
||||
u8 ftf_flags; /* for TASKFILE ioctl */
|
||||
u32 tf_flags;
|
||||
int protocol;
|
||||
|
||||
int sg_nents; /* number of sg entries */
|
||||
@@ -662,8 +624,8 @@ struct ide_tp_ops {
|
||||
void (*write_devctl)(struct hwif_s *, u8);
|
||||
|
||||
void (*dev_select)(ide_drive_t *);
|
||||
void (*tf_load)(ide_drive_t *, struct ide_cmd *);
|
||||
void (*tf_read)(ide_drive_t *, struct ide_cmd *);
|
||||
void (*tf_load)(ide_drive_t *, struct ide_taskfile *, u8);
|
||||
void (*tf_read)(ide_drive_t *, struct ide_taskfile *, u8);
|
||||
|
||||
void (*input_data)(ide_drive_t *, struct ide_cmd *,
|
||||
void *, unsigned int);
|
||||
@@ -1162,7 +1124,8 @@ extern int ide_devset_execute(ide_drive_t *drive,
|
||||
void ide_complete_cmd(ide_drive_t *, struct ide_cmd *, u8, u8);
|
||||
int ide_complete_rq(ide_drive_t *, int, unsigned int);
|
||||
|
||||
void ide_tf_dump(const char *, struct ide_taskfile *);
|
||||
void ide_tf_readback(ide_drive_t *drive, struct ide_cmd *cmd);
|
||||
void ide_tf_dump(const char *, struct ide_cmd *);
|
||||
|
||||
void ide_exec_command(ide_hwif_t *, u8);
|
||||
u8 ide_read_status(ide_hwif_t *);
|
||||
@@ -1170,8 +1133,8 @@ u8 ide_read_altstatus(ide_hwif_t *);
|
||||
void ide_write_devctl(ide_hwif_t *, u8);
|
||||
|
||||
void ide_dev_select(ide_drive_t *);
|
||||
void ide_tf_load(ide_drive_t *, struct ide_cmd *);
|
||||
void ide_tf_read(ide_drive_t *, struct ide_cmd *);
|
||||
void ide_tf_load(ide_drive_t *, struct ide_taskfile *, u8);
|
||||
void ide_tf_read(ide_drive_t *, struct ide_taskfile *, u8);
|
||||
|
||||
void ide_input_data(ide_drive_t *, struct ide_cmd *, void *, unsigned int);
|
||||
void ide_output_data(ide_drive_t *, struct ide_cmd *, void *, unsigned int);
|
||||
@@ -1529,7 +1492,7 @@ static inline void ide_set_hwifdata (ide_hwif_t * hwif, void *data)
|
||||
|
||||
extern void ide_toggle_bounce(ide_drive_t *drive, int on);
|
||||
|
||||
u64 ide_get_lba_addr(struct ide_taskfile *, int);
|
||||
u64 ide_get_lba_addr(struct ide_cmd *, int);
|
||||
u8 ide_dump_status(ide_drive_t *, const char *, u8);
|
||||
|
||||
struct ide_timing {
|
||||
|
@@ -2,6 +2,8 @@
|
||||
#define _LINUX_INIT_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/section-names.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
/* These macros are used to mark some functions or
|
||||
* initialized data (doesn't apply to uninitialized data)
|
||||
@@ -60,14 +62,6 @@
|
||||
#define __refdata __section(.ref.data)
|
||||
#define __refconst __section(.ref.rodata)
|
||||
|
||||
/* backward compatibility note
|
||||
* A few places hardcode the old section names:
|
||||
* .text.init.refok
|
||||
* .data.init.refok
|
||||
* .exit.text.refok
|
||||
* They should be converted to use the defines from this file
|
||||
*/
|
||||
|
||||
/* compatibility defines */
|
||||
#define __init_refok __ref
|
||||
#define __initdata_refok __refdata
|
||||
@@ -107,7 +101,7 @@
|
||||
#define __memexitconst __section(.memexit.rodata)
|
||||
|
||||
/* For assembly routines */
|
||||
#define __HEAD .section ".head.text","ax"
|
||||
#define __HEAD .section __stringify(HEAD_TEXT_SECTION),"ax"
|
||||
#define __INIT .section ".init.text","ax"
|
||||
#define __FINIT .previous
|
||||
|
||||
@@ -247,6 +241,7 @@ struct obs_kernel_param {
|
||||
|
||||
/* Relies on boot_command_line being set */
|
||||
void __init parse_early_param(void);
|
||||
void __init parse_early_options(char *cmdline);
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
/**
|
||||
|
@@ -5,6 +5,7 @@
|
||||
#include <linux/irqflags.h>
|
||||
#include <linux/utsname.h>
|
||||
#include <linux/lockdep.h>
|
||||
#include <linux/ftrace.h>
|
||||
#include <linux/ipc.h>
|
||||
#include <linux/pid_namespace.h>
|
||||
#include <linux/user_namespace.h>
|
||||
@@ -14,19 +15,6 @@
|
||||
extern struct files_struct init_files;
|
||||
extern struct fs_struct init_fs;
|
||||
|
||||
#define INIT_KIOCTX(name, which_mm) \
|
||||
{ \
|
||||
.users = ATOMIC_INIT(1), \
|
||||
.dead = 0, \
|
||||
.mm = &which_mm, \
|
||||
.user_id = 0, \
|
||||
.next = NULL, \
|
||||
.wait = __WAIT_QUEUE_HEAD_INITIALIZER(name.wait), \
|
||||
.ctx_lock = __SPIN_LOCK_UNLOCKED(name.ctx_lock), \
|
||||
.reqs_active = 0U, \
|
||||
.max_reqs = ~0U, \
|
||||
}
|
||||
|
||||
#define INIT_MM(name) \
|
||||
{ \
|
||||
.mm_rb = RB_ROOT, \
|
||||
@@ -185,6 +173,7 @@ extern struct cred init_cred;
|
||||
INIT_IDS \
|
||||
INIT_TRACE_IRQFLAGS \
|
||||
INIT_LOCKDEP \
|
||||
INIT_FTRACE_GRAPH \
|
||||
}
|
||||
|
||||
|
||||
|
@@ -106,6 +106,7 @@ struct input_absinfo {
|
||||
|
||||
#define SYN_REPORT 0
|
||||
#define SYN_CONFIG 1
|
||||
#define SYN_MT_REPORT 2
|
||||
|
||||
/*
|
||||
* Keys and buttons
|
||||
@@ -445,6 +446,7 @@ struct input_absinfo {
|
||||
#define BTN_STYLUS2 0x14c
|
||||
#define BTN_TOOL_DOUBLETAP 0x14d
|
||||
#define BTN_TOOL_TRIPLETAP 0x14e
|
||||
#define BTN_TOOL_QUADTAP 0x14f /* Four fingers on trackpad */
|
||||
|
||||
#define BTN_WHEEL 0x150
|
||||
#define BTN_GEAR_DOWN 0x150
|
||||
@@ -644,6 +646,17 @@ struct input_absinfo {
|
||||
#define ABS_TOOL_WIDTH 0x1c
|
||||
#define ABS_VOLUME 0x20
|
||||
#define ABS_MISC 0x28
|
||||
|
||||
#define ABS_MT_TOUCH_MAJOR 0x30 /* Major axis of touching ellipse */
|
||||
#define ABS_MT_TOUCH_MINOR 0x31 /* Minor axis (omit if circular) */
|
||||
#define ABS_MT_WIDTH_MAJOR 0x32 /* Major axis of approaching ellipse */
|
||||
#define ABS_MT_WIDTH_MINOR 0x33 /* Minor axis (omit if circular) */
|
||||
#define ABS_MT_ORIENTATION 0x34 /* Ellipse orientation */
|
||||
#define ABS_MT_POSITION_X 0x35 /* Center X ellipse position */
|
||||
#define ABS_MT_POSITION_Y 0x36 /* Center Y ellipse position */
|
||||
#define ABS_MT_TOOL_TYPE 0x37 /* Type of touching device */
|
||||
#define ABS_MT_BLOB_ID 0x38 /* Group a set of packets as a blob */
|
||||
|
||||
#define ABS_MAX 0x3f
|
||||
#define ABS_CNT (ABS_MAX+1)
|
||||
|
||||
@@ -742,6 +755,12 @@ struct input_absinfo {
|
||||
#define BUS_GSC 0x1A
|
||||
#define BUS_ATARI 0x1B
|
||||
|
||||
/*
|
||||
* MT_TOOL types
|
||||
*/
|
||||
#define MT_TOOL_FINGER 0
|
||||
#define MT_TOOL_PEN 1
|
||||
|
||||
/*
|
||||
* Values describing the status of a force-feedback effect
|
||||
*/
|
||||
@@ -1311,6 +1330,11 @@ static inline void input_sync(struct input_dev *dev)
|
||||
input_event(dev, EV_SYN, SYN_REPORT, 0);
|
||||
}
|
||||
|
||||
static inline void input_mt_sync(struct input_dev *dev)
|
||||
{
|
||||
input_event(dev, EV_SYN, SYN_MT_REPORT, 0);
|
||||
}
|
||||
|
||||
void input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code);
|
||||
|
||||
static inline void input_set_abs_params(struct input_dev *dev, int axis, int min, int max, int fuzz, int flat)
|
||||
|
@@ -164,6 +164,7 @@ static inline void dmar_writeq(void __iomem *addr, u64 val)
|
||||
#define DMA_GCMD_QIE (((u32)1) << 26)
|
||||
#define DMA_GCMD_SIRTP (((u32)1) << 24)
|
||||
#define DMA_GCMD_IRE (((u32) 1) << 25)
|
||||
#define DMA_GCMD_CFI (((u32) 1) << 23)
|
||||
|
||||
/* GSTS_REG */
|
||||
#define DMA_GSTS_TES (((u32)1) << 31)
|
||||
@@ -174,6 +175,7 @@ static inline void dmar_writeq(void __iomem *addr, u64 val)
|
||||
#define DMA_GSTS_QIES (((u32)1) << 26)
|
||||
#define DMA_GSTS_IRTPS (((u32)1) << 24)
|
||||
#define DMA_GSTS_IRES (((u32)1) << 25)
|
||||
#define DMA_GSTS_CFIS (((u32)1) << 23)
|
||||
|
||||
/* CCMD_REG */
|
||||
#define DMA_CCMD_ICC (((u64)1) << 63)
|
||||
@@ -284,6 +286,14 @@ struct iommu_flush {
|
||||
unsigned int size_order, u64 type, int non_present_entry_flush);
|
||||
};
|
||||
|
||||
enum {
|
||||
SR_DMAR_FECTL_REG,
|
||||
SR_DMAR_FEDATA_REG,
|
||||
SR_DMAR_FEADDR_REG,
|
||||
SR_DMAR_FEUADDR_REG,
|
||||
MAX_SR_DMAR_REGS
|
||||
};
|
||||
|
||||
struct intel_iommu {
|
||||
void __iomem *reg; /* Pointer to hardware regs, virtual addr */
|
||||
u64 cap;
|
||||
@@ -304,6 +314,8 @@ struct intel_iommu {
|
||||
struct iommu_flush flush;
|
||||
#endif
|
||||
struct q_inval *qi; /* Queued invalidation info */
|
||||
u32 *iommu_state; /* Store iommu states between suspend and resume.*/
|
||||
|
||||
#ifdef CONFIG_INTR_REMAP
|
||||
struct ir_table *ir_table; /* Interrupt remapping info */
|
||||
#endif
|
||||
@@ -322,6 +334,7 @@ extern int alloc_iommu(struct dmar_drhd_unit *drhd);
|
||||
extern void free_iommu(struct intel_iommu *iommu);
|
||||
extern int dmar_enable_qi(struct intel_iommu *iommu);
|
||||
extern void dmar_disable_qi(struct intel_iommu *iommu);
|
||||
extern int dmar_reenable_qi(struct intel_iommu *iommu);
|
||||
extern void qi_global_iec(struct intel_iommu *iommu);
|
||||
|
||||
extern int qi_flush_context(struct intel_iommu *iommu, u16 did, u16 sid,
|
||||
|
@@ -59,6 +59,18 @@
|
||||
#define IRQF_NOBALANCING 0x00000800
|
||||
#define IRQF_IRQPOLL 0x00001000
|
||||
|
||||
/*
|
||||
* Bits used by threaded handlers:
|
||||
* IRQTF_RUNTHREAD - signals that the interrupt handler thread should run
|
||||
* IRQTF_DIED - handler thread died
|
||||
* IRQTF_WARNED - warning "IRQ_WAKE_THREAD w/o thread_fn" has been printed
|
||||
*/
|
||||
enum {
|
||||
IRQTF_RUNTHREAD,
|
||||
IRQTF_DIED,
|
||||
IRQTF_WARNED,
|
||||
};
|
||||
|
||||
typedef irqreturn_t (*irq_handler_t)(int, void *);
|
||||
|
||||
/**
|
||||
@@ -71,6 +83,9 @@ typedef irqreturn_t (*irq_handler_t)(int, void *);
|
||||
* @next: pointer to the next irqaction for shared interrupts
|
||||
* @irq: interrupt number
|
||||
* @dir: pointer to the proc/irq/NN/name entry
|
||||
* @thread_fn: interupt handler function for threaded interrupts
|
||||
* @thread: thread pointer for threaded interrupts
|
||||
* @thread_flags: flags related to @thread
|
||||
*/
|
||||
struct irqaction {
|
||||
irq_handler_t handler;
|
||||
@@ -81,18 +96,68 @@ struct irqaction {
|
||||
struct irqaction *next;
|
||||
int irq;
|
||||
struct proc_dir_entry *dir;
|
||||
irq_handler_t thread_fn;
|
||||
struct task_struct *thread;
|
||||
unsigned long thread_flags;
|
||||
};
|
||||
|
||||
extern irqreturn_t no_action(int cpl, void *dev_id);
|
||||
extern int __must_check request_irq(unsigned int, irq_handler_t handler,
|
||||
unsigned long, const char *, void *);
|
||||
|
||||
#ifdef CONFIG_GENERIC_HARDIRQS
|
||||
extern int __must_check
|
||||
request_threaded_irq(unsigned int irq, irq_handler_t handler,
|
||||
irq_handler_t thread_fn,
|
||||
unsigned long flags, const char *name, void *dev);
|
||||
|
||||
static inline int __must_check
|
||||
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
|
||||
const char *name, void *dev)
|
||||
{
|
||||
return request_threaded_irq(irq, handler, NULL, flags, name, dev);
|
||||
}
|
||||
|
||||
extern void exit_irq_thread(void);
|
||||
#else
|
||||
|
||||
extern int __must_check
|
||||
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
|
||||
const char *name, void *dev);
|
||||
|
||||
/*
|
||||
* Special function to avoid ifdeffery in kernel/irq/devres.c which
|
||||
* gets magically built by GENERIC_HARDIRQS=n architectures (sparc,
|
||||
* m68k). I really love these $@%#!* obvious Makefile references:
|
||||
* ../../../kernel/irq/devres.o
|
||||
*/
|
||||
static inline int __must_check
|
||||
request_threaded_irq(unsigned int irq, irq_handler_t handler,
|
||||
irq_handler_t thread_fn,
|
||||
unsigned long flags, const char *name, void *dev)
|
||||
{
|
||||
return request_irq(irq, handler, flags, name, dev);
|
||||
}
|
||||
|
||||
static inline void exit_irq_thread(void) { }
|
||||
#endif
|
||||
|
||||
extern void free_irq(unsigned int, void *);
|
||||
|
||||
struct device;
|
||||
|
||||
extern int __must_check devm_request_irq(struct device *dev, unsigned int irq,
|
||||
irq_handler_t handler, unsigned long irqflags,
|
||||
const char *devname, void *dev_id);
|
||||
extern int __must_check
|
||||
devm_request_threaded_irq(struct device *dev, unsigned int irq,
|
||||
irq_handler_t handler, irq_handler_t thread_fn,
|
||||
unsigned long irqflags, const char *devname,
|
||||
void *dev_id);
|
||||
|
||||
static inline int __must_check
|
||||
devm_request_irq(struct device *dev, unsigned int irq, irq_handler_t handler,
|
||||
unsigned long irqflags, const char *devname, void *dev_id)
|
||||
{
|
||||
return devm_request_threaded_irq(dev, irq, handler, NULL, irqflags,
|
||||
devname, dev_id);
|
||||
}
|
||||
|
||||
extern void devm_free_irq(struct device *dev, unsigned int irq, void *dev_id);
|
||||
|
||||
/*
|
||||
@@ -278,6 +343,11 @@ enum
|
||||
NR_SOFTIRQS
|
||||
};
|
||||
|
||||
/* map softirq index to softirq name. update 'softirq_to_name' in
|
||||
* kernel/softirq.c when adding a new softirq.
|
||||
*/
|
||||
extern char *softirq_to_name[NR_SOFTIRQS];
|
||||
|
||||
/* softirq mask and active fields moved to irq_cpustat_t in
|
||||
* asm/hardirq.h to get better cache usage. KAO
|
||||
*/
|
||||
@@ -294,6 +364,7 @@ extern void softirq_init(void);
|
||||
#define __raise_softirq_irqoff(nr) do { or_softirq_pending(1UL << (nr)); } while (0)
|
||||
extern void raise_softirq_irqoff(unsigned int nr);
|
||||
extern void raise_softirq(unsigned int nr);
|
||||
extern void wakeup_softirqd(void);
|
||||
|
||||
/* This is the worklist that queues up per-cpu softirq work.
|
||||
*
|
||||
|
@@ -25,7 +25,7 @@ struct ipc_ids {
|
||||
};
|
||||
|
||||
struct ipc_namespace {
|
||||
struct kref kref;
|
||||
atomic_t count;
|
||||
struct ipc_ids ids[3];
|
||||
|
||||
int sem_ctls[4];
|
||||
@@ -44,25 +44,57 @@ struct ipc_namespace {
|
||||
int shm_tot;
|
||||
|
||||
struct notifier_block ipcns_nb;
|
||||
|
||||
/* The kern_mount of the mqueuefs sb. We take a ref on it */
|
||||
struct vfsmount *mq_mnt;
|
||||
|
||||
/* # queues in this ns, protected by mq_lock */
|
||||
unsigned int mq_queues_count;
|
||||
|
||||
/* next fields are set through sysctl */
|
||||
unsigned int mq_queues_max; /* initialized to DFLT_QUEUESMAX */
|
||||
unsigned int mq_msg_max; /* initialized to DFLT_MSGMAX */
|
||||
unsigned int mq_msgsize_max; /* initialized to DFLT_MSGSIZEMAX */
|
||||
|
||||
};
|
||||
|
||||
extern struct ipc_namespace init_ipc_ns;
|
||||
extern atomic_t nr_ipc_ns;
|
||||
|
||||
#ifdef CONFIG_SYSVIPC
|
||||
extern spinlock_t mq_lock;
|
||||
#if defined(CONFIG_POSIX_MQUEUE) || defined(CONFIG_SYSVIPC)
|
||||
#define INIT_IPC_NS(ns) .ns = &init_ipc_ns,
|
||||
#else
|
||||
#define INIT_IPC_NS(ns)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SYSVIPC
|
||||
extern int register_ipcns_notifier(struct ipc_namespace *);
|
||||
extern int cond_register_ipcns_notifier(struct ipc_namespace *);
|
||||
extern void unregister_ipcns_notifier(struct ipc_namespace *);
|
||||
extern int ipcns_notify(unsigned long);
|
||||
|
||||
#else /* CONFIG_SYSVIPC */
|
||||
#define INIT_IPC_NS(ns)
|
||||
static inline int register_ipcns_notifier(struct ipc_namespace *ns)
|
||||
{ return 0; }
|
||||
static inline int cond_register_ipcns_notifier(struct ipc_namespace *ns)
|
||||
{ return 0; }
|
||||
static inline void unregister_ipcns_notifier(struct ipc_namespace *ns) { }
|
||||
static inline int ipcns_notify(unsigned long l) { return 0; }
|
||||
#endif /* CONFIG_SYSVIPC */
|
||||
|
||||
#if defined(CONFIG_SYSVIPC) && defined(CONFIG_IPC_NS)
|
||||
extern void free_ipc_ns(struct kref *kref);
|
||||
#ifdef CONFIG_POSIX_MQUEUE
|
||||
extern int mq_init_ns(struct ipc_namespace *ns);
|
||||
/* default values */
|
||||
#define DFLT_QUEUESMAX 256 /* max number of message queues */
|
||||
#define DFLT_MSGMAX 10 /* max number of messages in each queue */
|
||||
#define HARD_MSGMAX (131072/sizeof(void *))
|
||||
#define DFLT_MSGSIZEMAX 8192 /* max message size */
|
||||
#else
|
||||
static inline int mq_init_ns(struct ipc_namespace *ns) { return 0; }
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_IPC_NS)
|
||||
extern void free_ipc_ns(struct ipc_namespace *ns);
|
||||
extern struct ipc_namespace *copy_ipcs(unsigned long flags,
|
||||
struct ipc_namespace *ns);
|
||||
extern void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
|
||||
@@ -72,14 +104,11 @@ extern void free_ipcs(struct ipc_namespace *ns, struct ipc_ids *ids,
|
||||
static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
|
||||
{
|
||||
if (ns)
|
||||
kref_get(&ns->kref);
|
||||
atomic_inc(&ns->count);
|
||||
return ns;
|
||||
}
|
||||
|
||||
static inline void put_ipc_ns(struct ipc_namespace *ns)
|
||||
{
|
||||
kref_put(&ns->kref, free_ipc_ns);
|
||||
}
|
||||
extern void put_ipc_ns(struct ipc_namespace *ns);
|
||||
#else
|
||||
static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
|
||||
struct ipc_namespace *ns)
|
||||
@@ -99,4 +128,18 @@ static inline void put_ipc_ns(struct ipc_namespace *ns)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_POSIX_MQUEUE_SYSCTL
|
||||
|
||||
struct ctl_table_header;
|
||||
extern struct ctl_table_header *mq_register_sysctl_table(void);
|
||||
|
||||
#else /* CONFIG_POSIX_MQUEUE_SYSCTL */
|
||||
|
||||
static inline struct ctl_table_header *mq_register_sysctl_table(void)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_POSIX_MQUEUE_SYSCTL */
|
||||
#endif
|
||||
|
@@ -198,6 +198,8 @@ struct kernel_ipmi_msg {
|
||||
response. When you send a
|
||||
response message, this will
|
||||
be returned. */
|
||||
#define IPMI_OEM_RECV_TYPE 5 /* The response for OEM Channels */
|
||||
|
||||
/* Note that async events and received commands do not have a completion
|
||||
code as the first byte of the incoming data, unlike a response. */
|
||||
|
||||
|
@@ -58,6 +58,12 @@
|
||||
#define IPMI_READ_EVENT_MSG_BUFFER_CMD 0x35
|
||||
#define IPMI_GET_CHANNEL_INFO_CMD 0x42
|
||||
|
||||
/* Bit for BMC global enables. */
|
||||
#define IPMI_BMC_RCV_MSG_INTR 0x01
|
||||
#define IPMI_BMC_EVT_MSG_INTR 0x02
|
||||
#define IPMI_BMC_EVT_MSG_BUFF 0x04
|
||||
#define IPMI_BMC_SYS_LOG 0x08
|
||||
|
||||
#define IPMI_NETFN_STORAGE_REQUEST 0x0a
|
||||
#define IPMI_NETFN_STORAGE_RESPONSE 0x0b
|
||||
#define IPMI_ADD_SEL_ENTRY_CMD 0x44
|
||||
@@ -109,5 +115,7 @@
|
||||
#define IPMI_CHANNEL_MEDIUM_USB1 10
|
||||
#define IPMI_CHANNEL_MEDIUM_USB2 11
|
||||
#define IPMI_CHANNEL_MEDIUM_SYSINTF 12
|
||||
#define IPMI_CHANNEL_MEDIUM_OEM_MIN 0x60
|
||||
#define IPMI_CHANNEL_MEDIUM_OEM_MAX 0x7f
|
||||
|
||||
#endif /* __LINUX_IPMI_MSGDEFS_H */
|
||||
|
@@ -22,6 +22,7 @@
|
||||
#include <linux/irqnr.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/topology.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/ptrace.h>
|
||||
@@ -158,6 +159,8 @@ struct irq_2_iommu;
|
||||
* @affinity: IRQ affinity on SMP
|
||||
* @cpu: cpu index useful for balancing
|
||||
* @pending_mask: pending rebalanced interrupts
|
||||
* @threads_active: number of irqaction threads currently running
|
||||
* @wait_for_threads: wait queue for sync_irq to wait for threaded handlers
|
||||
* @dir: /proc/irq/ procfs entry
|
||||
* @name: flow handler name for /proc/interrupts output
|
||||
*/
|
||||
@@ -189,6 +192,8 @@ struct irq_desc {
|
||||
cpumask_var_t pending_mask;
|
||||
#endif
|
||||
#endif
|
||||
atomic_t threads_active;
|
||||
wait_queue_head_t wait_for_threads;
|
||||
#ifdef CONFIG_PROC_FS
|
||||
struct proc_dir_entry *dir;
|
||||
#endif
|
||||
@@ -482,6 +487,16 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc,
|
||||
#endif
|
||||
}
|
||||
|
||||
static inline void free_desc_masks(struct irq_desc *old_desc,
|
||||
struct irq_desc *new_desc)
|
||||
{
|
||||
free_cpumask_var(old_desc->affinity);
|
||||
|
||||
#ifdef CONFIG_GENERIC_PENDING_IRQ
|
||||
free_cpumask_var(old_desc->pending_mask);
|
||||
#endif
|
||||
}
|
||||
|
||||
#else /* !CONFIG_SMP */
|
||||
|
||||
static inline bool init_alloc_desc_masks(struct irq_desc *desc, int cpu,
|
||||
@@ -495,6 +510,10 @@ static inline void init_copy_desc_masks(struct irq_desc *old_desc,
|
||||
{
|
||||
}
|
||||
|
||||
static inline void free_desc_masks(struct irq_desc *old_desc,
|
||||
struct irq_desc *new_desc)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
#endif /* _LINUX_IRQ_H */
|
||||
|
@@ -5,10 +5,12 @@
|
||||
* enum irqreturn
|
||||
* @IRQ_NONE interrupt was not from this device
|
||||
* @IRQ_HANDLED interrupt was handled by this device
|
||||
* @IRQ_WAKE_THREAD handler requests to wake the handler thread
|
||||
*/
|
||||
enum irqreturn {
|
||||
IRQ_NONE,
|
||||
IRQ_HANDLED,
|
||||
IRQ_WAKE_THREAD,
|
||||
};
|
||||
|
||||
typedef enum irqreturn irqreturn_t;
|
||||
|
@@ -978,7 +978,8 @@ extern void journal_destroy_revoke(journal_t *);
|
||||
extern int journal_revoke (handle_t *,
|
||||
unsigned long, struct buffer_head *);
|
||||
extern int journal_cancel_revoke(handle_t *, struct journal_head *);
|
||||
extern void journal_write_revoke_records(journal_t *, transaction_t *);
|
||||
extern void journal_write_revoke_records(journal_t *,
|
||||
transaction_t *, int);
|
||||
|
||||
/* Recovery revoke support */
|
||||
extern int journal_set_revoke(journal_t *, unsigned long, tid_t);
|
||||
|
@@ -1193,7 +1193,8 @@ extern int jbd2_journal_init_revoke_caches(void);
|
||||
extern void jbd2_journal_destroy_revoke(journal_t *);
|
||||
extern int jbd2_journal_revoke (handle_t *, unsigned long long, struct buffer_head *);
|
||||
extern int jbd2_journal_cancel_revoke(handle_t *, struct journal_head *);
|
||||
extern void jbd2_journal_write_revoke_records(journal_t *, transaction_t *);
|
||||
extern void jbd2_journal_write_revoke_records(journal_t *,
|
||||
transaction_t *, int);
|
||||
|
||||
/* Recovery revoke support */
|
||||
extern int jbd2_journal_set_revoke(journal_t *, unsigned long long, tid_t);
|
||||
|
@@ -13,10 +13,17 @@
|
||||
#define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + (KSYM_NAME_LEN - 1) + \
|
||||
2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + 1)
|
||||
|
||||
struct module;
|
||||
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
/* Lookup the address for a symbol. Returns 0 if not found. */
|
||||
unsigned long kallsyms_lookup_name(const char *name);
|
||||
|
||||
/* Call a function on each kallsyms symbol in the core kernel */
|
||||
int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
|
||||
unsigned long),
|
||||
void *data);
|
||||
|
||||
extern int kallsyms_lookup_size_offset(unsigned long addr,
|
||||
unsigned long *symbolsize,
|
||||
unsigned long *offset);
|
||||
@@ -43,6 +50,14 @@ static inline unsigned long kallsyms_lookup_name(const char *name)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int kallsyms_on_each_symbol(int (*fn)(void *, const char *,
|
||||
struct module *,
|
||||
unsigned long),
|
||||
void *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int kallsyms_lookup_size_offset(unsigned long addr,
|
||||
unsigned long *symbolsize,
|
||||
unsigned long *offset)
|
||||
|
@@ -242,6 +242,19 @@ extern struct ratelimit_state printk_ratelimit_state;
|
||||
extern int printk_ratelimit(void);
|
||||
extern bool printk_timed_ratelimit(unsigned long *caller_jiffies,
|
||||
unsigned int interval_msec);
|
||||
|
||||
/*
|
||||
* Print a one-time message (analogous to WARN_ONCE() et al):
|
||||
*/
|
||||
#define printk_once(x...) ({ \
|
||||
static int __print_once = 1; \
|
||||
\
|
||||
if (__print_once) { \
|
||||
__print_once = 0; \
|
||||
printk(x); \
|
||||
} \
|
||||
})
|
||||
|
||||
void log_buf_kexec_setup(void);
|
||||
#else
|
||||
static inline int vprintk(const char *s, va_list args)
|
||||
@@ -254,6 +267,10 @@ static inline int printk_ratelimit(void) { return 0; }
|
||||
static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \
|
||||
unsigned int interval_msec) \
|
||||
{ return false; }
|
||||
|
||||
/* No effect, but we still get type checking even in the !PRINTK case: */
|
||||
#define printk_once(x...) printk(x)
|
||||
|
||||
static inline void log_buf_kexec_setup(void)
|
||||
{
|
||||
}
|
||||
@@ -360,6 +377,15 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
|
||||
#define pr_cont(fmt, ...) \
|
||||
printk(KERN_CONT fmt, ##__VA_ARGS__)
|
||||
|
||||
/* pr_devel() should produce zero code unless DEBUG is defined */
|
||||
#ifdef DEBUG
|
||||
#define pr_devel(fmt, ...) \
|
||||
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__)
|
||||
#else
|
||||
#define pr_devel(fmt, ...) \
|
||||
({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; })
|
||||
#endif
|
||||
|
||||
/* If you are writing a driver, please use dev_dbg instead */
|
||||
#if defined(DEBUG)
|
||||
#define pr_debug(fmt, ...) \
|
||||
@@ -374,6 +400,139 @@ static inline char *pack_hex_byte(char *buf, u8 byte)
|
||||
({ if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); 0; })
|
||||
#endif
|
||||
|
||||
/*
|
||||
* General tracing related utility functions - trace_printk(),
|
||||
* tracing_on/tracing_off and tracing_start()/tracing_stop
|
||||
*
|
||||
* Use tracing_on/tracing_off when you want to quickly turn on or off
|
||||
* tracing. It simply enables or disables the recording of the trace events.
|
||||
* This also corresponds to the user space debugfs/tracing/tracing_on
|
||||
* file, which gives a means for the kernel and userspace to interact.
|
||||
* Place a tracing_off() in the kernel where you want tracing to end.
|
||||
* From user space, examine the trace, and then echo 1 > tracing_on
|
||||
* to continue tracing.
|
||||
*
|
||||
* tracing_stop/tracing_start has slightly more overhead. It is used
|
||||
* by things like suspend to ram where disabling the recording of the
|
||||
* trace is not enough, but tracing must actually stop because things
|
||||
* like calling smp_processor_id() may crash the system.
|
||||
*
|
||||
* Most likely, you want to use tracing_on/tracing_off.
|
||||
*/
|
||||
#ifdef CONFIG_RING_BUFFER
|
||||
void tracing_on(void);
|
||||
void tracing_off(void);
|
||||
/* trace_off_permanent stops recording with no way to bring it back */
|
||||
void tracing_off_permanent(void);
|
||||
int tracing_is_on(void);
|
||||
#else
|
||||
static inline void tracing_on(void) { }
|
||||
static inline void tracing_off(void) { }
|
||||
static inline void tracing_off_permanent(void) { }
|
||||
static inline int tracing_is_on(void) { return 0; }
|
||||
#endif
|
||||
#ifdef CONFIG_TRACING
|
||||
extern void tracing_start(void);
|
||||
extern void tracing_stop(void);
|
||||
extern void ftrace_off_permanent(void);
|
||||
|
||||
extern void
|
||||
ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3);
|
||||
|
||||
static inline void __attribute__ ((format (printf, 1, 2)))
|
||||
____trace_printk_check_format(const char *fmt, ...)
|
||||
{
|
||||
}
|
||||
#define __trace_printk_check_format(fmt, args...) \
|
||||
do { \
|
||||
if (0) \
|
||||
____trace_printk_check_format(fmt, ##args); \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* trace_printk - printf formatting in the ftrace buffer
|
||||
* @fmt: the printf format for printing
|
||||
*
|
||||
* Note: __trace_printk is an internal function for trace_printk and
|
||||
* the @ip is passed in via the trace_printk macro.
|
||||
*
|
||||
* This function allows a kernel developer to debug fast path sections
|
||||
* that printk is not appropriate for. By scattering in various
|
||||
* printk like tracing in the code, a developer can quickly see
|
||||
* where problems are occurring.
|
||||
*
|
||||
* This is intended as a debugging tool for the developer only.
|
||||
* Please refrain from leaving trace_printks scattered around in
|
||||
* your code.
|
||||
*/
|
||||
|
||||
#define trace_printk(fmt, args...) \
|
||||
do { \
|
||||
__trace_printk_check_format(fmt, ##args); \
|
||||
if (__builtin_constant_p(fmt)) { \
|
||||
static const char *trace_printk_fmt \
|
||||
__attribute__((section("__trace_printk_fmt"))) = \
|
||||
__builtin_constant_p(fmt) ? fmt : NULL; \
|
||||
\
|
||||
__trace_bprintk(_THIS_IP_, trace_printk_fmt, ##args); \
|
||||
} else \
|
||||
__trace_printk(_THIS_IP_, fmt, ##args); \
|
||||
} while (0)
|
||||
|
||||
extern int
|
||||
__trace_bprintk(unsigned long ip, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
|
||||
extern int
|
||||
__trace_printk(unsigned long ip, const char *fmt, ...)
|
||||
__attribute__ ((format (printf, 2, 3)));
|
||||
|
||||
/*
|
||||
* The double __builtin_constant_p is because gcc will give us an error
|
||||
* if we try to allocate the static variable to fmt if it is not a
|
||||
* constant. Even with the outer if statement.
|
||||
*/
|
||||
#define ftrace_vprintk(fmt, vargs) \
|
||||
do { \
|
||||
if (__builtin_constant_p(fmt)) { \
|
||||
static const char *trace_printk_fmt \
|
||||
__attribute__((section("__trace_printk_fmt"))) = \
|
||||
__builtin_constant_p(fmt) ? fmt : NULL; \
|
||||
\
|
||||
__ftrace_vbprintk(_THIS_IP_, trace_printk_fmt, vargs); \
|
||||
} else \
|
||||
__ftrace_vprintk(_THIS_IP_, fmt, vargs); \
|
||||
} while (0)
|
||||
|
||||
extern int
|
||||
__ftrace_vbprintk(unsigned long ip, const char *fmt, va_list ap);
|
||||
|
||||
extern int
|
||||
__ftrace_vprintk(unsigned long ip, const char *fmt, va_list ap);
|
||||
|
||||
extern void ftrace_dump(void);
|
||||
#else
|
||||
static inline void
|
||||
ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { }
|
||||
static inline int
|
||||
trace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
|
||||
static inline void tracing_start(void) { }
|
||||
static inline void tracing_stop(void) { }
|
||||
static inline void ftrace_off_permanent(void) { }
|
||||
static inline int
|
||||
trace_printk(const char *fmt, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int
|
||||
ftrace_vprintk(const char *fmt, va_list ap)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void ftrace_dump(void) { }
|
||||
#endif /* CONFIG_TRACING */
|
||||
|
||||
/*
|
||||
* Display an IP address in readable format.
|
||||
*/
|
||||
|
@@ -20,6 +20,7 @@
|
||||
#include <linux/rbtree.h>
|
||||
#include <linux/rcupdate.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
@@ -29,10 +29,15 @@
|
||||
#ifdef CONFIG_MODULES
|
||||
/* modprobe exit status on success, -ve on error. Return value
|
||||
* usually useless though. */
|
||||
extern int request_module(const char * name, ...) __attribute__ ((format (printf, 1, 2)));
|
||||
#define try_then_request_module(x, mod...) ((x) ?: (request_module(mod), (x)))
|
||||
extern int __request_module(bool wait, const char *name, ...) \
|
||||
__attribute__((format(printf, 2, 3)));
|
||||
#define request_module(mod...) __request_module(true, mod)
|
||||
#define request_module_nowait(mod...) __request_module(false, mod)
|
||||
#define try_then_request_module(x, mod...) \
|
||||
((x) ?: (__request_module(true, mod), (x)))
|
||||
#else
|
||||
static inline int request_module(const char * name, ...) { return -ENOSYS; }
|
||||
static inline int request_module(const char *name, ...) { return -ENOSYS; }
|
||||
static inline int request_module_nowait(const char *name, ...) { return -ENOSYS; }
|
||||
#define try_then_request_module(x, mod...) (x)
|
||||
#endif
|
||||
|
||||
|
@@ -94,12 +94,16 @@ struct kprobe {
|
||||
/* Called after addr is executed, unless... */
|
||||
kprobe_post_handler_t post_handler;
|
||||
|
||||
/* ... called if executing addr causes a fault (eg. page fault).
|
||||
* Return 1 if it handled fault, otherwise kernel will see it. */
|
||||
/*
|
||||
* ... called if executing addr causes a fault (eg. page fault).
|
||||
* Return 1 if it handled fault, otherwise kernel will see it.
|
||||
*/
|
||||
kprobe_fault_handler_t fault_handler;
|
||||
|
||||
/* ... called if breakpoint trap occurs in probe handler.
|
||||
* Return 1 if it handled break, otherwise kernel will see it. */
|
||||
/*
|
||||
* ... called if breakpoint trap occurs in probe handler.
|
||||
* Return 1 if it handled break, otherwise kernel will see it.
|
||||
*/
|
||||
kprobe_break_handler_t break_handler;
|
||||
|
||||
/* Saved opcode (which has been replaced with breakpoint) */
|
||||
@@ -108,18 +112,28 @@ struct kprobe {
|
||||
/* copy of the original instruction */
|
||||
struct arch_specific_insn ainsn;
|
||||
|
||||
/* Indicates various status flags. Protected by kprobe_mutex. */
|
||||
/*
|
||||
* Indicates various status flags.
|
||||
* Protected by kprobe_mutex after this kprobe is registered.
|
||||
*/
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
/* Kprobe status flags */
|
||||
#define KPROBE_FLAG_GONE 1 /* breakpoint has already gone */
|
||||
#define KPROBE_FLAG_DISABLED 2 /* probe is temporarily disabled */
|
||||
|
||||
/* Has this kprobe gone ? */
|
||||
static inline int kprobe_gone(struct kprobe *p)
|
||||
{
|
||||
return p->flags & KPROBE_FLAG_GONE;
|
||||
}
|
||||
|
||||
/* Is this kprobe disabled ? */
|
||||
static inline int kprobe_disabled(struct kprobe *p)
|
||||
{
|
||||
return p->flags & (KPROBE_FLAG_DISABLED | KPROBE_FLAG_GONE);
|
||||
}
|
||||
/*
|
||||
* Special probe type that uses setjmp-longjmp type tricks to resume
|
||||
* execution at a specified entry with a matching prototype corresponding
|
||||
@@ -279,6 +293,9 @@ void unregister_kretprobes(struct kretprobe **rps, int num);
|
||||
void kprobe_flush_task(struct task_struct *tk);
|
||||
void recycle_rp_inst(struct kretprobe_instance *ri, struct hlist_head *head);
|
||||
|
||||
int disable_kprobe(struct kprobe *kp);
|
||||
int enable_kprobe(struct kprobe *kp);
|
||||
|
||||
#else /* !CONFIG_KPROBES: */
|
||||
|
||||
static inline int kprobes_built_in(void)
|
||||
@@ -345,5 +362,30 @@ static inline void unregister_kretprobes(struct kretprobe **rps, int num)
|
||||
static inline void kprobe_flush_task(struct task_struct *tk)
|
||||
{
|
||||
}
|
||||
static inline int disable_kprobe(struct kprobe *kp)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
static inline int enable_kprobe(struct kprobe *kp)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
#endif /* CONFIG_KPROBES */
|
||||
static inline int disable_kretprobe(struct kretprobe *rp)
|
||||
{
|
||||
return disable_kprobe(&rp->kp);
|
||||
}
|
||||
static inline int enable_kretprobe(struct kretprobe *rp)
|
||||
{
|
||||
return enable_kprobe(&rp->kp);
|
||||
}
|
||||
static inline int disable_jprobe(struct jprobe *jp)
|
||||
{
|
||||
return disable_kprobe(&jp->kp);
|
||||
}
|
||||
static inline int enable_jprobe(struct jprobe *jp)
|
||||
{
|
||||
return enable_kprobe(&jp->kp);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_KPROBES_H */
|
||||
|
@@ -409,6 +409,8 @@ struct kvm_trace_rec {
|
||||
#ifdef __KVM_HAVE_DEVICE_ASSIGNMENT
|
||||
#define KVM_CAP_DEVICE_DEASSIGNMENT 27
|
||||
#endif
|
||||
/* Another bug in KVM_SET_USER_MEMORY_REGION fixed: */
|
||||
#define KVM_CAP_JOIN_MEMORY_REGIONS_WORKS 30
|
||||
|
||||
#ifdef KVM_CAP_IRQ_ROUTING
|
||||
|
||||
|
26
include/linux/leds-bd2802.h
Normal file
26
include/linux/leds-bd2802.h
Normal file
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* leds-bd2802.h - RGB LED Driver
|
||||
*
|
||||
* Copyright (C) 2009 Samsung Electronics
|
||||
* Kim Kyuwon <q1.kim@samsung.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* Datasheet: http://www.rohm.com/products/databook/driver/pdf/bd2802gu-e.pdf
|
||||
*
|
||||
*/
|
||||
#ifndef _LEDS_BD2802_H_
|
||||
#define _LEDS_BD2802_H_
|
||||
|
||||
struct bd2802_led_platform_data{
|
||||
int reset_gpio;
|
||||
u8 rgb_time;
|
||||
};
|
||||
|
||||
#define RGB_TIME(slopedown, slopeup, waveform) \
|
||||
((slopedown) << 6 | (slopeup) << 4 | (waveform))
|
||||
|
||||
#endif /* _LEDS_BD2802_H_ */
|
||||
|
@@ -30,6 +30,7 @@ enum led_brightness {
|
||||
struct led_classdev {
|
||||
const char *name;
|
||||
int brightness;
|
||||
int max_brightness;
|
||||
int flags;
|
||||
|
||||
/* Lower 16 bits reflect status */
|
||||
@@ -140,7 +141,8 @@ struct gpio_led {
|
||||
const char *name;
|
||||
const char *default_trigger;
|
||||
unsigned gpio;
|
||||
u8 active_low;
|
||||
u8 active_low : 1;
|
||||
u8 retain_state_suspended : 1;
|
||||
};
|
||||
|
||||
struct gpio_led_platform_data {
|
||||
|
21
include/linux/leds_pwm.h
Normal file
21
include/linux/leds_pwm.h
Normal file
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* PWM LED driver data - see drivers/leds/leds-pwm.c
|
||||
*/
|
||||
#ifndef __LINUX_LEDS_PWM_H
|
||||
#define __LINUX_LEDS_PWM_H
|
||||
|
||||
struct led_pwm {
|
||||
const char *name;
|
||||
const char *default_trigger;
|
||||
unsigned pwm_id;
|
||||
u8 active_low;
|
||||
unsigned max_brightness;
|
||||
unsigned pwm_period_ns;
|
||||
};
|
||||
|
||||
struct led_pwm_platform_data {
|
||||
int num_leds;
|
||||
struct led_pwm *leds;
|
||||
};
|
||||
|
||||
#endif
|
@@ -209,6 +209,7 @@ enum {
|
||||
|
||||
/* bits 24:31 of ap->flags are reserved for LLD specific flags */
|
||||
|
||||
|
||||
/* struct ata_port pflags */
|
||||
ATA_PFLAG_EH_PENDING = (1 << 0), /* EH pending */
|
||||
ATA_PFLAG_EH_IN_PROGRESS = (1 << 1), /* EH in progress */
|
||||
@@ -225,6 +226,9 @@ enum {
|
||||
ATA_PFLAG_PM_PENDING = (1 << 18), /* PM operation pending */
|
||||
ATA_PFLAG_INIT_GTM_VALID = (1 << 19), /* initial gtm data valid */
|
||||
|
||||
ATA_PFLAG_PIO32 = (1 << 20), /* 32bit PIO */
|
||||
ATA_PFLAG_PIO32CHANGE = (1 << 21), /* 32bit PIO can be turned on/off */
|
||||
|
||||
/* struct ata_queued_cmd flags */
|
||||
ATA_QCFLAG_ACTIVE = (1 << 0), /* cmd not yet ack'd to scsi lyer */
|
||||
ATA_QCFLAG_DMAMAP = (1 << 1), /* SG table is DMA mapped */
|
||||
@@ -689,7 +693,10 @@ struct ata_port {
|
||||
struct Scsi_Host *scsi_host; /* our co-allocated scsi host */
|
||||
struct ata_port_operations *ops;
|
||||
spinlock_t *lock;
|
||||
/* Flags owned by the EH context. Only EH should touch these once the
|
||||
port is active */
|
||||
unsigned long flags; /* ATA_FLAG_xxx */
|
||||
/* Flags that change dynamically, protected by ap->lock */
|
||||
unsigned int pflags; /* ATA_PFLAG_xxx */
|
||||
unsigned int print_id; /* user visible unique port ID */
|
||||
unsigned int port_no; /* 0 based port no. inside the host */
|
||||
@@ -1595,6 +1602,7 @@ extern void ata_sff_drain_fifo(struct ata_queued_cmd *qc);
|
||||
extern void ata_sff_error_handler(struct ata_port *ap);
|
||||
extern void ata_sff_post_internal_cmd(struct ata_queued_cmd *qc);
|
||||
extern int ata_sff_port_start(struct ata_port *ap);
|
||||
extern int ata_sff_port_start32(struct ata_port *ap);
|
||||
extern void ata_sff_std_ports(struct ata_ioports *ioaddr);
|
||||
extern unsigned long ata_bmdma_mode_filter(struct ata_device *dev,
|
||||
unsigned long xfer_mask);
|
||||
|
@@ -25,13 +25,13 @@ struct svc_rqst;
|
||||
#define NLM_MAXCOOKIELEN 32
|
||||
#define NLM_MAXSTRLEN 1024
|
||||
|
||||
#define nlm_granted __constant_htonl(NLM_LCK_GRANTED)
|
||||
#define nlm_lck_denied __constant_htonl(NLM_LCK_DENIED)
|
||||
#define nlm_lck_denied_nolocks __constant_htonl(NLM_LCK_DENIED_NOLOCKS)
|
||||
#define nlm_lck_blocked __constant_htonl(NLM_LCK_BLOCKED)
|
||||
#define nlm_lck_denied_grace_period __constant_htonl(NLM_LCK_DENIED_GRACE_PERIOD)
|
||||
#define nlm_granted cpu_to_be32(NLM_LCK_GRANTED)
|
||||
#define nlm_lck_denied cpu_to_be32(NLM_LCK_DENIED)
|
||||
#define nlm_lck_denied_nolocks cpu_to_be32(NLM_LCK_DENIED_NOLOCKS)
|
||||
#define nlm_lck_blocked cpu_to_be32(NLM_LCK_BLOCKED)
|
||||
#define nlm_lck_denied_grace_period cpu_to_be32(NLM_LCK_DENIED_GRACE_PERIOD)
|
||||
|
||||
#define nlm_drop_reply __constant_htonl(30000)
|
||||
#define nlm_drop_reply cpu_to_be32(30000)
|
||||
|
||||
/* Lock info passed via NLM */
|
||||
struct nlm_lock {
|
||||
|
@@ -15,11 +15,11 @@
|
||||
#include <linux/lockd/xdr.h>
|
||||
|
||||
/* error codes new to NLMv4 */
|
||||
#define nlm4_deadlock __constant_htonl(NLM_DEADLCK)
|
||||
#define nlm4_rofs __constant_htonl(NLM_ROFS)
|
||||
#define nlm4_stale_fh __constant_htonl(NLM_STALE_FH)
|
||||
#define nlm4_fbig __constant_htonl(NLM_FBIG)
|
||||
#define nlm4_failed __constant_htonl(NLM_FAILED)
|
||||
#define nlm4_deadlock cpu_to_be32(NLM_DEADLCK)
|
||||
#define nlm4_rofs cpu_to_be32(NLM_ROFS)
|
||||
#define nlm4_stale_fh cpu_to_be32(NLM_STALE_FH)
|
||||
#define nlm4_fbig cpu_to_be32(NLM_FBIG)
|
||||
#define nlm4_failed cpu_to_be32(NLM_FAILED)
|
||||
|
||||
|
||||
|
||||
|
@@ -56,7 +56,7 @@ extern void mem_cgroup_move_lists(struct page *page,
|
||||
enum lru_list from, enum lru_list to);
|
||||
extern void mem_cgroup_uncharge_page(struct page *page);
|
||||
extern void mem_cgroup_uncharge_cache_page(struct page *page);
|
||||
extern int mem_cgroup_shrink_usage(struct page *page,
|
||||
extern int mem_cgroup_shmem_charge_fallback(struct page *page,
|
||||
struct mm_struct *mm, gfp_t gfp_mask);
|
||||
|
||||
extern unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
|
||||
@@ -75,7 +75,7 @@ int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup *cgroup)
|
||||
{
|
||||
struct mem_cgroup *mem;
|
||||
rcu_read_lock();
|
||||
mem = mem_cgroup_from_task((mm)->owner);
|
||||
mem = mem_cgroup_from_task(rcu_dereference((mm)->owner));
|
||||
rcu_read_unlock();
|
||||
return cgroup == mem;
|
||||
}
|
||||
@@ -155,7 +155,7 @@ static inline void mem_cgroup_uncharge_cache_page(struct page *page)
|
||||
{
|
||||
}
|
||||
|
||||
static inline int mem_cgroup_shrink_usage(struct page *page,
|
||||
static inline int mem_cgroup_shmem_charge_fallback(struct page *page,
|
||||
struct mm_struct *mm, gfp_t gfp_mask)
|
||||
{
|
||||
return 0;
|
||||
|
@@ -110,4 +110,10 @@ struct memory_accessor {
|
||||
off_t offset, size_t count);
|
||||
};
|
||||
|
||||
/*
|
||||
* Kernel text modification mutex, used for code patching. Users of this lock
|
||||
* can sleep.
|
||||
*/
|
||||
extern struct mutex text_mutex;
|
||||
|
||||
#endif /* _LINUX_MEMORY_H_ */
|
||||
|
6
include/linux/mfd/ds1wm.h
Normal file
6
include/linux/mfd/ds1wm.h
Normal file
@@ -0,0 +1,6 @@
|
||||
/* MFD cell driver data for the DS1WM driver */
|
||||
|
||||
struct ds1wm_driver_data {
|
||||
int active_high;
|
||||
int clock_rate;
|
||||
};
|
@@ -48,7 +48,6 @@ struct pasic3_leds_machinfo {
|
||||
|
||||
struct pasic3_platform_data {
|
||||
struct pasic3_leds_machinfo *led_pdata;
|
||||
unsigned int bus_shift;
|
||||
unsigned int clock_rate;
|
||||
};
|
||||
|
||||
|
@@ -29,6 +29,8 @@ struct pcf50633_platform_data {
|
||||
char **batteries;
|
||||
int num_batteries;
|
||||
|
||||
int charging_restart_interval;
|
||||
|
||||
/* Callbacks */
|
||||
void (*probe_done)(struct pcf50633 *);
|
||||
void (*mbc_event_callback)(struct pcf50633 *, int);
|
||||
|
@@ -128,7 +128,6 @@ enum pcf50633_reg_mbcs3 {
|
||||
int pcf50633_mbc_usb_curlim_set(struct pcf50633 *pcf, int ma);
|
||||
|
||||
int pcf50633_mbc_get_status(struct pcf50633 *);
|
||||
void pcf50633_mbc_set_status(struct pcf50633 *, int what, int status);
|
||||
|
||||
#endif
|
||||
|
||||
|
@@ -640,9 +640,11 @@ struct wm8350 {
|
||||
*
|
||||
* @init: Function called during driver initialisation. Should be
|
||||
* used by the platform to configure GPIO functions and similar.
|
||||
* @irq_high: Set if WM8350 IRQ is active high.
|
||||
*/
|
||||
struct wm8350_platform_data {
|
||||
int (*init)(struct wm8350 *wm8350);
|
||||
int irq_high;
|
||||
};
|
||||
|
||||
|
||||
|
206
include/linux/mg_disk.h
Normal file
206
include/linux/mg_disk.h
Normal file
@@ -0,0 +1,206 @@
|
||||
/*
|
||||
* include/linux/mg_disk.c
|
||||
*
|
||||
* Support for the mGine m[g]flash IO mode.
|
||||
* Based on legacy hd.c
|
||||
*
|
||||
* (c) 2008 mGine Co.,LTD
|
||||
* (c) 2008 unsik Kim <donari75@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __MG_DISK_H__
|
||||
#define __MG_DISK_H__
|
||||
|
||||
#include <linux/blkdev.h>
|
||||
#include <linux/ata.h>
|
||||
|
||||
/* name for block device */
|
||||
#define MG_DISK_NAME "mgd"
|
||||
/* name for platform device */
|
||||
#define MG_DEV_NAME "mg_disk"
|
||||
|
||||
#define MG_DISK_MAJ 0
|
||||
#define MG_DISK_MAX_PART 16
|
||||
#define MG_SECTOR_SIZE 512
|
||||
#define MG_MAX_SECTS 256
|
||||
|
||||
/* Register offsets */
|
||||
#define MG_BUFF_OFFSET 0x8000
|
||||
#define MG_STORAGE_BUFFER_SIZE 0x200
|
||||
#define MG_REG_OFFSET 0xC000
|
||||
#define MG_REG_FEATURE (MG_REG_OFFSET + 2) /* write case */
|
||||
#define MG_REG_ERROR (MG_REG_OFFSET + 2) /* read case */
|
||||
#define MG_REG_SECT_CNT (MG_REG_OFFSET + 4)
|
||||
#define MG_REG_SECT_NUM (MG_REG_OFFSET + 6)
|
||||
#define MG_REG_CYL_LOW (MG_REG_OFFSET + 8)
|
||||
#define MG_REG_CYL_HIGH (MG_REG_OFFSET + 0xA)
|
||||
#define MG_REG_DRV_HEAD (MG_REG_OFFSET + 0xC)
|
||||
#define MG_REG_COMMAND (MG_REG_OFFSET + 0xE) /* write case */
|
||||
#define MG_REG_STATUS (MG_REG_OFFSET + 0xE) /* read case */
|
||||
#define MG_REG_DRV_CTRL (MG_REG_OFFSET + 0x10)
|
||||
#define MG_REG_BURST_CTRL (MG_REG_OFFSET + 0x12)
|
||||
|
||||
/* "Drive Select/Head Register" bit values */
|
||||
#define MG_REG_HEAD_MUST_BE_ON 0xA0 /* These 2 bits are always on */
|
||||
#define MG_REG_HEAD_DRIVE_MASTER (0x00 | MG_REG_HEAD_MUST_BE_ON)
|
||||
#define MG_REG_HEAD_DRIVE_SLAVE (0x10 | MG_REG_HEAD_MUST_BE_ON)
|
||||
#define MG_REG_HEAD_LBA_MODE (0x40 | MG_REG_HEAD_MUST_BE_ON)
|
||||
|
||||
|
||||
/* "Device Control Register" bit values */
|
||||
#define MG_REG_CTRL_INTR_ENABLE 0x0
|
||||
#define MG_REG_CTRL_INTR_DISABLE (0x1<<1)
|
||||
#define MG_REG_CTRL_RESET (0x1<<2)
|
||||
#define MG_REG_CTRL_INTR_POLA_ACTIVE_HIGH 0x0
|
||||
#define MG_REG_CTRL_INTR_POLA_ACTIVE_LOW (0x1<<4)
|
||||
#define MG_REG_CTRL_DPD_POLA_ACTIVE_LOW 0x0
|
||||
#define MG_REG_CTRL_DPD_POLA_ACTIVE_HIGH (0x1<<5)
|
||||
#define MG_REG_CTRL_DPD_DISABLE 0x0
|
||||
#define MG_REG_CTRL_DPD_ENABLE (0x1<<6)
|
||||
|
||||
/* Status register bit */
|
||||
/* error bit in status register */
|
||||
#define MG_REG_STATUS_BIT_ERROR 0x01
|
||||
/* corrected error in status register */
|
||||
#define MG_REG_STATUS_BIT_CORRECTED_ERROR 0x04
|
||||
/* data request bit in status register */
|
||||
#define MG_REG_STATUS_BIT_DATA_REQ 0x08
|
||||
/* DSC - Drive Seek Complete */
|
||||
#define MG_REG_STATUS_BIT_SEEK_DONE 0x10
|
||||
/* DWF - Drive Write Fault */
|
||||
#define MG_REG_STATUS_BIT_WRITE_FAULT 0x20
|
||||
#define MG_REG_STATUS_BIT_READY 0x40
|
||||
#define MG_REG_STATUS_BIT_BUSY 0x80
|
||||
|
||||
/* handy status */
|
||||
#define MG_STAT_READY (MG_REG_STATUS_BIT_READY | MG_REG_STATUS_BIT_SEEK_DONE)
|
||||
#define MG_READY_OK(s) (((s) & (MG_STAT_READY | \
|
||||
(MG_REG_STATUS_BIT_BUSY | \
|
||||
MG_REG_STATUS_BIT_WRITE_FAULT | \
|
||||
MG_REG_STATUS_BIT_ERROR))) == MG_STAT_READY)
|
||||
|
||||
/* Error register */
|
||||
#define MG_REG_ERR_AMNF 0x01
|
||||
#define MG_REG_ERR_ABRT 0x04
|
||||
#define MG_REG_ERR_IDNF 0x10
|
||||
#define MG_REG_ERR_UNC 0x40
|
||||
#define MG_REG_ERR_BBK 0x80
|
||||
|
||||
/* error code for others */
|
||||
#define MG_ERR_NONE 0
|
||||
#define MG_ERR_TIMEOUT 0x100
|
||||
#define MG_ERR_INIT_STAT 0x101
|
||||
#define MG_ERR_TRANSLATION 0x102
|
||||
#define MG_ERR_CTRL_RST 0x103
|
||||
#define MG_ERR_INV_STAT 0x104
|
||||
#define MG_ERR_RSTOUT 0x105
|
||||
|
||||
#define MG_MAX_ERRORS 6 /* Max read/write errors */
|
||||
|
||||
/* command */
|
||||
#define MG_CMD_RD 0x20
|
||||
#define MG_CMD_WR 0x30
|
||||
#define MG_CMD_SLEEP 0x99
|
||||
#define MG_CMD_WAKEUP 0xC3
|
||||
#define MG_CMD_ID 0xEC
|
||||
#define MG_CMD_WR_CONF 0x3C
|
||||
#define MG_CMD_RD_CONF 0x40
|
||||
|
||||
/* operation mode */
|
||||
#define MG_OP_CASCADE (1 << 0)
|
||||
#define MG_OP_CASCADE_SYNC_RD (1 << 1)
|
||||
#define MG_OP_CASCADE_SYNC_WR (1 << 2)
|
||||
#define MG_OP_INTERLEAVE (1 << 3)
|
||||
|
||||
/* synchronous */
|
||||
#define MG_BURST_LAT_4 (3 << 4)
|
||||
#define MG_BURST_LAT_5 (4 << 4)
|
||||
#define MG_BURST_LAT_6 (5 << 4)
|
||||
#define MG_BURST_LAT_7 (6 << 4)
|
||||
#define MG_BURST_LAT_8 (7 << 4)
|
||||
#define MG_BURST_LEN_4 (1 << 1)
|
||||
#define MG_BURST_LEN_8 (2 << 1)
|
||||
#define MG_BURST_LEN_16 (3 << 1)
|
||||
#define MG_BURST_LEN_32 (4 << 1)
|
||||
#define MG_BURST_LEN_CONT (0 << 1)
|
||||
|
||||
/* timeout value (unit: ms) */
|
||||
#define MG_TMAX_CONF_TO_CMD 1
|
||||
#define MG_TMAX_WAIT_RD_DRQ 10
|
||||
#define MG_TMAX_WAIT_WR_DRQ 500
|
||||
#define MG_TMAX_RST_TO_BUSY 10
|
||||
#define MG_TMAX_HDRST_TO_RDY 500
|
||||
#define MG_TMAX_SWRST_TO_RDY 500
|
||||
#define MG_TMAX_RSTOUT 3000
|
||||
|
||||
/* device attribution */
|
||||
/* use mflash as boot device */
|
||||
#define MG_BOOT_DEV (1 << 0)
|
||||
/* use mflash as storage device */
|
||||
#define MG_STORAGE_DEV (1 << 1)
|
||||
/* same as MG_STORAGE_DEV, but bootloader already done reset sequence */
|
||||
#define MG_STORAGE_DEV_SKIP_RST (1 << 2)
|
||||
|
||||
#define MG_DEV_MASK (MG_BOOT_DEV | MG_STORAGE_DEV | MG_STORAGE_DEV_SKIP_RST)
|
||||
|
||||
/* names of GPIO resource */
|
||||
#define MG_RST_PIN "mg_rst"
|
||||
/* except MG_BOOT_DEV, reset-out pin should be assigned */
|
||||
#define MG_RSTOUT_PIN "mg_rstout"
|
||||
|
||||
/* private driver data */
|
||||
struct mg_drv_data {
|
||||
/* disk resource */
|
||||
u32 use_polling;
|
||||
|
||||
/* device attribution */
|
||||
u32 dev_attr;
|
||||
|
||||
/* internally used */
|
||||
struct mg_host *host;
|
||||
};
|
||||
|
||||
/* main structure for mflash driver */
|
||||
struct mg_host {
|
||||
struct device *dev;
|
||||
|
||||
struct request_queue *breq;
|
||||
spinlock_t lock;
|
||||
struct gendisk *gd;
|
||||
|
||||
struct timer_list timer;
|
||||
void (*mg_do_intr) (struct mg_host *);
|
||||
|
||||
u16 id[ATA_ID_WORDS];
|
||||
|
||||
u16 cyls;
|
||||
u16 heads;
|
||||
u16 sectors;
|
||||
u32 n_sectors;
|
||||
u32 nres_sectors;
|
||||
|
||||
void __iomem *dev_base;
|
||||
unsigned int irq;
|
||||
unsigned int rst;
|
||||
unsigned int rstout;
|
||||
|
||||
u32 major;
|
||||
u32 error;
|
||||
};
|
||||
|
||||
/*
|
||||
* Debugging macro and defines
|
||||
*/
|
||||
#undef DO_MG_DEBUG
|
||||
#ifdef DO_MG_DEBUG
|
||||
# define MG_DBG(fmt, args...) \
|
||||
printk(KERN_DEBUG "%s:%d "fmt, __func__, __LINE__, ##args)
|
||||
#else /* CONFIG_MG_DEBUG */
|
||||
# define MG_DBG(fmt, args...) do { } while (0)
|
||||
#endif /* CONFIG_MG_DEBUG */
|
||||
|
||||
#endif
|
@@ -12,21 +12,18 @@
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#include <linux/mm.h>
|
||||
#include <linux/percpu_counter.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
|
||||
extern int sysctl_overcommit_memory;
|
||||
extern int sysctl_overcommit_ratio;
|
||||
extern atomic_long_t vm_committed_space;
|
||||
extern struct percpu_counter vm_committed_as;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
extern void vm_acct_memory(long pages);
|
||||
#else
|
||||
static inline void vm_acct_memory(long pages)
|
||||
{
|
||||
atomic_long_add(pages, &vm_committed_space);
|
||||
percpu_counter_add(&vm_committed_as, pages);
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void vm_unacct_memory(long pages)
|
||||
{
|
||||
|
@@ -764,12 +764,6 @@ extern int numa_zonelist_order_handler(struct ctl_table *, int,
|
||||
extern char numa_zonelist_order[];
|
||||
#define NUMA_ZONELIST_ORDER_LEN 16 /* string buffer size */
|
||||
|
||||
#include <linux/topology.h>
|
||||
/* Returns the number of the current Node. */
|
||||
#ifndef numa_node_id
|
||||
#define numa_node_id() (cpu_to_node(raw_smp_processor_id()))
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_NEED_MULTIPLE_NODES
|
||||
|
||||
extern struct pglist_data contig_page_data;
|
||||
|
@@ -248,6 +248,10 @@ struct module
|
||||
const unsigned long *crcs;
|
||||
unsigned int num_syms;
|
||||
|
||||
/* Kernel parameters. */
|
||||
struct kernel_param *kp;
|
||||
unsigned int num_kp;
|
||||
|
||||
/* GPL-only exported symbols. */
|
||||
unsigned int num_gpl_syms;
|
||||
const struct kernel_symbol *gpl_syms;
|
||||
@@ -329,6 +333,11 @@ struct module
|
||||
unsigned int num_tracepoints;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_TRACING
|
||||
const char **trace_bprintk_fmt_start;
|
||||
unsigned int num_trace_bprintk_fmt;
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MODULE_UNLOAD
|
||||
/* What modules depend on me? */
|
||||
struct list_head modules_which_use_me;
|
||||
@@ -350,6 +359,8 @@ struct module
|
||||
#define MODULE_ARCH_INIT {}
|
||||
#endif
|
||||
|
||||
extern struct mutex module_mutex;
|
||||
|
||||
/* FIXME: It'd be nice to isolate modules during init, too, so they
|
||||
aren't used before they (may) fail. But presently too much code
|
||||
(IDE & SCSI) require entry into the module during init.*/
|
||||
@@ -358,10 +369,10 @@ static inline int module_is_live(struct module *mod)
|
||||
return mod->state != MODULE_STATE_GOING;
|
||||
}
|
||||
|
||||
/* Is this address in a module? (second is with no locks, for oops) */
|
||||
struct module *module_text_address(unsigned long addr);
|
||||
struct module *__module_text_address(unsigned long addr);
|
||||
int is_module_address(unsigned long addr);
|
||||
struct module *__module_address(unsigned long addr);
|
||||
bool is_module_address(unsigned long addr);
|
||||
bool is_module_text_address(unsigned long addr);
|
||||
|
||||
static inline int within_module_core(unsigned long addr, struct module *mod)
|
||||
{
|
||||
@@ -375,6 +386,31 @@ static inline int within_module_init(unsigned long addr, struct module *mod)
|
||||
addr < (unsigned long)mod->module_init + mod->init_size;
|
||||
}
|
||||
|
||||
/* Search for module by name: must hold module_mutex. */
|
||||
struct module *find_module(const char *name);
|
||||
|
||||
struct symsearch {
|
||||
const struct kernel_symbol *start, *stop;
|
||||
const unsigned long *crcs;
|
||||
enum {
|
||||
NOT_GPL_ONLY,
|
||||
GPL_ONLY,
|
||||
WILL_BE_GPL_ONLY,
|
||||
} licence;
|
||||
bool unused;
|
||||
};
|
||||
|
||||
/* Search for an exported symbol by name. */
|
||||
const struct kernel_symbol *find_symbol(const char *name,
|
||||
struct module **owner,
|
||||
const unsigned long **crc,
|
||||
bool gplok,
|
||||
bool warn);
|
||||
|
||||
/* Walk the exported symbol table */
|
||||
bool each_symbol(bool (*fn)(const struct symsearch *arr, struct module *owner,
|
||||
unsigned int symnum, void *data), void *data);
|
||||
|
||||
/* Returns 0 and fills in value, defined and namebuf, or -ERANGE if
|
||||
symnum out of range. */
|
||||
int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
|
||||
@@ -383,6 +419,10 @@ int module_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
|
||||
/* Look for this name: can be of form module:name. */
|
||||
unsigned long module_kallsyms_lookup_name(const char *name);
|
||||
|
||||
int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
|
||||
struct module *, unsigned long),
|
||||
void *data);
|
||||
|
||||
extern void __module_put_and_exit(struct module *mod, long code)
|
||||
__attribute__((noreturn));
|
||||
#define module_put_and_exit(code) __module_put_and_exit(THIS_MODULE, code);
|
||||
@@ -444,6 +484,7 @@ static inline void __module_get(struct module *module)
|
||||
#define symbol_put_addr(p) do { } while(0)
|
||||
|
||||
#endif /* CONFIG_MODULE_UNLOAD */
|
||||
int use_module(struct module *a, struct module *b);
|
||||
|
||||
/* This is a #define so the string doesn't get put in every .o file */
|
||||
#define module_name(mod) \
|
||||
@@ -490,21 +531,24 @@ search_module_extables(unsigned long addr)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Is this address in a module? */
|
||||
static inline struct module *module_text_address(unsigned long addr)
|
||||
static inline struct module *__module_address(unsigned long addr)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Is this address in a module? (don't take a lock, we're oopsing) */
|
||||
static inline struct module *__module_text_address(unsigned long addr)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int is_module_address(unsigned long addr)
|
||||
static inline bool is_module_address(unsigned long addr)
|
||||
{
|
||||
return 0;
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool is_module_text_address(unsigned long addr)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get/put a kernel symbol (calls should be symmetric) */
|
||||
@@ -559,6 +603,14 @@ static inline unsigned long module_kallsyms_lookup_name(const char *name)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int module_kallsyms_on_each_symbol(int (*fn)(void *, const char *,
|
||||
struct module *,
|
||||
unsigned long),
|
||||
void *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int register_module_notifier(struct notifier_block * nb)
|
||||
{
|
||||
/* no events will happen anyway, so this can always succeed */
|
||||
|
@@ -138,6 +138,16 @@ extern int parse_args(const char *name,
|
||||
unsigned num,
|
||||
int (*unknown)(char *param, char *val));
|
||||
|
||||
/* Called by module remove. */
|
||||
#ifdef CONFIG_SYSFS
|
||||
extern void destroy_params(const struct kernel_param *params, unsigned num);
|
||||
#else
|
||||
static inline void destroy_params(const struct kernel_param *params,
|
||||
unsigned num)
|
||||
{
|
||||
}
|
||||
#endif /* !CONFIG_SYSFS */
|
||||
|
||||
/* All the helper functions */
|
||||
/* The macros to do compile-time type checking stolen from Jakub
|
||||
Jelinek, who IIRC came up with this idea for the 2.4 module init code. */
|
||||
|
@@ -11,6 +11,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <linux/mtd/compatmac.h>
|
||||
#include <mtd/mtd-abi.h>
|
||||
@@ -162,6 +163,20 @@ struct mtd_info {
|
||||
/* We probably shouldn't allow XIP if the unpoint isn't a NULL */
|
||||
void (*unpoint) (struct mtd_info *mtd, loff_t from, size_t len);
|
||||
|
||||
/* Allow NOMMU mmap() to directly map the device (if not NULL)
|
||||
* - return the address to which the offset maps
|
||||
* - return -ENOSYS to indicate refusal to do the mapping
|
||||
*/
|
||||
unsigned long (*get_unmapped_area) (struct mtd_info *mtd,
|
||||
unsigned long len,
|
||||
unsigned long offset,
|
||||
unsigned long flags);
|
||||
|
||||
/* Backing device capabilities for this device
|
||||
* - provides mmap capabilities
|
||||
*/
|
||||
struct backing_dev_info *backing_dev_info;
|
||||
|
||||
|
||||
int (*read) (struct mtd_info *mtd, loff_t from, size_t len, size_t *retlen, u_char *buf);
|
||||
int (*write) (struct mtd_info *mtd, loff_t to, size_t len, size_t *retlen, const u_char *buf);
|
||||
@@ -223,6 +238,7 @@ struct mtd_info {
|
||||
void *priv;
|
||||
|
||||
struct module *owner;
|
||||
struct device dev;
|
||||
int usecount;
|
||||
|
||||
/* If the driver is something smart, like UBI, it may need to maintain
|
||||
@@ -233,6 +249,11 @@ struct mtd_info {
|
||||
void (*put_device) (struct mtd_info *mtd);
|
||||
};
|
||||
|
||||
static inline struct mtd_info *dev_to_mtd(struct device *dev)
|
||||
{
|
||||
return dev ? container_of(dev, struct mtd_info, dev) : NULL;
|
||||
}
|
||||
|
||||
static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd)
|
||||
{
|
||||
if (mtd->erasesize_shift)
|
||||
|
@@ -43,8 +43,8 @@ extern void nand_wait_ready(struct mtd_info *mtd);
|
||||
* is supported now. If you add a chip with bigger oobsize/page
|
||||
* adjust this accordingly.
|
||||
*/
|
||||
#define NAND_MAX_OOBSIZE 64
|
||||
#define NAND_MAX_PAGESIZE 2048
|
||||
#define NAND_MAX_OOBSIZE 128
|
||||
#define NAND_MAX_PAGESIZE 4096
|
||||
|
||||
/*
|
||||
* Constants for hardware specific CLE/ALE/NCE function
|
||||
|
@@ -76,4 +76,16 @@ int __devinit of_mtd_parse_partitions(struct device *dev,
|
||||
struct device_node *node,
|
||||
struct mtd_partition **pparts);
|
||||
|
||||
#ifdef CONFIG_MTD_PARTITIONS
|
||||
static inline int mtd_has_partitions(void) { return 1; }
|
||||
#else
|
||||
static inline int mtd_has_partitions(void) { return 0; }
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MTD_CMDLINE_PARTS
|
||||
static inline int mtd_has_cmdlinepart(void) { return 1; }
|
||||
#else
|
||||
static inline int mtd_has_cmdlinepart(void) { return 0; }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@@ -69,7 +69,6 @@ extern int path_lookup(const char *, unsigned, struct nameidata *);
|
||||
extern int vfs_path_lookup(struct dentry *, struct vfsmount *,
|
||||
const char *, unsigned int, struct nameidata *);
|
||||
|
||||
extern int path_lookup_open(int dfd, const char *name, unsigned lookup_flags, struct nameidata *, int open_flags);
|
||||
extern struct file *lookup_instantiate_filp(struct nameidata *nd, struct dentry *dentry,
|
||||
int (*open)(struct inode *, struct file *));
|
||||
extern struct file *nameidata_to_filp(struct nameidata *nd, int flags);
|
||||
|
@@ -104,7 +104,7 @@ struct wireless_dev;
|
||||
# else
|
||||
# define LL_MAX_HEADER 96
|
||||
# endif
|
||||
#elif defined(CONFIG_TR)
|
||||
#elif defined(CONFIG_TR) || defined(CONFIG_TR_MODULE)
|
||||
# define LL_MAX_HEADER 48
|
||||
#else
|
||||
# define LL_MAX_HEADER 32
|
||||
@@ -500,7 +500,7 @@ struct netdev_queue {
|
||||
*
|
||||
* int (*ndo_set_mac_address)(struct net_device *dev, void *addr);
|
||||
* This function is called when the Media Access Control address
|
||||
* needs to be changed. If not this interface is not defined, the
|
||||
* needs to be changed. If this interface is not defined, the
|
||||
* mac address can not be changed.
|
||||
*
|
||||
* int (*ndo_validate_addr)(struct net_device *dev);
|
||||
|
@@ -100,6 +100,7 @@ enum ctattr_protoinfo_tcp {
|
||||
enum ctattr_protoinfo_dccp {
|
||||
CTA_PROTOINFO_DCCP_UNSPEC,
|
||||
CTA_PROTOINFO_DCCP_STATE,
|
||||
CTA_PROTOINFO_DCCP_ROLE,
|
||||
__CTA_PROTOINFO_DCCP_MAX,
|
||||
};
|
||||
#define CTA_PROTOINFO_DCCP_MAX (__CTA_PROTOINFO_DCCP_MAX - 1)
|
||||
|
@@ -354,9 +354,6 @@ struct xt_table
|
||||
/* What hooks you will enter on */
|
||||
unsigned int valid_hooks;
|
||||
|
||||
/* Lock for the curtain */
|
||||
struct mutex lock;
|
||||
|
||||
/* Man behind the curtain... */
|
||||
struct xt_table_info *private;
|
||||
|
||||
@@ -434,8 +431,74 @@ extern void xt_proto_fini(struct net *net, u_int8_t af);
|
||||
|
||||
extern struct xt_table_info *xt_alloc_table_info(unsigned int size);
|
||||
extern void xt_free_table_info(struct xt_table_info *info);
|
||||
extern void xt_table_entry_swap_rcu(struct xt_table_info *old,
|
||||
struct xt_table_info *new);
|
||||
|
||||
/*
|
||||
* Per-CPU spinlock associated with per-cpu table entries, and
|
||||
* with a counter for the "reading" side that allows a recursive
|
||||
* reader to avoid taking the lock and deadlocking.
|
||||
*
|
||||
* "reading" is used by ip/arp/ip6 tables rule processing which runs per-cpu.
|
||||
* It needs to ensure that the rules are not being changed while the packet
|
||||
* is being processed. In some cases, the read lock will be acquired
|
||||
* twice on the same CPU; this is okay because of the count.
|
||||
*
|
||||
* "writing" is used when reading counters.
|
||||
* During replace any readers that are using the old tables have to complete
|
||||
* before freeing the old table. This is handled by the write locking
|
||||
* necessary for reading the counters.
|
||||
*/
|
||||
struct xt_info_lock {
|
||||
spinlock_t lock;
|
||||
unsigned char readers;
|
||||
};
|
||||
DECLARE_PER_CPU(struct xt_info_lock, xt_info_locks);
|
||||
|
||||
/*
|
||||
* Note: we need to ensure that preemption is disabled before acquiring
|
||||
* the per-cpu-variable, so we do it as a two step process rather than
|
||||
* using "spin_lock_bh()".
|
||||
*
|
||||
* We _also_ need to disable bottom half processing before updating our
|
||||
* nesting count, to make sure that the only kind of re-entrancy is this
|
||||
* code being called by itself: since the count+lock is not an atomic
|
||||
* operation, we can allow no races.
|
||||
*
|
||||
* _Only_ that special combination of being per-cpu and never getting
|
||||
* re-entered asynchronously means that the count is safe.
|
||||
*/
|
||||
static inline void xt_info_rdlock_bh(void)
|
||||
{
|
||||
struct xt_info_lock *lock;
|
||||
|
||||
local_bh_disable();
|
||||
lock = &__get_cpu_var(xt_info_locks);
|
||||
if (likely(!lock->readers++))
|
||||
spin_lock(&lock->lock);
|
||||
}
|
||||
|
||||
static inline void xt_info_rdunlock_bh(void)
|
||||
{
|
||||
struct xt_info_lock *lock = &__get_cpu_var(xt_info_locks);
|
||||
|
||||
if (likely(!--lock->readers))
|
||||
spin_unlock(&lock->lock);
|
||||
local_bh_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
* The "writer" side needs to get exclusive access to the lock,
|
||||
* regardless of readers. This must be called with bottom half
|
||||
* processing (and thus also preemption) disabled.
|
||||
*/
|
||||
static inline void xt_info_wrlock(unsigned int cpu)
|
||||
{
|
||||
spin_lock(&per_cpu(xt_info_locks, cpu).lock);
|
||||
}
|
||||
|
||||
static inline void xt_info_wrunlock(unsigned int cpu)
|
||||
{
|
||||
spin_unlock(&per_cpu(xt_info_locks, cpu).lock);
|
||||
}
|
||||
|
||||
/*
|
||||
* This helper is performance critical and must be inlined
|
||||
|
@@ -1,6 +1,8 @@
|
||||
#ifndef _XT_LED_H
|
||||
#define _XT_LED_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct xt_led_info {
|
||||
char id[27]; /* Unique ID for this trigger in the LED class */
|
||||
__u8 always_blink; /* Blink even if the LED is already on */
|
||||
|
@@ -12,4 +12,6 @@ struct xt_cluster_match_info {
|
||||
u_int32_t flags;
|
||||
};
|
||||
|
||||
#define XT_CLUSTER_NODES_MAX 32
|
||||
|
||||
#endif /* _XT_CLUSTER_MATCH_H */
|
||||
|
@@ -109,7 +109,6 @@
|
||||
NFSERR_FILE_OPEN = 10046, /* v4 */
|
||||
NFSERR_ADMIN_REVOKED = 10047, /* v4 */
|
||||
NFSERR_CB_PATH_DOWN = 10048, /* v4 */
|
||||
NFSERR_REPLAY_ME = 10049 /* v4 */
|
||||
};
|
||||
|
||||
/* NFSv2 file types - beware, these are not the same in NFSv3 */
|
||||
|
@@ -21,6 +21,7 @@
|
||||
#define NFS4_FHSIZE 128
|
||||
#define NFS4_MAXPATHLEN PATH_MAX
|
||||
#define NFS4_MAXNAMLEN NAME_MAX
|
||||
#define NFS4_MAX_SESSIONID_LEN 16
|
||||
|
||||
#define NFS4_ACCESS_READ 0x0001
|
||||
#define NFS4_ACCESS_LOOKUP 0x0002
|
||||
@@ -38,6 +39,7 @@
|
||||
#define NFS4_OPEN_RESULT_CONFIRM 0x0002
|
||||
#define NFS4_OPEN_RESULT_LOCKTYPE_POSIX 0x0004
|
||||
|
||||
#define NFS4_SHARE_ACCESS_MASK 0x000F
|
||||
#define NFS4_SHARE_ACCESS_READ 0x0001
|
||||
#define NFS4_SHARE_ACCESS_WRITE 0x0002
|
||||
#define NFS4_SHARE_ACCESS_BOTH 0x0003
|
||||
@@ -45,6 +47,19 @@
|
||||
#define NFS4_SHARE_DENY_WRITE 0x0002
|
||||
#define NFS4_SHARE_DENY_BOTH 0x0003
|
||||
|
||||
/* nfs41 */
|
||||
#define NFS4_SHARE_WANT_MASK 0xFF00
|
||||
#define NFS4_SHARE_WANT_NO_PREFERENCE 0x0000
|
||||
#define NFS4_SHARE_WANT_READ_DELEG 0x0100
|
||||
#define NFS4_SHARE_WANT_WRITE_DELEG 0x0200
|
||||
#define NFS4_SHARE_WANT_ANY_DELEG 0x0300
|
||||
#define NFS4_SHARE_WANT_NO_DELEG 0x0400
|
||||
#define NFS4_SHARE_WANT_CANCEL 0x0500
|
||||
|
||||
#define NFS4_SHARE_WHEN_MASK 0xF0000
|
||||
#define NFS4_SHARE_SIGNAL_DELEG_WHEN_RESRC_AVAIL 0x10000
|
||||
#define NFS4_SHARE_PUSH_DELEG_WHEN_UNCONTENDED 0x20000
|
||||
|
||||
#define NFS4_SET_TO_SERVER_TIME 0
|
||||
#define NFS4_SET_TO_CLIENT_TIME 1
|
||||
|
||||
@@ -88,6 +103,31 @@
|
||||
#define NFS4_ACE_GENERIC_EXECUTE 0x001200A0
|
||||
#define NFS4_ACE_MASK_ALL 0x001F01FF
|
||||
|
||||
#define EXCHGID4_FLAG_SUPP_MOVED_REFER 0x00000001
|
||||
#define EXCHGID4_FLAG_SUPP_MOVED_MIGR 0x00000002
|
||||
#define EXCHGID4_FLAG_USE_NON_PNFS 0x00010000
|
||||
#define EXCHGID4_FLAG_USE_PNFS_MDS 0x00020000
|
||||
#define EXCHGID4_FLAG_USE_PNFS_DS 0x00040000
|
||||
#define EXCHGID4_FLAG_UPD_CONFIRMED_REC_A 0x40000000
|
||||
#define EXCHGID4_FLAG_CONFIRMED_R 0x80000000
|
||||
/*
|
||||
* Since the validity of these bits depends on whether
|
||||
* they're set in the argument or response, have separate
|
||||
* invalid flag masks for arg (_A) and resp (_R).
|
||||
*/
|
||||
#define EXCHGID4_FLAG_MASK_A 0x40070003
|
||||
#define EXCHGID4_FLAG_MASK_R 0x80070003
|
||||
|
||||
#define SEQ4_STATUS_CB_PATH_DOWN 0x00000001
|
||||
#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRING 0x00000002
|
||||
#define SEQ4_STATUS_CB_GSS_CONTEXTS_EXPIRED 0x00000004
|
||||
#define SEQ4_STATUS_EXPIRED_ALL_STATE_REVOKED 0x00000008
|
||||
#define SEQ4_STATUS_EXPIRED_SOME_STATE_REVOKED 0x00000010
|
||||
#define SEQ4_STATUS_ADMIN_STATE_REVOKED 0x00000020
|
||||
#define SEQ4_STATUS_RECALLABLE_STATE_REVOKED 0x00000040
|
||||
#define SEQ4_STATUS_LEASE_MOVED 0x00000080
|
||||
#define SEQ4_STATUS_RESTART_RECLAIM_NEEDED 0x00000100
|
||||
|
||||
#define NFS4_MAX_UINT64 (~(u64)0)
|
||||
|
||||
enum nfs4_acl_whotype {
|
||||
@@ -154,6 +194,28 @@ enum nfs_opnum4 {
|
||||
OP_VERIFY = 37,
|
||||
OP_WRITE = 38,
|
||||
OP_RELEASE_LOCKOWNER = 39,
|
||||
|
||||
/* nfs41 */
|
||||
OP_BACKCHANNEL_CTL = 40,
|
||||
OP_BIND_CONN_TO_SESSION = 41,
|
||||
OP_EXCHANGE_ID = 42,
|
||||
OP_CREATE_SESSION = 43,
|
||||
OP_DESTROY_SESSION = 44,
|
||||
OP_FREE_STATEID = 45,
|
||||
OP_GET_DIR_DELEGATION = 46,
|
||||
OP_GETDEVICEINFO = 47,
|
||||
OP_GETDEVICELIST = 48,
|
||||
OP_LAYOUTCOMMIT = 49,
|
||||
OP_LAYOUTGET = 50,
|
||||
OP_LAYOUTRETURN = 51,
|
||||
OP_SECINFO_NO_NAME = 52,
|
||||
OP_SEQUENCE = 53,
|
||||
OP_SET_SSV = 54,
|
||||
OP_TEST_STATEID = 55,
|
||||
OP_WANT_DELEGATION = 56,
|
||||
OP_DESTROY_CLIENTID = 57,
|
||||
OP_RECLAIM_COMPLETE = 58,
|
||||
|
||||
OP_ILLEGAL = 10044,
|
||||
};
|
||||
|
||||
@@ -230,7 +292,48 @@ enum nfsstat4 {
|
||||
NFS4ERR_DEADLOCK = 10045,
|
||||
NFS4ERR_FILE_OPEN = 10046,
|
||||
NFS4ERR_ADMIN_REVOKED = 10047,
|
||||
NFS4ERR_CB_PATH_DOWN = 10048
|
||||
NFS4ERR_CB_PATH_DOWN = 10048,
|
||||
|
||||
/* nfs41 */
|
||||
NFS4ERR_BADIOMODE = 10049,
|
||||
NFS4ERR_BADLAYOUT = 10050,
|
||||
NFS4ERR_BAD_SESSION_DIGEST = 10051,
|
||||
NFS4ERR_BADSESSION = 10052,
|
||||
NFS4ERR_BADSLOT = 10053,
|
||||
NFS4ERR_COMPLETE_ALREADY = 10054,
|
||||
NFS4ERR_CONN_NOT_BOUND_TO_SESSION = 10055,
|
||||
NFS4ERR_DELEG_ALREADY_WANTED = 10056,
|
||||
NFS4ERR_BACK_CHAN_BUSY = 10057, /* backchan reqs outstanding */
|
||||
NFS4ERR_LAYOUTTRYLATER = 10058,
|
||||
NFS4ERR_LAYOUTUNAVAILABLE = 10059,
|
||||
NFS4ERR_NOMATCHING_LAYOUT = 10060,
|
||||
NFS4ERR_RECALLCONFLICT = 10061,
|
||||
NFS4ERR_UNKNOWN_LAYOUTTYPE = 10062,
|
||||
NFS4ERR_SEQ_MISORDERED = 10063, /* unexpected seq.id in req */
|
||||
NFS4ERR_SEQUENCE_POS = 10064, /* [CB_]SEQ. op not 1st op */
|
||||
NFS4ERR_REQ_TOO_BIG = 10065, /* request too big */
|
||||
NFS4ERR_REP_TOO_BIG = 10066, /* reply too big */
|
||||
NFS4ERR_REP_TOO_BIG_TO_CACHE = 10067, /* rep. not all cached */
|
||||
NFS4ERR_RETRY_UNCACHED_REP = 10068, /* retry & rep. uncached */
|
||||
NFS4ERR_UNSAFE_COMPOUND = 10069, /* retry/recovery too hard */
|
||||
NFS4ERR_TOO_MANY_OPS = 10070, /* too many ops in [CB_]COMP */
|
||||
NFS4ERR_OP_NOT_IN_SESSION = 10071, /* op needs [CB_]SEQ. op */
|
||||
NFS4ERR_HASH_ALG_UNSUPP = 10072, /* hash alg. not supp. */
|
||||
/* Error 10073 is unused. */
|
||||
NFS4ERR_CLIENTID_BUSY = 10074, /* clientid has state */
|
||||
NFS4ERR_PNFS_IO_HOLE = 10075, /* IO to _SPARSE file hole */
|
||||
NFS4ERR_SEQ_FALSE_RETRY = 10076, /* retry not origional */
|
||||
NFS4ERR_BAD_HIGH_SLOT = 10077, /* sequence arg bad */
|
||||
NFS4ERR_DEADSESSION = 10078, /* persistent session dead */
|
||||
NFS4ERR_ENCR_ALG_UNSUPP = 10079, /* SSV alg mismatch */
|
||||
NFS4ERR_PNFS_NO_LAYOUT = 10080, /* direct I/O with no layout */
|
||||
NFS4ERR_NOT_ONLY_OP = 10081, /* bad compound */
|
||||
NFS4ERR_WRONG_CRED = 10082, /* permissions:state change */
|
||||
NFS4ERR_WRONG_TYPE = 10083, /* current operation mismatch */
|
||||
NFS4ERR_DIRDELEG_UNAVAIL = 10084, /* no directory delegation */
|
||||
NFS4ERR_REJECT_DELEG = 10085, /* on callback */
|
||||
NFS4ERR_RETURNCONFLICT = 10086, /* outstanding layoutreturn */
|
||||
NFS4ERR_DELEG_REVOKED = 10087, /* deleg./layout revoked */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -265,7 +368,13 @@ enum opentype4 {
|
||||
enum createmode4 {
|
||||
NFS4_CREATE_UNCHECKED = 0,
|
||||
NFS4_CREATE_GUARDED = 1,
|
||||
NFS4_CREATE_EXCLUSIVE = 2
|
||||
NFS4_CREATE_EXCLUSIVE = 2,
|
||||
/*
|
||||
* New to NFSv4.1. If session is persistent,
|
||||
* GUARDED4 MUST be used. Otherwise, use
|
||||
* EXCLUSIVE4_1 instead of EXCLUSIVE4.
|
||||
*/
|
||||
NFS4_CREATE_EXCLUSIVE4_1 = 3
|
||||
};
|
||||
|
||||
enum limit_by4 {
|
||||
@@ -301,6 +410,8 @@ enum lock_type4 {
|
||||
#define FATTR4_WORD0_UNIQUE_HANDLES (1UL << 9)
|
||||
#define FATTR4_WORD0_LEASE_TIME (1UL << 10)
|
||||
#define FATTR4_WORD0_RDATTR_ERROR (1UL << 11)
|
||||
/* Mandatory in NFSv4.1 */
|
||||
#define FATTR4_WORD2_SUPPATTR_EXCLCREAT (1UL << 11)
|
||||
|
||||
/* Recommended Attributes */
|
||||
#define FATTR4_WORD0_ACL (1UL << 12)
|
||||
@@ -391,6 +502,29 @@ enum {
|
||||
NFSPROC4_CLNT_GETACL,
|
||||
NFSPROC4_CLNT_SETACL,
|
||||
NFSPROC4_CLNT_FS_LOCATIONS,
|
||||
|
||||
/* nfs41 */
|
||||
NFSPROC4_CLNT_EXCHANGE_ID,
|
||||
NFSPROC4_CLNT_CREATE_SESSION,
|
||||
NFSPROC4_CLNT_DESTROY_SESSION,
|
||||
NFSPROC4_CLNT_SEQUENCE,
|
||||
NFSPROC4_CLNT_GET_LEASE_TIME,
|
||||
};
|
||||
|
||||
/* nfs41 types */
|
||||
struct nfs4_sessionid {
|
||||
unsigned char data[NFS4_MAX_SESSIONID_LEN];
|
||||
};
|
||||
|
||||
/* Create Session Flags */
|
||||
#define SESSION4_PERSIST 0x001
|
||||
#define SESSION4_BACK_CHAN 0x002
|
||||
#define SESSION4_RDMA 0x004
|
||||
|
||||
enum state_protect_how4 {
|
||||
SP4_NONE = 0,
|
||||
SP4_MACH_CRED = 1,
|
||||
SP4_SSV = 2
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@@ -76,4 +76,12 @@ void nfsd_reply_cache_shutdown(void);
|
||||
int nfsd_cache_lookup(struct svc_rqst *, int);
|
||||
void nfsd_cache_update(struct svc_rqst *, int, __be32 *);
|
||||
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp);
|
||||
#else /* CONFIG_NFSD_V4 */
|
||||
static inline void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_NFSD_V4 */
|
||||
|
||||
#endif /* NFSCACHE_H */
|
||||
|
@@ -23,7 +23,7 @@
|
||||
/*
|
||||
* nfsd version
|
||||
*/
|
||||
#define NFSD_SUPPORTED_MINOR_VERSION 0
|
||||
#define NFSD_SUPPORTED_MINOR_VERSION 1
|
||||
|
||||
/*
|
||||
* Flags for nfsd_permission
|
||||
@@ -53,6 +53,7 @@ typedef int (*nfsd_dirop_t)(struct inode *, struct dentry *, int, int);
|
||||
extern struct svc_program nfsd_program;
|
||||
extern struct svc_version nfsd_version2, nfsd_version3,
|
||||
nfsd_version4;
|
||||
extern u32 nfsd_supported_minorversion;
|
||||
extern struct mutex nfsd_mutex;
|
||||
extern struct svc_serv *nfsd_serv;
|
||||
|
||||
@@ -105,7 +106,7 @@ void nfsd_close(struct file *);
|
||||
__be32 nfsd_read(struct svc_rqst *, struct svc_fh *, struct file *,
|
||||
loff_t, struct kvec *, int, unsigned long *);
|
||||
__be32 nfsd_write(struct svc_rqst *, struct svc_fh *,struct file *,
|
||||
loff_t, struct kvec *,int, unsigned long, int *);
|
||||
loff_t, struct kvec *,int, unsigned long *, int *);
|
||||
__be32 nfsd_readlink(struct svc_rqst *, struct svc_fh *,
|
||||
char *, int *);
|
||||
__be32 nfsd_symlink(struct svc_rqst *, struct svc_fh *,
|
||||
@@ -149,6 +150,7 @@ int nfsd_set_posix_acl(struct svc_fh *, int, struct posix_acl *);
|
||||
|
||||
enum vers_op {NFSD_SET, NFSD_CLEAR, NFSD_TEST, NFSD_AVAIL };
|
||||
int nfsd_vers(int vers, enum vers_op change);
|
||||
int nfsd_minorversion(u32 minorversion, enum vers_op change);
|
||||
void nfsd_reset_versions(void);
|
||||
int nfsd_create_serv(void);
|
||||
|
||||
@@ -186,78 +188,119 @@ void nfsd_lockd_shutdown(void);
|
||||
/*
|
||||
* These macros provide pre-xdr'ed values for faster operation.
|
||||
*/
|
||||
#define nfs_ok __constant_htonl(NFS_OK)
|
||||
#define nfserr_perm __constant_htonl(NFSERR_PERM)
|
||||
#define nfserr_noent __constant_htonl(NFSERR_NOENT)
|
||||
#define nfserr_io __constant_htonl(NFSERR_IO)
|
||||
#define nfserr_nxio __constant_htonl(NFSERR_NXIO)
|
||||
#define nfserr_eagain __constant_htonl(NFSERR_EAGAIN)
|
||||
#define nfserr_acces __constant_htonl(NFSERR_ACCES)
|
||||
#define nfserr_exist __constant_htonl(NFSERR_EXIST)
|
||||
#define nfserr_xdev __constant_htonl(NFSERR_XDEV)
|
||||
#define nfserr_nodev __constant_htonl(NFSERR_NODEV)
|
||||
#define nfserr_notdir __constant_htonl(NFSERR_NOTDIR)
|
||||
#define nfserr_isdir __constant_htonl(NFSERR_ISDIR)
|
||||
#define nfserr_inval __constant_htonl(NFSERR_INVAL)
|
||||
#define nfserr_fbig __constant_htonl(NFSERR_FBIG)
|
||||
#define nfserr_nospc __constant_htonl(NFSERR_NOSPC)
|
||||
#define nfserr_rofs __constant_htonl(NFSERR_ROFS)
|
||||
#define nfserr_mlink __constant_htonl(NFSERR_MLINK)
|
||||
#define nfserr_opnotsupp __constant_htonl(NFSERR_OPNOTSUPP)
|
||||
#define nfserr_nametoolong __constant_htonl(NFSERR_NAMETOOLONG)
|
||||
#define nfserr_notempty __constant_htonl(NFSERR_NOTEMPTY)
|
||||
#define nfserr_dquot __constant_htonl(NFSERR_DQUOT)
|
||||
#define nfserr_stale __constant_htonl(NFSERR_STALE)
|
||||
#define nfserr_remote __constant_htonl(NFSERR_REMOTE)
|
||||
#define nfserr_wflush __constant_htonl(NFSERR_WFLUSH)
|
||||
#define nfserr_badhandle __constant_htonl(NFSERR_BADHANDLE)
|
||||
#define nfserr_notsync __constant_htonl(NFSERR_NOT_SYNC)
|
||||
#define nfserr_badcookie __constant_htonl(NFSERR_BAD_COOKIE)
|
||||
#define nfserr_notsupp __constant_htonl(NFSERR_NOTSUPP)
|
||||
#define nfserr_toosmall __constant_htonl(NFSERR_TOOSMALL)
|
||||
#define nfserr_serverfault __constant_htonl(NFSERR_SERVERFAULT)
|
||||
#define nfserr_badtype __constant_htonl(NFSERR_BADTYPE)
|
||||
#define nfserr_jukebox __constant_htonl(NFSERR_JUKEBOX)
|
||||
#define nfserr_denied __constant_htonl(NFSERR_DENIED)
|
||||
#define nfserr_deadlock __constant_htonl(NFSERR_DEADLOCK)
|
||||
#define nfserr_expired __constant_htonl(NFSERR_EXPIRED)
|
||||
#define nfserr_bad_cookie __constant_htonl(NFSERR_BAD_COOKIE)
|
||||
#define nfserr_same __constant_htonl(NFSERR_SAME)
|
||||
#define nfserr_clid_inuse __constant_htonl(NFSERR_CLID_INUSE)
|
||||
#define nfserr_stale_clientid __constant_htonl(NFSERR_STALE_CLIENTID)
|
||||
#define nfserr_resource __constant_htonl(NFSERR_RESOURCE)
|
||||
#define nfserr_moved __constant_htonl(NFSERR_MOVED)
|
||||
#define nfserr_nofilehandle __constant_htonl(NFSERR_NOFILEHANDLE)
|
||||
#define nfserr_minor_vers_mismatch __constant_htonl(NFSERR_MINOR_VERS_MISMATCH)
|
||||
#define nfserr_share_denied __constant_htonl(NFSERR_SHARE_DENIED)
|
||||
#define nfserr_stale_stateid __constant_htonl(NFSERR_STALE_STATEID)
|
||||
#define nfserr_old_stateid __constant_htonl(NFSERR_OLD_STATEID)
|
||||
#define nfserr_bad_stateid __constant_htonl(NFSERR_BAD_STATEID)
|
||||
#define nfserr_bad_seqid __constant_htonl(NFSERR_BAD_SEQID)
|
||||
#define nfserr_symlink __constant_htonl(NFSERR_SYMLINK)
|
||||
#define nfserr_not_same __constant_htonl(NFSERR_NOT_SAME)
|
||||
#define nfserr_restorefh __constant_htonl(NFSERR_RESTOREFH)
|
||||
#define nfserr_attrnotsupp __constant_htonl(NFSERR_ATTRNOTSUPP)
|
||||
#define nfserr_bad_xdr __constant_htonl(NFSERR_BAD_XDR)
|
||||
#define nfserr_openmode __constant_htonl(NFSERR_OPENMODE)
|
||||
#define nfserr_locks_held __constant_htonl(NFSERR_LOCKS_HELD)
|
||||
#define nfserr_op_illegal __constant_htonl(NFSERR_OP_ILLEGAL)
|
||||
#define nfserr_grace __constant_htonl(NFSERR_GRACE)
|
||||
#define nfserr_no_grace __constant_htonl(NFSERR_NO_GRACE)
|
||||
#define nfserr_reclaim_bad __constant_htonl(NFSERR_RECLAIM_BAD)
|
||||
#define nfserr_badname __constant_htonl(NFSERR_BADNAME)
|
||||
#define nfserr_cb_path_down __constant_htonl(NFSERR_CB_PATH_DOWN)
|
||||
#define nfserr_locked __constant_htonl(NFSERR_LOCKED)
|
||||
#define nfserr_wrongsec __constant_htonl(NFSERR_WRONGSEC)
|
||||
#define nfserr_replay_me __constant_htonl(NFSERR_REPLAY_ME)
|
||||
#define nfs_ok cpu_to_be32(NFS_OK)
|
||||
#define nfserr_perm cpu_to_be32(NFSERR_PERM)
|
||||
#define nfserr_noent cpu_to_be32(NFSERR_NOENT)
|
||||
#define nfserr_io cpu_to_be32(NFSERR_IO)
|
||||
#define nfserr_nxio cpu_to_be32(NFSERR_NXIO)
|
||||
#define nfserr_eagain cpu_to_be32(NFSERR_EAGAIN)
|
||||
#define nfserr_acces cpu_to_be32(NFSERR_ACCES)
|
||||
#define nfserr_exist cpu_to_be32(NFSERR_EXIST)
|
||||
#define nfserr_xdev cpu_to_be32(NFSERR_XDEV)
|
||||
#define nfserr_nodev cpu_to_be32(NFSERR_NODEV)
|
||||
#define nfserr_notdir cpu_to_be32(NFSERR_NOTDIR)
|
||||
#define nfserr_isdir cpu_to_be32(NFSERR_ISDIR)
|
||||
#define nfserr_inval cpu_to_be32(NFSERR_INVAL)
|
||||
#define nfserr_fbig cpu_to_be32(NFSERR_FBIG)
|
||||
#define nfserr_nospc cpu_to_be32(NFSERR_NOSPC)
|
||||
#define nfserr_rofs cpu_to_be32(NFSERR_ROFS)
|
||||
#define nfserr_mlink cpu_to_be32(NFSERR_MLINK)
|
||||
#define nfserr_opnotsupp cpu_to_be32(NFSERR_OPNOTSUPP)
|
||||
#define nfserr_nametoolong cpu_to_be32(NFSERR_NAMETOOLONG)
|
||||
#define nfserr_notempty cpu_to_be32(NFSERR_NOTEMPTY)
|
||||
#define nfserr_dquot cpu_to_be32(NFSERR_DQUOT)
|
||||
#define nfserr_stale cpu_to_be32(NFSERR_STALE)
|
||||
#define nfserr_remote cpu_to_be32(NFSERR_REMOTE)
|
||||
#define nfserr_wflush cpu_to_be32(NFSERR_WFLUSH)
|
||||
#define nfserr_badhandle cpu_to_be32(NFSERR_BADHANDLE)
|
||||
#define nfserr_notsync cpu_to_be32(NFSERR_NOT_SYNC)
|
||||
#define nfserr_badcookie cpu_to_be32(NFSERR_BAD_COOKIE)
|
||||
#define nfserr_notsupp cpu_to_be32(NFSERR_NOTSUPP)
|
||||
#define nfserr_toosmall cpu_to_be32(NFSERR_TOOSMALL)
|
||||
#define nfserr_serverfault cpu_to_be32(NFSERR_SERVERFAULT)
|
||||
#define nfserr_badtype cpu_to_be32(NFSERR_BADTYPE)
|
||||
#define nfserr_jukebox cpu_to_be32(NFSERR_JUKEBOX)
|
||||
#define nfserr_denied cpu_to_be32(NFSERR_DENIED)
|
||||
#define nfserr_deadlock cpu_to_be32(NFSERR_DEADLOCK)
|
||||
#define nfserr_expired cpu_to_be32(NFSERR_EXPIRED)
|
||||
#define nfserr_bad_cookie cpu_to_be32(NFSERR_BAD_COOKIE)
|
||||
#define nfserr_same cpu_to_be32(NFSERR_SAME)
|
||||
#define nfserr_clid_inuse cpu_to_be32(NFSERR_CLID_INUSE)
|
||||
#define nfserr_stale_clientid cpu_to_be32(NFSERR_STALE_CLIENTID)
|
||||
#define nfserr_resource cpu_to_be32(NFSERR_RESOURCE)
|
||||
#define nfserr_moved cpu_to_be32(NFSERR_MOVED)
|
||||
#define nfserr_nofilehandle cpu_to_be32(NFSERR_NOFILEHANDLE)
|
||||
#define nfserr_minor_vers_mismatch cpu_to_be32(NFSERR_MINOR_VERS_MISMATCH)
|
||||
#define nfserr_share_denied cpu_to_be32(NFSERR_SHARE_DENIED)
|
||||
#define nfserr_stale_stateid cpu_to_be32(NFSERR_STALE_STATEID)
|
||||
#define nfserr_old_stateid cpu_to_be32(NFSERR_OLD_STATEID)
|
||||
#define nfserr_bad_stateid cpu_to_be32(NFSERR_BAD_STATEID)
|
||||
#define nfserr_bad_seqid cpu_to_be32(NFSERR_BAD_SEQID)
|
||||
#define nfserr_symlink cpu_to_be32(NFSERR_SYMLINK)
|
||||
#define nfserr_not_same cpu_to_be32(NFSERR_NOT_SAME)
|
||||
#define nfserr_restorefh cpu_to_be32(NFSERR_RESTOREFH)
|
||||
#define nfserr_attrnotsupp cpu_to_be32(NFSERR_ATTRNOTSUPP)
|
||||
#define nfserr_bad_xdr cpu_to_be32(NFSERR_BAD_XDR)
|
||||
#define nfserr_openmode cpu_to_be32(NFSERR_OPENMODE)
|
||||
#define nfserr_locks_held cpu_to_be32(NFSERR_LOCKS_HELD)
|
||||
#define nfserr_op_illegal cpu_to_be32(NFSERR_OP_ILLEGAL)
|
||||
#define nfserr_grace cpu_to_be32(NFSERR_GRACE)
|
||||
#define nfserr_no_grace cpu_to_be32(NFSERR_NO_GRACE)
|
||||
#define nfserr_reclaim_bad cpu_to_be32(NFSERR_RECLAIM_BAD)
|
||||
#define nfserr_badname cpu_to_be32(NFSERR_BADNAME)
|
||||
#define nfserr_cb_path_down cpu_to_be32(NFSERR_CB_PATH_DOWN)
|
||||
#define nfserr_locked cpu_to_be32(NFSERR_LOCKED)
|
||||
#define nfserr_wrongsec cpu_to_be32(NFSERR_WRONGSEC)
|
||||
#define nfserr_badiomode cpu_to_be32(NFS4ERR_BADIOMODE)
|
||||
#define nfserr_badlayout cpu_to_be32(NFS4ERR_BADLAYOUT)
|
||||
#define nfserr_bad_session_digest cpu_to_be32(NFS4ERR_BAD_SESSION_DIGEST)
|
||||
#define nfserr_badsession cpu_to_be32(NFS4ERR_BADSESSION)
|
||||
#define nfserr_badslot cpu_to_be32(NFS4ERR_BADSLOT)
|
||||
#define nfserr_complete_already cpu_to_be32(NFS4ERR_COMPLETE_ALREADY)
|
||||
#define nfserr_conn_not_bound_to_session cpu_to_be32(NFS4ERR_CONN_NOT_BOUND_TO_SESSION)
|
||||
#define nfserr_deleg_already_wanted cpu_to_be32(NFS4ERR_DELEG_ALREADY_WANTED)
|
||||
#define nfserr_back_chan_busy cpu_to_be32(NFS4ERR_BACK_CHAN_BUSY)
|
||||
#define nfserr_layouttrylater cpu_to_be32(NFS4ERR_LAYOUTTRYLATER)
|
||||
#define nfserr_layoutunavailable cpu_to_be32(NFS4ERR_LAYOUTUNAVAILABLE)
|
||||
#define nfserr_nomatching_layout cpu_to_be32(NFS4ERR_NOMATCHING_LAYOUT)
|
||||
#define nfserr_recallconflict cpu_to_be32(NFS4ERR_RECALLCONFLICT)
|
||||
#define nfserr_unknown_layouttype cpu_to_be32(NFS4ERR_UNKNOWN_LAYOUTTYPE)
|
||||
#define nfserr_seq_misordered cpu_to_be32(NFS4ERR_SEQ_MISORDERED)
|
||||
#define nfserr_sequence_pos cpu_to_be32(NFS4ERR_SEQUENCE_POS)
|
||||
#define nfserr_req_too_big cpu_to_be32(NFS4ERR_REQ_TOO_BIG)
|
||||
#define nfserr_rep_too_big cpu_to_be32(NFS4ERR_REP_TOO_BIG)
|
||||
#define nfserr_rep_too_big_to_cache cpu_to_be32(NFS4ERR_REP_TOO_BIG_TO_CACHE)
|
||||
#define nfserr_retry_uncached_rep cpu_to_be32(NFS4ERR_RETRY_UNCACHED_REP)
|
||||
#define nfserr_unsafe_compound cpu_to_be32(NFS4ERR_UNSAFE_COMPOUND)
|
||||
#define nfserr_too_many_ops cpu_to_be32(NFS4ERR_TOO_MANY_OPS)
|
||||
#define nfserr_op_not_in_session cpu_to_be32(NFS4ERR_OP_NOT_IN_SESSION)
|
||||
#define nfserr_hash_alg_unsupp cpu_to_be32(NFS4ERR_HASH_ALG_UNSUPP)
|
||||
#define nfserr_clientid_busy cpu_to_be32(NFS4ERR_CLIENTID_BUSY)
|
||||
#define nfserr_pnfs_io_hole cpu_to_be32(NFS4ERR_PNFS_IO_HOLE)
|
||||
#define nfserr_seq_false_retry cpu_to_be32(NFS4ERR_SEQ_FALSE_RETRY)
|
||||
#define nfserr_bad_high_slot cpu_to_be32(NFS4ERR_BAD_HIGH_SLOT)
|
||||
#define nfserr_deadsession cpu_to_be32(NFS4ERR_DEADSESSION)
|
||||
#define nfserr_encr_alg_unsupp cpu_to_be32(NFS4ERR_ENCR_ALG_UNSUPP)
|
||||
#define nfserr_pnfs_no_layout cpu_to_be32(NFS4ERR_PNFS_NO_LAYOUT)
|
||||
#define nfserr_not_only_op cpu_to_be32(NFS4ERR_NOT_ONLY_OP)
|
||||
#define nfserr_wrong_cred cpu_to_be32(NFS4ERR_WRONG_CRED)
|
||||
#define nfserr_wrong_type cpu_to_be32(NFS4ERR_WRONG_TYPE)
|
||||
#define nfserr_dirdeleg_unavail cpu_to_be32(NFS4ERR_DIRDELEG_UNAVAIL)
|
||||
#define nfserr_reject_deleg cpu_to_be32(NFS4ERR_REJECT_DELEG)
|
||||
#define nfserr_returnconflict cpu_to_be32(NFS4ERR_RETURNCONFLICT)
|
||||
#define nfserr_deleg_revoked cpu_to_be32(NFS4ERR_DELEG_REVOKED)
|
||||
|
||||
/* error codes for internal use */
|
||||
/* if a request fails due to kmalloc failure, it gets dropped.
|
||||
* Client should resend eventually
|
||||
*/
|
||||
#define nfserr_dropit __constant_htonl(30000)
|
||||
#define nfserr_dropit cpu_to_be32(30000)
|
||||
/* end-of-file indicator in readdir */
|
||||
#define nfserr_eof __constant_htonl(30001)
|
||||
#define nfserr_eof cpu_to_be32(30001)
|
||||
/* replay detected */
|
||||
#define nfserr_replay_me cpu_to_be32(11001)
|
||||
/* nfs41 replay detected */
|
||||
#define nfserr_replay_cache cpu_to_be32(11002)
|
||||
|
||||
/* Check for dir entries '.' and '..' */
|
||||
#define isdotent(n, l) (l < 3 && n[0] == '.' && (l == 1 || n[1] == '.'))
|
||||
@@ -300,7 +343,7 @@ extern struct timeval nfssvc_boot;
|
||||
* TIME_BACKUP (unlikely to be supported any time soon)
|
||||
* TIME_CREATE (unlikely to be supported any time soon)
|
||||
*/
|
||||
#define NFSD_SUPPORTED_ATTRS_WORD0 \
|
||||
#define NFSD4_SUPPORTED_ATTRS_WORD0 \
|
||||
(FATTR4_WORD0_SUPPORTED_ATTRS | FATTR4_WORD0_TYPE | FATTR4_WORD0_FH_EXPIRE_TYPE \
|
||||
| FATTR4_WORD0_CHANGE | FATTR4_WORD0_SIZE | FATTR4_WORD0_LINK_SUPPORT \
|
||||
| FATTR4_WORD0_SYMLINK_SUPPORT | FATTR4_WORD0_NAMED_ATTR | FATTR4_WORD0_FSID \
|
||||
@@ -312,7 +355,7 @@ extern struct timeval nfssvc_boot;
|
||||
| FATTR4_WORD0_MAXFILESIZE | FATTR4_WORD0_MAXLINK | FATTR4_WORD0_MAXNAME \
|
||||
| FATTR4_WORD0_MAXREAD | FATTR4_WORD0_MAXWRITE | FATTR4_WORD0_ACL)
|
||||
|
||||
#define NFSD_SUPPORTED_ATTRS_WORD1 \
|
||||
#define NFSD4_SUPPORTED_ATTRS_WORD1 \
|
||||
(FATTR4_WORD1_MODE | FATTR4_WORD1_NO_TRUNC | FATTR4_WORD1_NUMLINKS \
|
||||
| FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP | FATTR4_WORD1_RAWDEV \
|
||||
| FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL \
|
||||
@@ -320,6 +363,35 @@ extern struct timeval nfssvc_boot;
|
||||
| FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA \
|
||||
| FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
|
||||
|
||||
#define NFSD4_SUPPORTED_ATTRS_WORD2 0
|
||||
|
||||
#define NFSD4_1_SUPPORTED_ATTRS_WORD0 \
|
||||
NFSD4_SUPPORTED_ATTRS_WORD0
|
||||
|
||||
#define NFSD4_1_SUPPORTED_ATTRS_WORD1 \
|
||||
NFSD4_SUPPORTED_ATTRS_WORD1
|
||||
|
||||
#define NFSD4_1_SUPPORTED_ATTRS_WORD2 \
|
||||
(NFSD4_SUPPORTED_ATTRS_WORD2 | FATTR4_WORD2_SUPPATTR_EXCLCREAT)
|
||||
|
||||
static inline u32 nfsd_suppattrs0(u32 minorversion)
|
||||
{
|
||||
return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD0
|
||||
: NFSD4_SUPPORTED_ATTRS_WORD0;
|
||||
}
|
||||
|
||||
static inline u32 nfsd_suppattrs1(u32 minorversion)
|
||||
{
|
||||
return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD1
|
||||
: NFSD4_SUPPORTED_ATTRS_WORD1;
|
||||
}
|
||||
|
||||
static inline u32 nfsd_suppattrs2(u32 minorversion)
|
||||
{
|
||||
return minorversion ? NFSD4_1_SUPPORTED_ATTRS_WORD2
|
||||
: NFSD4_SUPPORTED_ATTRS_WORD2;
|
||||
}
|
||||
|
||||
/* These will return ERR_INVAL if specified in GETATTR or READDIR. */
|
||||
#define NFSD_WRITEONLY_ATTRS_WORD1 \
|
||||
(FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET)
|
||||
@@ -330,6 +402,19 @@ extern struct timeval nfssvc_boot;
|
||||
#define NFSD_WRITEABLE_ATTRS_WORD1 \
|
||||
(FATTR4_WORD1_MODE | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP \
|
||||
| FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET)
|
||||
#define NFSD_WRITEABLE_ATTRS_WORD2 0
|
||||
|
||||
#define NFSD_SUPPATTR_EXCLCREAT_WORD0 \
|
||||
NFSD_WRITEABLE_ATTRS_WORD0
|
||||
/*
|
||||
* we currently store the exclusive create verifier in the v_{a,m}time
|
||||
* attributes so the client can't set these at create time using EXCLUSIVE4_1
|
||||
*/
|
||||
#define NFSD_SUPPATTR_EXCLCREAT_WORD1 \
|
||||
(NFSD_WRITEABLE_ATTRS_WORD1 & \
|
||||
~(FATTR4_WORD1_TIME_ACCESS_SET | FATTR4_WORD1_TIME_MODIFY_SET))
|
||||
#define NFSD_SUPPATTR_EXCLCREAT_WORD2 \
|
||||
NFSD_WRITEABLE_ATTRS_WORD2
|
||||
|
||||
#endif /* CONFIG_NFSD_V4 */
|
||||
|
||||
|
@@ -269,6 +269,13 @@ fh_copy(struct svc_fh *dst, struct svc_fh *src)
|
||||
return dst;
|
||||
}
|
||||
|
||||
static inline void
|
||||
fh_copy_shallow(struct knfsd_fh *dst, struct knfsd_fh *src)
|
||||
{
|
||||
dst->fh_size = src->fh_size;
|
||||
memcpy(&dst->fh_base, &src->fh_base, src->fh_size);
|
||||
}
|
||||
|
||||
static __inline__ struct svc_fh *
|
||||
fh_init(struct svc_fh *fhp, int maxsize)
|
||||
{
|
||||
|
@@ -66,8 +66,7 @@ struct nfs4_cb_recall {
|
||||
u32 cbr_ident;
|
||||
int cbr_trunc;
|
||||
stateid_t cbr_stateid;
|
||||
u32 cbr_fhlen;
|
||||
char cbr_fhval[NFS4_FHSIZE];
|
||||
struct knfsd_fh cbr_fh;
|
||||
struct nfs4_delegation *cbr_dp;
|
||||
};
|
||||
|
||||
@@ -86,8 +85,7 @@ struct nfs4_delegation {
|
||||
};
|
||||
|
||||
#define dl_stateid dl_recall.cbr_stateid
|
||||
#define dl_fhlen dl_recall.cbr_fhlen
|
||||
#define dl_fhval dl_recall.cbr_fhval
|
||||
#define dl_fh dl_recall.cbr_fh
|
||||
|
||||
/* client delegation callback info */
|
||||
struct nfs4_callback {
|
||||
@@ -101,6 +99,64 @@ struct nfs4_callback {
|
||||
struct rpc_clnt * cb_client;
|
||||
};
|
||||
|
||||
/* Maximum number of slots per session. 128 is useful for long haul TCP */
|
||||
#define NFSD_MAX_SLOTS_PER_SESSION 128
|
||||
/* Maximum number of pages per slot cache entry */
|
||||
#define NFSD_PAGES_PER_SLOT 1
|
||||
/* Maximum number of operations per session compound */
|
||||
#define NFSD_MAX_OPS_PER_COMPOUND 16
|
||||
|
||||
struct nfsd4_cache_entry {
|
||||
__be32 ce_status;
|
||||
struct kvec ce_datav; /* encoded NFSv4.1 data in rq_res.head[0] */
|
||||
struct page *ce_respages[NFSD_PAGES_PER_SLOT + 1];
|
||||
int ce_cachethis;
|
||||
short ce_resused;
|
||||
int ce_opcnt;
|
||||
int ce_rpchdrlen;
|
||||
};
|
||||
|
||||
struct nfsd4_slot {
|
||||
bool sl_inuse;
|
||||
u32 sl_seqid;
|
||||
struct nfsd4_cache_entry sl_cache_entry;
|
||||
};
|
||||
|
||||
struct nfsd4_session {
|
||||
struct kref se_ref;
|
||||
struct list_head se_hash; /* hash by sessionid */
|
||||
struct list_head se_perclnt;
|
||||
u32 se_flags;
|
||||
struct nfs4_client *se_client; /* for expire_client */
|
||||
struct nfs4_sessionid se_sessionid;
|
||||
u32 se_fmaxreq_sz;
|
||||
u32 se_fmaxresp_sz;
|
||||
u32 se_fmaxresp_cached;
|
||||
u32 se_fmaxops;
|
||||
u32 se_fnumslots;
|
||||
struct nfsd4_slot se_slots[]; /* forward channel slots */
|
||||
};
|
||||
|
||||
static inline void
|
||||
nfsd4_put_session(struct nfsd4_session *ses)
|
||||
{
|
||||
extern void free_session(struct kref *kref);
|
||||
kref_put(&ses->se_ref, free_session);
|
||||
}
|
||||
|
||||
static inline void
|
||||
nfsd4_get_session(struct nfsd4_session *ses)
|
||||
{
|
||||
kref_get(&ses->se_ref);
|
||||
}
|
||||
|
||||
/* formatted contents of nfs4_sessionid */
|
||||
struct nfsd4_sessionid {
|
||||
clientid_t clientid;
|
||||
u32 sequence;
|
||||
u32 reserved;
|
||||
};
|
||||
|
||||
#define HEXDIR_LEN 33 /* hex version of 16 byte md5 of cl_name plus '\0' */
|
||||
|
||||
/*
|
||||
@@ -132,6 +188,12 @@ struct nfs4_client {
|
||||
struct nfs4_callback cl_callback; /* callback info */
|
||||
atomic_t cl_count; /* ref count */
|
||||
u32 cl_firststate; /* recovery dir creation */
|
||||
|
||||
/* for nfs41 */
|
||||
struct list_head cl_sessions;
|
||||
struct nfsd4_slot cl_slot; /* create_session slot */
|
||||
u32 cl_exchange_flags;
|
||||
struct nfs4_sessionid cl_sessionid;
|
||||
};
|
||||
|
||||
/* struct nfs4_client_reset
|
||||
@@ -168,8 +230,7 @@ struct nfs4_replay {
|
||||
unsigned int rp_buflen;
|
||||
char *rp_buf;
|
||||
unsigned intrp_allocated;
|
||||
int rp_openfh_len;
|
||||
char rp_openfh[NFS4_FHSIZE];
|
||||
struct knfsd_fh rp_openfh;
|
||||
char rp_ibuf[NFSD4_REPLAY_ISIZE];
|
||||
};
|
||||
|
||||
@@ -217,7 +278,7 @@ struct nfs4_stateowner {
|
||||
* share_acces, share_deny on the file.
|
||||
*/
|
||||
struct nfs4_file {
|
||||
struct kref fi_ref;
|
||||
atomic_t fi_ref;
|
||||
struct list_head fi_hash; /* hash by "struct inode *" */
|
||||
struct list_head fi_stateids;
|
||||
struct list_head fi_delegations;
|
||||
@@ -259,14 +320,13 @@ struct nfs4_stateid {
|
||||
};
|
||||
|
||||
/* flags for preprocess_seqid_op() */
|
||||
#define CHECK_FH 0x00000001
|
||||
#define HAS_SESSION 0x00000001
|
||||
#define CONFIRM 0x00000002
|
||||
#define OPEN_STATE 0x00000004
|
||||
#define LOCK_STATE 0x00000008
|
||||
#define RD_STATE 0x00000010
|
||||
#define WR_STATE 0x00000020
|
||||
#define CLOSE_STATE 0x00000040
|
||||
#define DELEG_RET 0x00000080
|
||||
|
||||
#define seqid_mutating_err(err) \
|
||||
(((err) != nfserr_stale_clientid) && \
|
||||
@@ -274,7 +334,9 @@ struct nfs4_stateid {
|
||||
((err) != nfserr_stale_stateid) && \
|
||||
((err) != nfserr_bad_stateid))
|
||||
|
||||
extern __be32 nfs4_preprocess_stateid_op(struct svc_fh *current_fh,
|
||||
struct nfsd4_compound_state;
|
||||
|
||||
extern __be32 nfs4_preprocess_stateid_op(struct nfsd4_compound_state *cstate,
|
||||
stateid_t *stateid, int flags, struct file **filp);
|
||||
extern void nfs4_lock_state(void);
|
||||
extern void nfs4_unlock_state(void);
|
||||
@@ -290,7 +352,7 @@ extern void nfsd4_init_recdir(char *recdir_name);
|
||||
extern int nfsd4_recdir_load(void);
|
||||
extern void nfsd4_shutdown_recdir(void);
|
||||
extern int nfs4_client_to_reclaim(const char *name);
|
||||
extern int nfs4_has_reclaimed_state(const char *name);
|
||||
extern int nfs4_has_reclaimed_state(const char *name, bool use_exchange_id);
|
||||
extern void nfsd4_recdir_purge_old(void);
|
||||
extern int nfsd4_create_clid_dir(struct nfs4_client *clp);
|
||||
extern void nfsd4_remove_clid_dir(struct nfs4_client *clp);
|
||||
|
@@ -11,6 +11,11 @@
|
||||
|
||||
#include <linux/nfs4.h>
|
||||
|
||||
/* thread usage wraps very million seconds (approx one fortnight) */
|
||||
#define NFSD_USAGE_WRAP (HZ*1000000)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
struct nfsd_stats {
|
||||
unsigned int rchits; /* repcache hits */
|
||||
unsigned int rcmisses; /* repcache hits */
|
||||
@@ -35,10 +40,6 @@ struct nfsd_stats {
|
||||
|
||||
};
|
||||
|
||||
/* thread usage wraps very million seconds (approx one fortnight) */
|
||||
#define NFSD_USAGE_WRAP (HZ*1000000)
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
extern struct nfsd_stats nfsdstats;
|
||||
extern struct svc_stat nfsd_svcstats;
|
||||
|
@@ -45,11 +45,23 @@
|
||||
#define XDR_LEN(n) (((n) + 3) & ~3)
|
||||
|
||||
struct nfsd4_compound_state {
|
||||
struct svc_fh current_fh;
|
||||
struct svc_fh save_fh;
|
||||
struct nfs4_stateowner *replay_owner;
|
||||
struct svc_fh current_fh;
|
||||
struct svc_fh save_fh;
|
||||
struct nfs4_stateowner *replay_owner;
|
||||
/* For sessions DRC */
|
||||
struct nfsd4_session *session;
|
||||
struct nfsd4_slot *slot;
|
||||
__be32 *statp;
|
||||
size_t iovlen;
|
||||
u32 minorversion;
|
||||
u32 status;
|
||||
};
|
||||
|
||||
static inline bool nfsd4_has_session(struct nfsd4_compound_state *cs)
|
||||
{
|
||||
return cs->slot != NULL;
|
||||
}
|
||||
|
||||
struct nfsd4_change_info {
|
||||
u32 atomic;
|
||||
u32 before_ctime_sec;
|
||||
@@ -90,7 +102,7 @@ struct nfsd4_create {
|
||||
u32 specdata2;
|
||||
} dev; /* NF4BLK, NF4CHR */
|
||||
} u;
|
||||
u32 cr_bmval[2]; /* request */
|
||||
u32 cr_bmval[3]; /* request */
|
||||
struct iattr cr_iattr; /* request */
|
||||
struct nfsd4_change_info cr_cinfo; /* response */
|
||||
struct nfs4_acl *cr_acl;
|
||||
@@ -105,7 +117,7 @@ struct nfsd4_delegreturn {
|
||||
};
|
||||
|
||||
struct nfsd4_getattr {
|
||||
u32 ga_bmval[2]; /* request */
|
||||
u32 ga_bmval[3]; /* request */
|
||||
struct svc_fh *ga_fhp; /* response */
|
||||
};
|
||||
|
||||
@@ -206,11 +218,9 @@ struct nfsd4_open {
|
||||
stateid_t op_delegate_stateid; /* request - response */
|
||||
u32 op_create; /* request */
|
||||
u32 op_createmode; /* request */
|
||||
u32 op_bmval[2]; /* request */
|
||||
union { /* request */
|
||||
struct iattr iattr; /* UNCHECKED4,GUARDED4 */
|
||||
nfs4_verifier verf; /* EXCLUSIVE4 */
|
||||
} u;
|
||||
u32 op_bmval[3]; /* request */
|
||||
struct iattr iattr; /* UNCHECKED4, GUARDED4, EXCLUSIVE4_1 */
|
||||
nfs4_verifier verf; /* EXCLUSIVE4 */
|
||||
clientid_t op_clientid; /* request */
|
||||
struct xdr_netobj op_owner; /* request */
|
||||
u32 op_seqid; /* request */
|
||||
@@ -224,8 +234,8 @@ struct nfsd4_open {
|
||||
struct nfs4_stateowner *op_stateowner; /* used during processing */
|
||||
struct nfs4_acl *op_acl;
|
||||
};
|
||||
#define op_iattr u.iattr
|
||||
#define op_verf u.verf
|
||||
#define op_iattr iattr
|
||||
#define op_verf verf
|
||||
|
||||
struct nfsd4_open_confirm {
|
||||
stateid_t oc_req_stateid /* request */;
|
||||
@@ -259,7 +269,7 @@ struct nfsd4_readdir {
|
||||
nfs4_verifier rd_verf; /* request */
|
||||
u32 rd_dircount; /* request */
|
||||
u32 rd_maxcount; /* request */
|
||||
u32 rd_bmval[2]; /* request */
|
||||
u32 rd_bmval[3]; /* request */
|
||||
struct svc_rqst *rd_rqstp; /* response */
|
||||
struct svc_fh * rd_fhp; /* response */
|
||||
|
||||
@@ -301,7 +311,7 @@ struct nfsd4_secinfo {
|
||||
|
||||
struct nfsd4_setattr {
|
||||
stateid_t sa_stateid; /* request */
|
||||
u32 sa_bmval[2]; /* request */
|
||||
u32 sa_bmval[3]; /* request */
|
||||
struct iattr sa_iattr; /* request */
|
||||
struct nfs4_acl *sa_acl;
|
||||
};
|
||||
@@ -327,7 +337,7 @@ struct nfsd4_setclientid_confirm {
|
||||
|
||||
/* also used for NVERIFY */
|
||||
struct nfsd4_verify {
|
||||
u32 ve_bmval[2]; /* request */
|
||||
u32 ve_bmval[3]; /* request */
|
||||
u32 ve_attrlen; /* request */
|
||||
char * ve_attrval; /* request */
|
||||
};
|
||||
@@ -344,6 +354,54 @@ struct nfsd4_write {
|
||||
nfs4_verifier wr_verifier; /* response */
|
||||
};
|
||||
|
||||
struct nfsd4_exchange_id {
|
||||
nfs4_verifier verifier;
|
||||
struct xdr_netobj clname;
|
||||
u32 flags;
|
||||
clientid_t clientid;
|
||||
u32 seqid;
|
||||
int spa_how;
|
||||
};
|
||||
|
||||
struct nfsd4_channel_attrs {
|
||||
u32 headerpadsz;
|
||||
u32 maxreq_sz;
|
||||
u32 maxresp_sz;
|
||||
u32 maxresp_cached;
|
||||
u32 maxops;
|
||||
u32 maxreqs;
|
||||
u32 nr_rdma_attrs;
|
||||
u32 rdma_attrs;
|
||||
};
|
||||
|
||||
struct nfsd4_create_session {
|
||||
clientid_t clientid;
|
||||
struct nfs4_sessionid sessionid;
|
||||
u32 seqid;
|
||||
u32 flags;
|
||||
struct nfsd4_channel_attrs fore_channel;
|
||||
struct nfsd4_channel_attrs back_channel;
|
||||
u32 callback_prog;
|
||||
u32 uid;
|
||||
u32 gid;
|
||||
};
|
||||
|
||||
struct nfsd4_sequence {
|
||||
struct nfs4_sessionid sessionid; /* request/response */
|
||||
u32 seqid; /* request/response */
|
||||
u32 slotid; /* request/response */
|
||||
u32 maxslots; /* request/response */
|
||||
u32 cachethis; /* request */
|
||||
#if 0
|
||||
u32 target_maxslots; /* response */
|
||||
u32 status_flags; /* response */
|
||||
#endif /* not yet */
|
||||
};
|
||||
|
||||
struct nfsd4_destroy_session {
|
||||
struct nfs4_sessionid sessionid;
|
||||
};
|
||||
|
||||
struct nfsd4_op {
|
||||
int opnum;
|
||||
__be32 status;
|
||||
@@ -378,6 +436,12 @@ struct nfsd4_op {
|
||||
struct nfsd4_verify verify;
|
||||
struct nfsd4_write write;
|
||||
struct nfsd4_release_lockowner release_lockowner;
|
||||
|
||||
/* NFSv4.1 */
|
||||
struct nfsd4_exchange_id exchange_id;
|
||||
struct nfsd4_create_session create_session;
|
||||
struct nfsd4_destroy_session destroy_session;
|
||||
struct nfsd4_sequence sequence;
|
||||
} u;
|
||||
struct nfs4_replay * replay;
|
||||
};
|
||||
@@ -416,9 +480,22 @@ struct nfsd4_compoundres {
|
||||
u32 taglen;
|
||||
char * tag;
|
||||
u32 opcnt;
|
||||
__be32 * tagp; /* where to encode tag and opcount */
|
||||
__be32 * tagp; /* tag, opcount encode location */
|
||||
struct nfsd4_compound_state cstate;
|
||||
};
|
||||
|
||||
static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp)
|
||||
{
|
||||
struct nfsd4_compoundargs *args = resp->rqstp->rq_argp;
|
||||
return args->opcnt == 1;
|
||||
}
|
||||
|
||||
static inline bool nfsd4_not_cached(struct nfsd4_compoundres *resp)
|
||||
{
|
||||
return !resp->cstate.slot->sl_cache_entry.ce_cachethis ||
|
||||
nfsd4_is_solo_sequence(resp);
|
||||
}
|
||||
|
||||
#define NFS4_SVC_XDRSIZE sizeof(struct nfsd4_compoundargs)
|
||||
|
||||
static inline void
|
||||
@@ -448,7 +525,23 @@ extern __be32 nfsd4_setclientid(struct svc_rqst *rqstp,
|
||||
extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_setclientid_confirm *setclientid_confirm);
|
||||
extern __be32 nfsd4_process_open1(struct nfsd4_open *open);
|
||||
extern void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp);
|
||||
extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
|
||||
struct nfsd4_sequence *seq);
|
||||
extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_exchange_id *);
|
||||
extern __be32 nfsd4_create_session(struct svc_rqst *,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_create_session *);
|
||||
extern __be32 nfsd4_sequence(struct svc_rqst *,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_sequence *);
|
||||
extern __be32 nfsd4_destroy_session(struct svc_rqst *,
|
||||
struct nfsd4_compound_state *,
|
||||
struct nfsd4_destroy_session *);
|
||||
extern __be32 nfsd4_process_open1(struct nfsd4_compound_state *,
|
||||
struct nfsd4_open *open);
|
||||
extern __be32 nfsd4_process_open2(struct svc_rqst *rqstp,
|
||||
struct svc_fh *current_fh, struct nfsd4_open *open);
|
||||
extern __be32 nfsd4_open_confirm(struct svc_rqst *rqstp,
|
||||
|
801
include/linux/nilfs2_fs.h
Normal file
801
include/linux/nilfs2_fs.h
Normal file
@@ -0,0 +1,801 @@
|
||||
/*
|
||||
* nilfs2_fs.h - NILFS2 on-disk structures and common declarations.
|
||||
*
|
||||
* Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Written by Koji Sato <koji@osrg.net>
|
||||
* Ryusuke Konishi <ryusuke@osrg.net>
|
||||
*/
|
||||
/*
|
||||
* linux/include/linux/ext2_fs.h
|
||||
*
|
||||
* Copyright (C) 1992, 1993, 1994, 1995
|
||||
* Remy Card (card@masi.ibp.fr)
|
||||
* Laboratoire MASI - Institut Blaise Pascal
|
||||
* Universite Pierre et Marie Curie (Paris VI)
|
||||
*
|
||||
* from
|
||||
*
|
||||
* linux/include/linux/minix_fs.h
|
||||
*
|
||||
* Copyright (C) 1991, 1992 Linus Torvalds
|
||||
*/
|
||||
|
||||
#ifndef _LINUX_NILFS_FS_H
|
||||
#define _LINUX_NILFS_FS_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/ioctl.h>
|
||||
|
||||
/*
|
||||
* Inode flags stored in nilfs_inode and on-memory nilfs inode
|
||||
*
|
||||
* We define these flags based on ext2-fs because of the
|
||||
* compatibility reason; to avoid problems in chattr(1)
|
||||
*/
|
||||
#define NILFS_SECRM_FL 0x00000001 /* Secure deletion */
|
||||
#define NILFS_UNRM_FL 0x00000002 /* Undelete */
|
||||
#define NILFS_SYNC_FL 0x00000008 /* Synchronous updates */
|
||||
#define NILFS_IMMUTABLE_FL 0x00000010 /* Immutable file */
|
||||
#define NILFS_APPEND_FL 0x00000020 /* writes to file may only append */
|
||||
#define NILFS_NODUMP_FL 0x00000040 /* do not dump file */
|
||||
#define NILFS_NOATIME_FL 0x00000080 /* do not update atime */
|
||||
/* Reserved for compression usage... */
|
||||
#define NILFS_NOTAIL_FL 0x00008000 /* file tail should not be merged */
|
||||
#define NILFS_DIRSYNC_FL 0x00010000 /* dirsync behaviour */
|
||||
|
||||
#define NILFS_FL_USER_VISIBLE 0x0003DFFF /* User visible flags */
|
||||
#define NILFS_FL_USER_MODIFIABLE 0x000380FF /* User modifiable flags */
|
||||
|
||||
|
||||
#define NILFS_INODE_BMAP_SIZE 7
|
||||
/**
|
||||
* struct nilfs_inode - structure of an inode on disk
|
||||
* @i_blocks: blocks count
|
||||
* @i_size: size in bytes
|
||||
* @i_ctime: creation time (seconds)
|
||||
* @i_mtime: modification time (seconds)
|
||||
* @i_ctime_nsec: creation time (nano seconds)
|
||||
* @i_mtime_nsec: modification time (nano seconds)
|
||||
* @i_uid: user id
|
||||
* @i_gid: group id
|
||||
* @i_mode: file mode
|
||||
* @i_links_count: links count
|
||||
* @i_flags: file flags
|
||||
* @i_bmap: block mapping
|
||||
* @i_xattr: extended attributes
|
||||
* @i_generation: file generation (for NFS)
|
||||
* @i_pad: padding
|
||||
*/
|
||||
struct nilfs_inode {
|
||||
__le64 i_blocks;
|
||||
__le64 i_size;
|
||||
__le64 i_ctime;
|
||||
__le64 i_mtime;
|
||||
__le32 i_ctime_nsec;
|
||||
__le32 i_mtime_nsec;
|
||||
__le32 i_uid;
|
||||
__le32 i_gid;
|
||||
__le16 i_mode;
|
||||
__le16 i_links_count;
|
||||
__le32 i_flags;
|
||||
__le64 i_bmap[NILFS_INODE_BMAP_SIZE];
|
||||
#define i_device_code i_bmap[0]
|
||||
__le64 i_xattr;
|
||||
__le32 i_generation;
|
||||
__le32 i_pad;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_super_root - structure of super root
|
||||
* @sr_sum: check sum
|
||||
* @sr_bytes: byte count of the structure
|
||||
* @sr_flags: flags (reserved)
|
||||
* @sr_nongc_ctime: write time of the last segment not for cleaner operation
|
||||
* @sr_dat: DAT file inode
|
||||
* @sr_cpfile: checkpoint file inode
|
||||
* @sr_sufile: segment usage file inode
|
||||
*/
|
||||
struct nilfs_super_root {
|
||||
__le32 sr_sum;
|
||||
__le16 sr_bytes;
|
||||
__le16 sr_flags;
|
||||
__le64 sr_nongc_ctime;
|
||||
struct nilfs_inode sr_dat;
|
||||
struct nilfs_inode sr_cpfile;
|
||||
struct nilfs_inode sr_sufile;
|
||||
};
|
||||
|
||||
#define NILFS_SR_MDT_OFFSET(inode_size, i) \
|
||||
((unsigned long)&((struct nilfs_super_root *)0)->sr_dat + \
|
||||
(inode_size) * (i))
|
||||
#define NILFS_SR_DAT_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 0)
|
||||
#define NILFS_SR_CPFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 1)
|
||||
#define NILFS_SR_SUFILE_OFFSET(inode_size) NILFS_SR_MDT_OFFSET(inode_size, 2)
|
||||
#define NILFS_SR_BYTES (sizeof(struct nilfs_super_root))
|
||||
|
||||
/*
|
||||
* Maximal mount counts
|
||||
*/
|
||||
#define NILFS_DFL_MAX_MNT_COUNT 50 /* 50 mounts */
|
||||
|
||||
/*
|
||||
* File system states (sbp->s_state, nilfs->ns_mount_state)
|
||||
*/
|
||||
#define NILFS_VALID_FS 0x0001 /* Unmounted cleanly */
|
||||
#define NILFS_ERROR_FS 0x0002 /* Errors detected */
|
||||
#define NILFS_RESIZE_FS 0x0004 /* Resize required */
|
||||
|
||||
/*
|
||||
* Mount flags (sbi->s_mount_opt)
|
||||
*/
|
||||
#define NILFS_MOUNT_ERROR_MODE 0x0070 /* Error mode mask */
|
||||
#define NILFS_MOUNT_ERRORS_CONT 0x0010 /* Continue on errors */
|
||||
#define NILFS_MOUNT_ERRORS_RO 0x0020 /* Remount fs ro on errors */
|
||||
#define NILFS_MOUNT_ERRORS_PANIC 0x0040 /* Panic on errors */
|
||||
#define NILFS_MOUNT_SNAPSHOT 0x0080 /* Snapshot flag */
|
||||
#define NILFS_MOUNT_BARRIER 0x1000 /* Use block barriers */
|
||||
#define NILFS_MOUNT_STRICT_ORDER 0x2000 /* Apply strict in-order
|
||||
semantics also for data */
|
||||
|
||||
|
||||
/**
|
||||
* struct nilfs_super_block - structure of super block on disk
|
||||
*/
|
||||
struct nilfs_super_block {
|
||||
__le32 s_rev_level; /* Revision level */
|
||||
__le16 s_minor_rev_level; /* minor revision level */
|
||||
__le16 s_magic; /* Magic signature */
|
||||
|
||||
__le16 s_bytes; /* Bytes count of CRC calculation
|
||||
for this structure. s_reserved
|
||||
is excluded. */
|
||||
__le16 s_flags; /* flags */
|
||||
__le32 s_crc_seed; /* Seed value of CRC calculation */
|
||||
__le32 s_sum; /* Check sum of super block */
|
||||
|
||||
__le32 s_log_block_size; /* Block size represented as follows
|
||||
blocksize =
|
||||
1 << (s_log_block_size + 10) */
|
||||
__le64 s_nsegments; /* Number of segments in filesystem */
|
||||
__le64 s_dev_size; /* block device size in bytes */
|
||||
__le64 s_first_data_block; /* 1st seg disk block number */
|
||||
__le32 s_blocks_per_segment; /* number of blocks per full segment */
|
||||
__le32 s_r_segments_percentage; /* Reserved segments percentage */
|
||||
|
||||
__le64 s_last_cno; /* Last checkpoint number */
|
||||
__le64 s_last_pseg; /* disk block addr pseg written last */
|
||||
__le64 s_last_seq; /* seq. number of seg written last */
|
||||
__le64 s_free_blocks_count; /* Free blocks count */
|
||||
|
||||
__le64 s_ctime; /* Creation time (execution time of
|
||||
newfs) */
|
||||
__le64 s_mtime; /* Mount time */
|
||||
__le64 s_wtime; /* Write time */
|
||||
__le16 s_mnt_count; /* Mount count */
|
||||
__le16 s_max_mnt_count; /* Maximal mount count */
|
||||
__le16 s_state; /* File system state */
|
||||
__le16 s_errors; /* Behaviour when detecting errors */
|
||||
__le64 s_lastcheck; /* time of last check */
|
||||
|
||||
__le32 s_checkinterval; /* max. time between checks */
|
||||
__le32 s_creator_os; /* OS */
|
||||
__le16 s_def_resuid; /* Default uid for reserved blocks */
|
||||
__le16 s_def_resgid; /* Default gid for reserved blocks */
|
||||
__le32 s_first_ino; /* First non-reserved inode */
|
||||
|
||||
__le16 s_inode_size; /* Size of an inode */
|
||||
__le16 s_dat_entry_size; /* Size of a dat entry */
|
||||
__le16 s_checkpoint_size; /* Size of a checkpoint */
|
||||
__le16 s_segment_usage_size; /* Size of a segment usage */
|
||||
|
||||
__u8 s_uuid[16]; /* 128-bit uuid for volume */
|
||||
char s_volume_name[16]; /* volume name */
|
||||
char s_last_mounted[64]; /* directory where last mounted */
|
||||
|
||||
__le32 s_c_interval; /* Commit interval of segment */
|
||||
__le32 s_c_block_max; /* Threshold of data amount for
|
||||
the segment construction */
|
||||
__u32 s_reserved[192]; /* padding to the end of the block */
|
||||
};
|
||||
|
||||
/*
|
||||
* Codes for operating systems
|
||||
*/
|
||||
#define NILFS_OS_LINUX 0
|
||||
/* Codes from 1 to 4 are reserved to keep compatibility with ext2 creator-OS */
|
||||
|
||||
/*
|
||||
* Revision levels
|
||||
*/
|
||||
#define NILFS_CURRENT_REV 2 /* current major revision */
|
||||
#define NILFS_MINOR_REV 0 /* minor revision */
|
||||
|
||||
/*
|
||||
* Bytes count of super_block for CRC-calculation
|
||||
*/
|
||||
#define NILFS_SB_BYTES \
|
||||
((long)&((struct nilfs_super_block *)0)->s_reserved)
|
||||
|
||||
/*
|
||||
* Special inode number
|
||||
*/
|
||||
#define NILFS_ROOT_INO 2 /* Root file inode */
|
||||
#define NILFS_DAT_INO 3 /* DAT file */
|
||||
#define NILFS_CPFILE_INO 4 /* checkpoint file */
|
||||
#define NILFS_SUFILE_INO 5 /* segment usage file */
|
||||
#define NILFS_IFILE_INO 6 /* ifile */
|
||||
#define NILFS_ATIME_INO 7 /* Atime file (reserved) */
|
||||
#define NILFS_XATTR_INO 8 /* Xattribute file (reserved) */
|
||||
#define NILFS_SKETCH_INO 10 /* Sketch file */
|
||||
#define NILFS_USER_INO 11 /* Fisrt user's file inode number */
|
||||
|
||||
#define NILFS_SB_OFFSET_BYTES 1024 /* byte offset of nilfs superblock */
|
||||
#define NILFS_SUPER_MAGIC 0x3434 /* NILFS filesystem magic number */
|
||||
|
||||
#define NILFS_SEG_MIN_BLOCKS 16 /* Minimum number of blocks in
|
||||
a full segment */
|
||||
#define NILFS_PSEG_MIN_BLOCKS 2 /* Minimum number of blocks in
|
||||
a partial segment */
|
||||
#define NILFS_MIN_NRSVSEGS 8 /* Minimum number of reserved
|
||||
segments */
|
||||
|
||||
/*
|
||||
* bytes offset of secondary super block
|
||||
*/
|
||||
#define NILFS_SB2_OFFSET_BYTES(devsize) ((((devsize) >> 12) - 1) << 12)
|
||||
|
||||
/*
|
||||
* Maximal count of links to a file
|
||||
*/
|
||||
#define NILFS_LINK_MAX 32000
|
||||
|
||||
/*
|
||||
* Structure of a directory entry
|
||||
* (Same as ext2)
|
||||
*/
|
||||
|
||||
#define NILFS_NAME_LEN 255
|
||||
|
||||
/*
|
||||
* The new version of the directory entry. Since V0 structures are
|
||||
* stored in intel byte order, and the name_len field could never be
|
||||
* bigger than 255 chars, it's safe to reclaim the extra byte for the
|
||||
* file_type field.
|
||||
*/
|
||||
struct nilfs_dir_entry {
|
||||
__le64 inode; /* Inode number */
|
||||
__le16 rec_len; /* Directory entry length */
|
||||
__u8 name_len; /* Name length */
|
||||
__u8 file_type;
|
||||
char name[NILFS_NAME_LEN]; /* File name */
|
||||
char pad;
|
||||
};
|
||||
|
||||
/*
|
||||
* NILFS directory file types. Only the low 3 bits are used. The
|
||||
* other bits are reserved for now.
|
||||
*/
|
||||
enum {
|
||||
NILFS_FT_UNKNOWN,
|
||||
NILFS_FT_REG_FILE,
|
||||
NILFS_FT_DIR,
|
||||
NILFS_FT_CHRDEV,
|
||||
NILFS_FT_BLKDEV,
|
||||
NILFS_FT_FIFO,
|
||||
NILFS_FT_SOCK,
|
||||
NILFS_FT_SYMLINK,
|
||||
NILFS_FT_MAX
|
||||
};
|
||||
|
||||
/*
|
||||
* NILFS_DIR_PAD defines the directory entries boundaries
|
||||
*
|
||||
* NOTE: It must be a multiple of 8
|
||||
*/
|
||||
#define NILFS_DIR_PAD 8
|
||||
#define NILFS_DIR_ROUND (NILFS_DIR_PAD - 1)
|
||||
#define NILFS_DIR_REC_LEN(name_len) (((name_len) + 12 + NILFS_DIR_ROUND) & \
|
||||
~NILFS_DIR_ROUND)
|
||||
|
||||
|
||||
/**
|
||||
* struct nilfs_finfo - file information
|
||||
* @fi_ino: inode number
|
||||
* @fi_cno: checkpoint number
|
||||
* @fi_nblocks: number of blocks (including intermediate blocks)
|
||||
* @fi_ndatablk: number of file data blocks
|
||||
*/
|
||||
struct nilfs_finfo {
|
||||
__le64 fi_ino;
|
||||
__le64 fi_cno;
|
||||
__le32 fi_nblocks;
|
||||
__le32 fi_ndatablk;
|
||||
/* array of virtual block numbers */
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_binfo_v - information for the block to which a virtual block number is assigned
|
||||
* @bi_vblocknr: virtual block number
|
||||
* @bi_blkoff: block offset
|
||||
*/
|
||||
struct nilfs_binfo_v {
|
||||
__le64 bi_vblocknr;
|
||||
__le64 bi_blkoff;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_binfo_dat - information for the block which belongs to the DAT file
|
||||
* @bi_blkoff: block offset
|
||||
* @bi_level: level
|
||||
* @bi_pad: padding
|
||||
*/
|
||||
struct nilfs_binfo_dat {
|
||||
__le64 bi_blkoff;
|
||||
__u8 bi_level;
|
||||
__u8 bi_pad[7];
|
||||
};
|
||||
|
||||
/**
|
||||
* union nilfs_binfo: block information
|
||||
* @bi_v: nilfs_binfo_v structure
|
||||
* @bi_dat: nilfs_binfo_dat structure
|
||||
*/
|
||||
union nilfs_binfo {
|
||||
struct nilfs_binfo_v bi_v;
|
||||
struct nilfs_binfo_dat bi_dat;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_segment_summary - segment summary
|
||||
* @ss_datasum: checksum of data
|
||||
* @ss_sumsum: checksum of segment summary
|
||||
* @ss_magic: magic number
|
||||
* @ss_bytes: size of this structure in bytes
|
||||
* @ss_flags: flags
|
||||
* @ss_seq: sequence number
|
||||
* @ss_create: creation timestamp
|
||||
* @ss_next: next segment
|
||||
* @ss_nblocks: number of blocks
|
||||
* @ss_nfinfo: number of finfo structures
|
||||
* @ss_sumbytes: total size of segment summary in bytes
|
||||
* @ss_pad: padding
|
||||
*/
|
||||
struct nilfs_segment_summary {
|
||||
__le32 ss_datasum;
|
||||
__le32 ss_sumsum;
|
||||
__le32 ss_magic;
|
||||
__le16 ss_bytes;
|
||||
__le16 ss_flags;
|
||||
__le64 ss_seq;
|
||||
__le64 ss_create;
|
||||
__le64 ss_next;
|
||||
__le32 ss_nblocks;
|
||||
__le32 ss_nfinfo;
|
||||
__le32 ss_sumbytes;
|
||||
__le32 ss_pad;
|
||||
/* array of finfo structures */
|
||||
};
|
||||
|
||||
#define NILFS_SEGSUM_MAGIC 0x1eaffa11 /* segment summary magic number */
|
||||
|
||||
/*
|
||||
* Segment summary flags
|
||||
*/
|
||||
#define NILFS_SS_LOGBGN 0x0001 /* begins a logical segment */
|
||||
#define NILFS_SS_LOGEND 0x0002 /* ends a logical segment */
|
||||
#define NILFS_SS_SR 0x0004 /* has super root */
|
||||
#define NILFS_SS_SYNDT 0x0008 /* includes data only updates */
|
||||
#define NILFS_SS_GC 0x0010 /* segment written for cleaner operation */
|
||||
|
||||
/**
|
||||
* struct nilfs_palloc_group_desc - block group descriptor
|
||||
* @pg_nfrees: number of free entries in block group
|
||||
*/
|
||||
struct nilfs_palloc_group_desc {
|
||||
__le32 pg_nfrees;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_dat_entry - disk address translation entry
|
||||
* @dt_blocknr: block number
|
||||
* @dt_start: start checkpoint number
|
||||
* @dt_end: end checkpoint number
|
||||
* @dt_rsv: reserved for future use
|
||||
*/
|
||||
struct nilfs_dat_entry {
|
||||
__le64 de_blocknr;
|
||||
__le64 de_start;
|
||||
__le64 de_end;
|
||||
__le64 de_rsv;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_dat_group_desc - block group descriptor
|
||||
* @dg_nfrees: number of free virtual block numbers in block group
|
||||
*/
|
||||
struct nilfs_dat_group_desc {
|
||||
__le32 dg_nfrees;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* struct nilfs_snapshot_list - snapshot list
|
||||
* @ssl_next: next checkpoint number on snapshot list
|
||||
* @ssl_prev: previous checkpoint number on snapshot list
|
||||
*/
|
||||
struct nilfs_snapshot_list {
|
||||
__le64 ssl_next;
|
||||
__le64 ssl_prev;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_checkpoint - checkpoint structure
|
||||
* @cp_flags: flags
|
||||
* @cp_checkpoints_count: checkpoints count in a block
|
||||
* @cp_snapshot_list: snapshot list
|
||||
* @cp_cno: checkpoint number
|
||||
* @cp_create: creation timestamp
|
||||
* @cp_nblk_inc: number of blocks incremented by this checkpoint
|
||||
* @cp_inodes_count: inodes count
|
||||
* @cp_blocks_count: blocks count
|
||||
* @cp_ifile_inode: inode of ifile
|
||||
*/
|
||||
struct nilfs_checkpoint {
|
||||
__le32 cp_flags;
|
||||
__le32 cp_checkpoints_count;
|
||||
struct nilfs_snapshot_list cp_snapshot_list;
|
||||
__le64 cp_cno;
|
||||
__le64 cp_create;
|
||||
__le64 cp_nblk_inc;
|
||||
__le64 cp_inodes_count;
|
||||
__le64 cp_blocks_count; /* Reserved (might be deleted) */
|
||||
|
||||
/* Do not change the byte offset of ifile inode.
|
||||
To keep the compatibility of the disk format,
|
||||
additional fields should be added behind cp_ifile_inode. */
|
||||
struct nilfs_inode cp_ifile_inode;
|
||||
};
|
||||
|
||||
/* checkpoint flags */
|
||||
enum {
|
||||
NILFS_CHECKPOINT_SNAPSHOT,
|
||||
NILFS_CHECKPOINT_INVALID,
|
||||
NILFS_CHECKPOINT_SKETCH,
|
||||
NILFS_CHECKPOINT_MINOR,
|
||||
};
|
||||
|
||||
#define NILFS_CHECKPOINT_FNS(flag, name) \
|
||||
static inline void \
|
||||
nilfs_checkpoint_set_##name(struct nilfs_checkpoint *cp) \
|
||||
{ \
|
||||
cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) | \
|
||||
(1UL << NILFS_CHECKPOINT_##flag)); \
|
||||
} \
|
||||
static inline void \
|
||||
nilfs_checkpoint_clear_##name(struct nilfs_checkpoint *cp) \
|
||||
{ \
|
||||
cp->cp_flags = cpu_to_le32(le32_to_cpu(cp->cp_flags) & \
|
||||
~(1UL << NILFS_CHECKPOINT_##flag)); \
|
||||
} \
|
||||
static inline int \
|
||||
nilfs_checkpoint_##name(const struct nilfs_checkpoint *cp) \
|
||||
{ \
|
||||
return !!(le32_to_cpu(cp->cp_flags) & \
|
||||
(1UL << NILFS_CHECKPOINT_##flag)); \
|
||||
}
|
||||
|
||||
NILFS_CHECKPOINT_FNS(SNAPSHOT, snapshot)
|
||||
NILFS_CHECKPOINT_FNS(INVALID, invalid)
|
||||
NILFS_CHECKPOINT_FNS(MINOR, minor)
|
||||
|
||||
/**
|
||||
* struct nilfs_cpinfo - checkpoint information
|
||||
* @ci_flags: flags
|
||||
* @ci_pad: padding
|
||||
* @ci_cno: checkpoint number
|
||||
* @ci_create: creation timestamp
|
||||
* @ci_nblk_inc: number of blocks incremented by this checkpoint
|
||||
* @ci_inodes_count: inodes count
|
||||
* @ci_blocks_count: blocks count
|
||||
* @ci_next: next checkpoint number in snapshot list
|
||||
*/
|
||||
struct nilfs_cpinfo {
|
||||
__u32 ci_flags;
|
||||
__u32 ci_pad;
|
||||
__u64 ci_cno;
|
||||
__u64 ci_create;
|
||||
__u64 ci_nblk_inc;
|
||||
__u64 ci_inodes_count;
|
||||
__u64 ci_blocks_count;
|
||||
__u64 ci_next;
|
||||
};
|
||||
|
||||
#define NILFS_CPINFO_FNS(flag, name) \
|
||||
static inline int \
|
||||
nilfs_cpinfo_##name(const struct nilfs_cpinfo *cpinfo) \
|
||||
{ \
|
||||
return !!(cpinfo->ci_flags & (1UL << NILFS_CHECKPOINT_##flag)); \
|
||||
}
|
||||
|
||||
NILFS_CPINFO_FNS(SNAPSHOT, snapshot)
|
||||
NILFS_CPINFO_FNS(INVALID, invalid)
|
||||
NILFS_CPINFO_FNS(MINOR, minor)
|
||||
|
||||
|
||||
/**
|
||||
* struct nilfs_cpfile_header - checkpoint file header
|
||||
* @ch_ncheckpoints: number of checkpoints
|
||||
* @ch_nsnapshots: number of snapshots
|
||||
* @ch_snapshot_list: snapshot list
|
||||
*/
|
||||
struct nilfs_cpfile_header {
|
||||
__le64 ch_ncheckpoints;
|
||||
__le64 ch_nsnapshots;
|
||||
struct nilfs_snapshot_list ch_snapshot_list;
|
||||
};
|
||||
|
||||
#define NILFS_CPFILE_FIRST_CHECKPOINT_OFFSET \
|
||||
((sizeof(struct nilfs_cpfile_header) + \
|
||||
sizeof(struct nilfs_checkpoint) - 1) / \
|
||||
sizeof(struct nilfs_checkpoint))
|
||||
|
||||
/**
|
||||
* struct nilfs_segment_usage - segment usage
|
||||
* @su_lastmod: last modified timestamp
|
||||
* @su_nblocks: number of blocks in segment
|
||||
* @su_flags: flags
|
||||
*/
|
||||
struct nilfs_segment_usage {
|
||||
__le64 su_lastmod;
|
||||
__le32 su_nblocks;
|
||||
__le32 su_flags;
|
||||
};
|
||||
|
||||
/* segment usage flag */
|
||||
enum {
|
||||
NILFS_SEGMENT_USAGE_ACTIVE,
|
||||
NILFS_SEGMENT_USAGE_DIRTY,
|
||||
NILFS_SEGMENT_USAGE_ERROR,
|
||||
|
||||
/* ... */
|
||||
};
|
||||
|
||||
#define NILFS_SEGMENT_USAGE_FNS(flag, name) \
|
||||
static inline void \
|
||||
nilfs_segment_usage_set_##name(struct nilfs_segment_usage *su) \
|
||||
{ \
|
||||
su->su_flags = cpu_to_le32(le32_to_cpu(su->su_flags) | \
|
||||
(1UL << NILFS_SEGMENT_USAGE_##flag));\
|
||||
} \
|
||||
static inline void \
|
||||
nilfs_segment_usage_clear_##name(struct nilfs_segment_usage *su) \
|
||||
{ \
|
||||
su->su_flags = \
|
||||
cpu_to_le32(le32_to_cpu(su->su_flags) & \
|
||||
~(1UL << NILFS_SEGMENT_USAGE_##flag)); \
|
||||
} \
|
||||
static inline int \
|
||||
nilfs_segment_usage_##name(const struct nilfs_segment_usage *su) \
|
||||
{ \
|
||||
return !!(le32_to_cpu(su->su_flags) & \
|
||||
(1UL << NILFS_SEGMENT_USAGE_##flag)); \
|
||||
}
|
||||
|
||||
NILFS_SEGMENT_USAGE_FNS(ACTIVE, active)
|
||||
NILFS_SEGMENT_USAGE_FNS(DIRTY, dirty)
|
||||
NILFS_SEGMENT_USAGE_FNS(ERROR, error)
|
||||
|
||||
static inline void
|
||||
nilfs_segment_usage_set_clean(struct nilfs_segment_usage *su)
|
||||
{
|
||||
su->su_lastmod = cpu_to_le64(0);
|
||||
su->su_nblocks = cpu_to_le32(0);
|
||||
su->su_flags = cpu_to_le32(0);
|
||||
}
|
||||
|
||||
static inline int
|
||||
nilfs_segment_usage_clean(const struct nilfs_segment_usage *su)
|
||||
{
|
||||
return !le32_to_cpu(su->su_flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* struct nilfs_sufile_header - segment usage file header
|
||||
* @sh_ncleansegs: number of clean segments
|
||||
* @sh_ndirtysegs: number of dirty segments
|
||||
* @sh_last_alloc: last allocated segment number
|
||||
*/
|
||||
struct nilfs_sufile_header {
|
||||
__le64 sh_ncleansegs;
|
||||
__le64 sh_ndirtysegs;
|
||||
__le64 sh_last_alloc;
|
||||
/* ... */
|
||||
};
|
||||
|
||||
#define NILFS_SUFILE_FIRST_SEGMENT_USAGE_OFFSET \
|
||||
((sizeof(struct nilfs_sufile_header) + \
|
||||
sizeof(struct nilfs_segment_usage) - 1) / \
|
||||
sizeof(struct nilfs_segment_usage))
|
||||
|
||||
/**
|
||||
* nilfs_suinfo - segment usage information
|
||||
* @sui_lastmod:
|
||||
* @sui_nblocks:
|
||||
* @sui_flags:
|
||||
*/
|
||||
struct nilfs_suinfo {
|
||||
__u64 sui_lastmod;
|
||||
__u32 sui_nblocks;
|
||||
__u32 sui_flags;
|
||||
};
|
||||
|
||||
#define NILFS_SUINFO_FNS(flag, name) \
|
||||
static inline int \
|
||||
nilfs_suinfo_##name(const struct nilfs_suinfo *si) \
|
||||
{ \
|
||||
return si->sui_flags & (1UL << NILFS_SEGMENT_USAGE_##flag); \
|
||||
}
|
||||
|
||||
NILFS_SUINFO_FNS(ACTIVE, active)
|
||||
NILFS_SUINFO_FNS(DIRTY, dirty)
|
||||
NILFS_SUINFO_FNS(ERROR, error)
|
||||
|
||||
static inline int nilfs_suinfo_clean(const struct nilfs_suinfo *si)
|
||||
{
|
||||
return !si->sui_flags;
|
||||
}
|
||||
|
||||
/* ioctl */
|
||||
enum {
|
||||
NILFS_CHECKPOINT,
|
||||
NILFS_SNAPSHOT,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_cpmode -
|
||||
* @cc_cno:
|
||||
* @cc_mode:
|
||||
*/
|
||||
struct nilfs_cpmode {
|
||||
__u64 cm_cno;
|
||||
__u32 cm_mode;
|
||||
__u32 cm_pad;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_argv - argument vector
|
||||
* @v_base:
|
||||
* @v_nmembs:
|
||||
* @v_size:
|
||||
* @v_flags:
|
||||
* @v_index:
|
||||
*/
|
||||
struct nilfs_argv {
|
||||
__u64 v_base;
|
||||
__u32 v_nmembs; /* number of members */
|
||||
__u16 v_size; /* size of members */
|
||||
__u16 v_flags;
|
||||
__u64 v_index;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_period -
|
||||
* @p_start:
|
||||
* @p_end:
|
||||
*/
|
||||
struct nilfs_period {
|
||||
__u64 p_start;
|
||||
__u64 p_end;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_cpstat -
|
||||
* @cs_cno: checkpoint number
|
||||
* @cs_ncps: number of checkpoints
|
||||
* @cs_nsss: number of snapshots
|
||||
*/
|
||||
struct nilfs_cpstat {
|
||||
__u64 cs_cno;
|
||||
__u64 cs_ncps;
|
||||
__u64 cs_nsss;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_sustat -
|
||||
* @ss_nsegs: number of segments
|
||||
* @ss_ncleansegs: number of clean segments
|
||||
* @ss_ndirtysegs: number of dirty segments
|
||||
* @ss_ctime: creation time of the last segment
|
||||
* @ss_nongc_ctime: creation time of the last segment not for GC
|
||||
* @ss_prot_seq: least sequence number of segments which must not be reclaimed
|
||||
*/
|
||||
struct nilfs_sustat {
|
||||
__u64 ss_nsegs;
|
||||
__u64 ss_ncleansegs;
|
||||
__u64 ss_ndirtysegs;
|
||||
__u64 ss_ctime;
|
||||
__u64 ss_nongc_ctime;
|
||||
__u64 ss_prot_seq;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_vinfo - virtual block number information
|
||||
* @vi_vblocknr:
|
||||
* @vi_start:
|
||||
* @vi_end:
|
||||
* @vi_blocknr:
|
||||
*/
|
||||
struct nilfs_vinfo {
|
||||
__u64 vi_vblocknr;
|
||||
__u64 vi_start;
|
||||
__u64 vi_end;
|
||||
__u64 vi_blocknr;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_vdesc -
|
||||
*/
|
||||
struct nilfs_vdesc {
|
||||
__u64 vd_ino;
|
||||
__u64 vd_cno;
|
||||
__u64 vd_vblocknr;
|
||||
struct nilfs_period vd_period;
|
||||
__u64 vd_blocknr;
|
||||
__u64 vd_offset;
|
||||
__u32 vd_flags;
|
||||
__u32 vd_pad;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct nilfs_bdesc -
|
||||
*/
|
||||
struct nilfs_bdesc {
|
||||
__u64 bd_ino;
|
||||
__u64 bd_oblocknr;
|
||||
__u64 bd_blocknr;
|
||||
__u64 bd_offset;
|
||||
__u32 bd_level;
|
||||
__u32 bd_pad;
|
||||
};
|
||||
|
||||
#define NILFS_IOCTL_IDENT 'n'
|
||||
|
||||
#define NILFS_IOCTL_CHANGE_CPMODE \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x80, struct nilfs_cpmode)
|
||||
#define NILFS_IOCTL_DELETE_CHECKPOINT \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x81, __u64)
|
||||
#define NILFS_IOCTL_GET_CPINFO \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x82, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_CPSTAT \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x83, struct nilfs_cpstat)
|
||||
#define NILFS_IOCTL_GET_SUINFO \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x84, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_SUSTAT \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x85, struct nilfs_sustat)
|
||||
#define NILFS_IOCTL_GET_VINFO \
|
||||
_IOWR(NILFS_IOCTL_IDENT, 0x86, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_GET_BDESCS \
|
||||
_IOWR(NILFS_IOCTL_IDENT, 0x87, struct nilfs_argv)
|
||||
#define NILFS_IOCTL_CLEAN_SEGMENTS \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x88, struct nilfs_argv[5])
|
||||
#define NILFS_IOCTL_SYNC \
|
||||
_IOR(NILFS_IOCTL_IDENT, 0x8A, __u64)
|
||||
#define NILFS_IOCTL_RESIZE \
|
||||
_IOW(NILFS_IOCTL_IDENT, 0x8B, __u64)
|
||||
|
||||
#endif /* _LINUX_NILFS_FS_H */
|
@@ -58,6 +58,25 @@ static inline int nls_strnicmp(struct nls_table *t, const unsigned char *s1,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* nls_nullsize - return length of null character for codepage
|
||||
* @codepage - codepage for which to return length of NULL terminator
|
||||
*
|
||||
* Since we can't guarantee that the null terminator will be a particular
|
||||
* length, we have to check against the codepage. If there's a problem
|
||||
* determining it, assume a single-byte NULL terminator.
|
||||
*/
|
||||
static inline int
|
||||
nls_nullsize(const struct nls_table *codepage)
|
||||
{
|
||||
int charlen;
|
||||
char tmp[NLS_MAX_CHARSET_SIZE];
|
||||
|
||||
charlen = codepage->uni2char(0, tmp, NLS_MAX_CHARSET_SIZE);
|
||||
|
||||
return charlen > 0 ? charlen : 1;
|
||||
}
|
||||
|
||||
#define MODULE_ALIAS_NLS(name) MODULE_ALIAS("nls_" __stringify(name))
|
||||
|
||||
#endif /* _LINUX_NLS_H */
|
||||
|
@@ -51,6 +51,16 @@ extern int of_register_driver(struct of_platform_driver *drv,
|
||||
struct bus_type *bus);
|
||||
extern void of_unregister_driver(struct of_platform_driver *drv);
|
||||
|
||||
/* Platform drivers register/unregister */
|
||||
static inline int of_register_platform_driver(struct of_platform_driver *drv)
|
||||
{
|
||||
return of_register_driver(drv, &of_platform_bus_type);
|
||||
}
|
||||
static inline void of_unregister_platform_driver(struct of_platform_driver *drv)
|
||||
{
|
||||
of_unregister_driver(drv);
|
||||
}
|
||||
|
||||
#include <asm/of_platform.h>
|
||||
|
||||
extern struct of_device *of_find_device_by_node(struct device_node *np);
|
||||
|
@@ -228,10 +228,11 @@ extern void parport_pc_release_resources(struct parport *p);
|
||||
extern int parport_pc_claim_resources(struct parport *p);
|
||||
|
||||
/* PCMCIA code will want to get us to look at a port. Provide a mechanism. */
|
||||
extern struct parport *parport_pc_probe_port (unsigned long base,
|
||||
unsigned long base_hi,
|
||||
int irq, int dma,
|
||||
struct device *dev);
|
||||
extern void parport_pc_unregister_port (struct parport *p);
|
||||
extern struct parport *parport_pc_probe_port(unsigned long base,
|
||||
unsigned long base_hi,
|
||||
int irq, int dma,
|
||||
struct device *dev,
|
||||
int irqflags);
|
||||
extern void parport_pc_unregister_port(struct parport *p);
|
||||
|
||||
#endif
|
||||
|
@@ -674,6 +674,11 @@ int __must_check pci_reenable_device(struct pci_dev *);
|
||||
int __must_check pcim_enable_device(struct pci_dev *pdev);
|
||||
void pcim_pin_device(struct pci_dev *pdev);
|
||||
|
||||
static inline int pci_is_enabled(struct pci_dev *pdev)
|
||||
{
|
||||
return (atomic_read(&pdev->enable_cnt) > 0);
|
||||
}
|
||||
|
||||
static inline int pci_is_managed(struct pci_dev *pdev)
|
||||
{
|
||||
return pdev->is_managed;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user