Unknown symbol问题!!急!

发布于 2022-09-23 12:39:22 字数 44103 浏览 14 评论 0

我在修改iscsi—target代码的时候遇到了这个问题,自己定义的函数可以编译通过,但是当加载模块的时候就提示我定义的函数和全局变量是Unknown symbol!!
我没有添加代码的时候结果是正确的~~iscsi.h是整个工程的头文件,其他的.c文件的函数都是在这里面定义的。
请高手一定帮忙阿!!我搞了好久了~~
通过dmesg查看结果:
iSCSI Enterprise Target Software - version 0.4.15
iotype_init(92) register fileio
iotype_init(92) register blockio
iotype_init(92) register nullio
iscsi_trgt: Unknown symbol get_ppos
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol init_ppos_table
iscsi_trgt: Unknown symbol set_ppos
iscsi_trgt: Unknown symbol get_ppos
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol set_ppos
iscsi_trgt: Unknown symbol get_ppos
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol set_ppos
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol ppos_table
iscsi_trgt: Unknown symbol ppos_table
iscsi_trgt: Unknown symbol ppos_table
我认为有关的源代码如下:
iscsi.h是原有的代码,table.c注释下的代码是我添加的。

  1. /*
  2. * Copyright (C) 2002-2003 Ardis Technolgies <[email]roman@ardistech.com[/email]>
  3. *
  4. * Released under the terms of the GNU GPL v2.0.
  5. */
  6. #ifndef __ISCSI_H__
  7. #define __ISCSI_H__
  8. #include <linux/pagemap.h>
  9. #include <linux/seq_file.h>
  10. #include <linux/mm.h>
  11. #include <linux/crypto.h>
  12. #include <net/sock.h>
  13. #include <asm/scatterlist.h>
  14. #include "iscsi_hdr.h"
  15. #include "iet_u.h"
  16. struct iscsi_sess_param {
  17.         int initial_r2t;
  18.         int immediate_data;
  19.         int max_connections;
  20.         int max_recv_data_length;
  21.         int max_xmit_data_length;
  22.         int max_burst_length;
  23.         int first_burst_length;
  24.         int default_wait_time;
  25.         int default_retain_time;
  26.         int max_outstanding_r2t;
  27.         int data_pdu_inorder;
  28.         int data_sequence_inorder;
  29.         int error_recovery_level;
  30.         int header_digest;
  31.         int data_digest;
  32.         int ofmarker;
  33.         int ifmarker;
  34.         int ofmarkint;
  35.         int ifmarkint;
  36. };
  37. struct iscsi_trgt_param {
  38.         int wthreads;
  39.         int target_type;
  40.         int queued_cmnds;
  41. };
  42. struct tio {
  43.         u32 pg_cnt;
  44.         pgoff_t idx;
  45.         u32 offset;
  46.         u32 size;
  47.         struct page **pvec;
  48.         atomic_t count;
  49. };
  50. struct network_thread_info {
  51.         struct task_struct *task;
  52.         unsigned long flags;
  53.         struct list_head active_conns;
  54.         spinlock_t nthread_lock;
  55.         void (*old_state_change)(struct sock *);
  56.         void (*old_data_ready)(struct sock *, int);
  57. };
  58. struct worker_thread_info;
  59. struct worker_thread {
  60.         struct task_struct *w_task;
  61.         struct list_head w_list;
  62.         struct worker_thread_info *w_info;
  63. };
  64. struct worker_thread_info {
  65.         spinlock_t wthread_lock;
  66.         u32 nr_running_wthreads;
  67.         struct list_head wthread_list;
  68.         struct list_head work_queue;
  69.         wait_queue_head_t wthread_sleep;
  70. };
  71. struct iscsi_cmnd;
  72. struct target_type {
  73.         int id;
  74.         int (*execute_cmnd) (struct iscsi_cmnd *);
  75. };
  76. enum iscsi_device_state {
  77.         IDEV_RUNNING,
  78.         IDEV_DEL,
  79. };
  80. struct iscsi_target {
  81.         struct list_head t_list;
  82.         u32 tid;
  83.         char name[ISCSI_NAME_LEN];
  84.         struct iscsi_sess_param sess_param;
  85.         struct iscsi_trgt_param trgt_param;
  86.         atomic_t nr_volumes;
  87.         struct list_head volumes;
  88.         struct list_head session_list;
  89.         struct network_thread_info nthread_info;
  90.         struct worker_thread_info wthread_info;
  91.         struct semaphore target_sem;
  92.         struct list_head initiator_list;
  93.         u32 initiator_iid_count;
  94. };
  95. struct iscsi_queue {
  96.         spinlock_t queue_lock;
  97.         struct iscsi_cmnd *ordered_cmnd;
  98.         struct list_head wait_list;
  99.         int active_cnt;
  100. };
  101. struct iet_volume {
  102.         u32 lun;
  103.         enum iscsi_device_state l_state;
  104.         atomic_t l_count;
  105.         struct iscsi_target *target;
  106.         struct list_head list;
  107.         struct iscsi_queue queue;
  108.         u8 scsi_id[SCSI_ID_LEN];
  109.         u8 scsi_sn[SCSI_SN_LEN];
  110.         u32 blk_shift;
  111.         u64 blk_cnt;
  112.         u64 reserve_sid;
  113.         spinlock_t reserve_lock;
  114.         unsigned long flags;
  115.         struct iotype *iotype;
  116.         void *private;
  117. };
  118. enum lu_flags {
  119.         LU_READONLY,
  120.         LU_ASYNC,
  121. };
  122. #define LUReadonly(lu) test_bit(LU_READONLY, &(lu)->flags)
  123. #define SetLUReadonly(lu) set_bit(LU_READONLY, &(lu)->flags)
  124. #define LUAsync(lu) test_bit(LU_ASYNC, &(lu)->flags)
  125. #define SetLUAsync(lu) set_bit(LU_ASYNC, &(lu)->flags)
  126. #define IET_HASH_ORDER                8
  127. #define        cmnd_hashfn(itt)        hash_long((itt), IET_HASH_ORDER)
  128. struct iscsi_session {
  129.         struct list_head list;
  130.         struct iscsi_target *target;
  131.         char *initiator;
  132.         u64 sid;
  133.         u32 exp_cmd_sn;
  134.         u32 max_cmd_sn;
  135.         struct iscsi_sess_param param;
  136.         u32 max_queued_cmnds;
  137.         struct list_head conn_list;
  138.         struct list_head pending_list;
  139.         spinlock_t cmnd_hash_lock;
  140.         struct list_head cmnd_hash[1 << IET_HASH_ORDER];
  141.         u32 next_ttt;
  142.         struct iscsi_initiator *rinitiator;
  143. };
  144. enum connection_state_bit {
  145.         CONN_ACTIVE,
  146.         CONN_CLOSING,
  147. };
  148. #define ISCSI_CONN_IOV_MAX        (((256 << 10) >> PAGE_SHIFT) + 1)
  149. struct iscsi_conn {
  150.         struct list_head list;                        /* list entry in session list */
  151.         struct iscsi_session *session;                /* owning session */
  152.         u16 cid;
  153.         unsigned long state;
  154.         u32 stat_sn;
  155.         u32 exp_stat_sn;
  156.         int hdigest_type;
  157.         int ddigest_type;
  158.         struct list_head poll_list;
  159.         struct file *file;
  160.         struct socket *sock;
  161.         spinlock_t list_lock;
  162.         atomic_t nr_cmnds;
  163.         atomic_t nr_busy_cmnds;
  164.         struct list_head pdu_list;                /* in/outcoming pdus */
  165.         struct list_head write_list;                /* list of data pdus to be sent */
  166.         struct iscsi_cmnd *read_cmnd;
  167.         struct msghdr read_msg;
  168.         struct iovec read_iov[ISCSI_CONN_IOV_MAX];
  169.         u32 read_size;
  170.         u32 read_overflow;
  171.         int read_state;
  172.         struct iscsi_cmnd *write_cmnd;
  173.         struct iovec write_iov[ISCSI_CONN_IOV_MAX];
  174.         struct iovec *write_iop;
  175.         struct tio *write_tcmnd;
  176.         u32 write_size;
  177.         u32 write_offset;
  178.         int write_state;
  179.         struct hash_desc rx_hash;
  180.         struct hash_desc tx_hash;
  181.         struct scatterlist hash_sg[ISCSI_CONN_IOV_MAX];
  182. };
  183. struct iscsi_pdu {
  184.         struct iscsi_hdr bhs;
  185.         void *ahs;
  186.         unsigned int ahssize;
  187.         unsigned int datasize;
  188. };
  189. typedef void (iet_show_info_t)(struct seq_file *seq, struct iscsi_target *target);
  190. struct iscsi_cmnd {
  191.         struct list_head list;
  192.         struct list_head conn_list;
  193.         unsigned long flags;
  194.         struct iscsi_conn *conn;
  195.         struct iet_volume *lun;
  196.         struct iscsi_pdu pdu;
  197.         struct list_head pdu_list;
  198.         struct list_head hash_list;
  199.         struct tio *tio;
  200.         u32 r2t_sn;
  201.         u32 r2t_length;
  202.         u32 is_unsolicited_data;
  203.         u32 target_task_tag;
  204.         u32 outstanding_r2t;
  205.         u32 hdigest;
  206.         u32 ddigest;
  207.         struct iscsi_cmnd *req;
  208. };
  209. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  210. //映射表数据结构
  211. struct ppos_list_node
  212. {
  213.         loff_t ppos;
  214.         u32 offset;
  215.         struct ppos_list_node *next;
  216. };
  217. struct ppos
  218. {
  219.         struct ppos_list_node *newppos;
  220.         int node_num;
  221. };
  222. struct ppos_table
  223. {
  224.         struct ppos ppos_item[1024];
  225.         loff_t ppos_now;
  226. };
  227. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  228. #define ISCSI_OP_SCSI_REJECT        ISCSI_OP_VENDOR1_CMD
  229. #define ISCSI_OP_PDU_REJECT        ISCSI_OP_VENDOR2_CMD
  230. #define ISCSI_OP_DATA_REJECT        ISCSI_OP_VENDOR3_CMD
  231. #define ISCSI_OP_SCSI_ABORT        ISCSI_OP_VENDOR4_CMD
  232. /* iscsi.c */
  233. extern struct iscsi_cmnd *cmnd_alloc(struct iscsi_conn *, int);
  234. extern void cmnd_rx_start(struct iscsi_cmnd *);
  235. extern void cmnd_rx_end(struct iscsi_cmnd *);
  236. extern void cmnd_tx_start(struct iscsi_cmnd *);
  237. extern void cmnd_tx_end(struct iscsi_cmnd *);
  238. extern void cmnd_release(struct iscsi_cmnd *, int);
  239. extern void send_data_rsp(struct iscsi_cmnd *, int (*)(struct iscsi_cmnd *));
  240. extern void send_scsi_rsp(struct iscsi_cmnd *, int (*)(struct iscsi_cmnd *));
  241. /* tio.c */
  242. extern int tio_init(void);
  243. extern void tio_exit(void);
  244. extern struct tio *tio_alloc(int);
  245. extern void tio_get(struct tio *);
  246. extern void tio_put(struct tio *);
  247. extern void tio_set(struct tio *, u32, loff_t);
  248. extern int tio_read(struct iet_volume *, struct tio *);
  249. extern int tio_write(struct iet_volume *, struct tio *);
  250. extern int tio_sync(struct iet_volume *, struct tio *);
  251. /* iotype.c */
  252. extern struct iotype *get_iotype(const char *name);
  253. extern void put_iotype(struct iotype *iot);
  254. /* params.c */
  255. extern int iscsi_param_set(struct iscsi_target *, struct iscsi_param_info *, int);
  256. /* target_disk.c */
  257. extern struct target_type disk_ops;
  258. /* event.c */
  259. extern int event_send(u32, u64, u32, u32, int);
  260. extern int event_init(void);
  261. extern void event_exit(void);
  262. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  263. /*table.c*/
  264. extern int table_init(void);
  265. extern void table_exit(void);
  266. extern void insert_list(struct ppos_list_node *, struct ppos_list_node *);
  267. extern int init_ppos_table(struct ppos_table *);
  268. extern loff_t set_ppos(loff_t, struct ppos_table *);
  269. extern loff_t get_ppos(loff_t, struct ppos_table *);
  270. extern struct ppos_table *ppos_table;
  271. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  272. #define get_pgcnt(size, offset)        ((((size) + ((offset) & ~PAGE_CACHE_MASK)) + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT)
  273. static inline void iscsi_cmnd_get_length(struct iscsi_pdu *pdu)
  274. {
  275. #if defined(__BIG_ENDIAN)
  276.         pdu->ahssize = pdu->bhs.length.ahslength * 4;
  277.         pdu->datasize = pdu->bhs.length.datalength;
  278. #elif defined(__LITTLE_ENDIAN)
  279.         pdu->ahssize = (pdu->bhs.length & 0xff) * 4;
  280.         pdu->datasize = be32_to_cpu(pdu->bhs.length & ~0xff);
  281. #else
  282. #error
  283. #endif
  284. }
  285. static inline void iscsi_cmnd_set_length(struct iscsi_pdu *pdu)
  286. {
  287. #if defined(__BIG_ENDIAN)
  288.         pdu->bhs.length.ahslength = pdu->ahssize / 4;
  289.         pdu->bhs.length.datalength = pdu->datasize;
  290. #elif defined(__LITTLE_ENDIAN)
  291.         pdu->bhs.length = cpu_to_be32(pdu->datasize) | (pdu->ahssize / 4);
  292. #else
  293. #error
  294. #endif
  295. }
  296. #define cmnd_hdr(cmnd) ((struct iscsi_scsi_cmd_hdr *) (&((cmnd)->pdu.bhs)))
  297. #define cmnd_ttt(cmnd) cpu_to_be32((cmnd)->pdu.bhs.ttt)
  298. #define cmnd_itt(cmnd) cpu_to_be32((cmnd)->pdu.bhs.itt)
  299. #define cmnd_opcode(cmnd) ((cmnd)->pdu.bhs.opcode & ISCSI_OPCODE_MASK)
  300. #define cmnd_scsicode(cmnd) cmnd_hdr(cmnd)->scb[0]
  301. #define        SECTOR_SIZE_BITS        9
  302. enum cmnd_flags {
  303.         CMND_hashed,
  304.         CMND_queued,
  305.         CMND_final,
  306.         CMND_waitio,
  307.         CMND_close,
  308.         CMND_lunit,
  309.         CMND_pending,
  310.         CMND_tmfabort,
  311.         CMND_rxstart,
  312. };
  313. #define set_cmnd_hashed(cmnd)        set_bit(CMND_hashed, &(cmnd)->flags)
  314. #define cmnd_hashed(cmnd)        test_bit(CMND_hashed, &(cmnd)->flags)
  315. #define set_cmnd_queued(cmnd)        set_bit(CMND_queued, &(cmnd)->flags)
  316. #define cmnd_queued(cmnd)        test_bit(CMND_queued, &(cmnd)->flags)
  317. #define set_cmnd_final(cmnd)        set_bit(CMND_final, &(cmnd)->flags)
  318. #define cmnd_final(cmnd)        test_bit(CMND_final, &(cmnd)->flags)
  319. #define set_cmnd_waitio(cmnd)        set_bit(CMND_waitio, &(cmnd)->flags)
  320. #define cmnd_waitio(cmnd)        test_bit(CMND_waitio, &(cmnd)->flags)
  321. #define set_cmnd_close(cmnd)        set_bit(CMND_close, &(cmnd)->flags)
  322. #define cmnd_close(cmnd)        test_bit(CMND_close, &(cmnd)->flags)
  323. #define set_cmnd_lunit(cmnd)        set_bit(CMND_lunit, &(cmnd)->flags)
  324. #define cmnd_lunit(cmnd)        test_bit(CMND_lunit, &(cmnd)->flags)
  325. #define set_cmnd_pending(cmnd)        set_bit(CMND_pending, &(cmnd)->flags)
  326. #define clear_cmnd_pending(cmnd)        clear_bit(CMND_pending, &(cmnd)->flags)
  327. #define cmnd_pending(cmnd)        test_bit(CMND_pending, &(cmnd)->flags)
  328. #define set_cmnd_tmfabort(cmnd)        set_bit(CMND_tmfabort, &(cmnd)->flags)
  329. #define cmnd_tmfabort(cmnd)        test_bit(CMND_tmfabort, &(cmnd)->flags)
  330. #define set_cmnd_rxstart(cmnd)        set_bit(CMND_rxstart, &(cmnd)->flags)
  331. #define cmnd_rxstart(cmnd)        test_bit(CMND_rxstart, &(cmnd)->flags)
  332. #define VENDOR_ID        "IET"
  333. #define PRODUCT_ID        "VIRTUAL-DISK"
  334. #define PRODUCT_REV        "0"
  335. #endif        /* __ISCSI_H__ */

复制代码

table.c是我自己实现的文件

  1. #include "iscsi.h"
  2. #include "iscsi_dbg.h"
  3. #include "iotype.h"
  4. void insert_list(struct ppos_list_node *ppos_list, struct ppos_list_node *list_node)
  5. {
  6.         list_node->next = ppos_list;
  7.         ppos_list = list_node;
  8. }
  9. int init_ppos_table(struct ppos_table *mytable)
  10. {
  11.         int i;
  12.         mytable = (struct ppos_table *)kzalloc(sizeof(*mytable), GFP_KERNEL);
  13.         if(!mytable)
  14.                 return -ENOMEM;
  15.         for(i = 0; i < 1024; i++)
  16.         {
  17.                 mytable->ppos_item[i].newppos = NULL;
  18.                 mytable->ppos_item[i].node_num = 0;
  19.         }
  20.         mytable->ppos_now = -1;
  21.         return 0;
  22. }
  23. loff_t get_ppos(loff_t ppos, struct ppos_table *mytable)//参数是页面偏移加页内偏移量
  24. {
  25.         u32 myoffset;
  26.         loff_t myppos;
  27.         int i;
  28.         i = (int) ppos >> PAGE_CACHE_SHIFT;
  29.         myoffset = ppos & ~PAGE_CACHE_MASK;
  30.         myppos = mytable->ppos_item[i].newppos->ppos << PAGE_CACHE_SHIFT;
  31.         myppos += myoffset;
  32.         return myppos;
  33. }
  34. loff_t set_ppos(loff_t ppos, struct ppos_table *mytable) //参数是页面偏移加页内偏移量
  35. {
  36.         u32 myoffset;
  37.         loff_t myppos;
  38.         struct ppos_list_node *newnode;
  39.         newnode = kzalloc(sizeof(*newnode), GFP_KERNEL);
  40.         newnode->next = NULL;
  41.         myoffset = ppos & ~PAGE_CACHE_MASK;
  42.         myppos = (int) ppos >> PAGE_CACHE_SHIFT;
  43.         newnode->ppos = ++(mytable->ppos_now);
  44.         newnode->offset = myoffset;
  45.         insert_list(mytable->ppos_item[myppos].newppos, newnode);
  46.         return ((mytable->ppos_now << PAGE_CACHE_SHIFT) + myoffset);
  47. }
  48. int table_init(void)
  49. {
  50.         int i = init_ppos_table(ppos_table);
  51.         return i;
  52. }
  53. void table_exit(void)
  54. {
  55. }

复制代码

file-io.c是调用这些函数的文件,调用代码都在fileio_make_request函数中~~

  1. /*
  2. * Target device file I/O.
  3. * (C) 2004 - 2005 FUJITA Tomonori <[email]tomof@acm.org[/email]>
  4. * This code is licenced under the GPL.
  5. */
  6. #include <linux/blkdev.h>
  7. #include <linux/writeback.h>
  8. #include <linux/parser.h>
  9. #include "iscsi.h"
  10. #include "iscsi_dbg.h"
  11. #include "iotype.h"
  12. struct fileio_data {
  13.         char *path;
  14.         struct file *filp;
  15. };
  16. static int fileio_make_request(struct iet_volume *lu, struct tio *tio, int rw)
  17. {
  18.         struct fileio_data *p = lu->private;
  19.         struct file *filp;
  20.         mm_segment_t oldfs;
  21.         struct page *page;
  22.         u32 offset, size;
  23.         loff_t ppos, count,newppos;
  24.         char *buf;
  25.         int i, err = 0;
  26.         ssize_t ret;
  27.         assert(p);
  28.         filp = p->filp;
  29.         size = tio->size;
  30.         offset= tio->offset;
  31.         ppos = (loff_t) tio->idx << (PAGE_CACHE_SHIFT + 2);
  32.         ppos += offset;
  33.         for (i = 0; i < tio->pg_cnt; i++) {
  34.                 page = tio->pvec[i];
  35.                 assert(page);
  36.                 buf = page_address(page);
  37.                 buf += offset;
  38.                 if (offset + size > PAGE_CACHE_SIZE)
  39.                         count = PAGE_CACHE_SIZE - offset;
  40.                 else
  41.                         count = size;
  42.                 oldfs = get_fs();
  43.                 set_fs(get_ds());
  44. [color=Red]                if (rw == READ)
  45.                 {
  46.                         newppos = get_ppos(ppos, ppos_table);
  47.                         ret = do_sync_read(filp, buf, count, &newppos);
  48.                 }
  49.                 else
  50.                 {
  51.                         newppos = set_ppos(ppos, ppos_table);
  52.                         ret = do_sync_write(filp, buf, count, &newppos);
  53.                 }[/color]
  54.                 set_fs(oldfs);
  55.                 if (ret != count) {
  56.                         eprintk("I/O error %lld, %ld\n", count, (long) ret);
  57.                         err = -EIO;
  58.                 }
  59.                 size -= count;
  60.                 offset = 0;
  61.         }
  62.         assert(!size);
  63.         return err;
  64. }
  65. static int fileio_sync(struct iet_volume *lu, struct tio *tio)
  66. {
  67.         struct fileio_data *p = lu->private;
  68.         struct inode *inode = p->filp->f_dentry->d_inode;
  69.         struct address_space *mapping = inode->i_mapping;
  70.         loff_t ppos, count;
  71.         int res;
  72.         if (tio) {
  73.                 ppos = (loff_t) tio->idx << PAGE_CACHE_SHIFT;
  74.                 count = tio->size;
  75.         } else {
  76.                 ppos = 0;
  77.                 count = lu->blk_cnt << lu->blk_shift;
  78.         }
  79.         res = sync_page_range(inode, mapping, ppos, count);
  80.         if (res) {
  81.                 eprintk("I/O error: syncing pages failed: %d\n", res);
  82.                 return -EIO;
  83.         } else
  84.                 return 0;
  85. }
  86. static int open_path(struct iet_volume *volume, const char *path)
  87. {
  88.         int err = 0;
  89.         struct fileio_data *info = volume->private;
  90.         struct file *filp;
  91.         mm_segment_t oldfs;
  92.         int flags;
  93.         info->path = kstrdup(path, GFP_KERNEL);
  94.         if (!info->path)
  95.                 return -ENOMEM;
  96.         oldfs = get_fs();
  97.         set_fs(get_ds());
  98.         flags = (LUReadonly(volume) ? O_RDONLY : O_RDWR) | O_LARGEFILE;
  99.         filp = filp_open(path, flags, 0);
  100.         set_fs(oldfs);
  101.         if (IS_ERR(filp)) {
  102.                 err = PTR_ERR(filp);
  103.                 eprintk("Can't open %s %d\n", path, err);
  104.                 info->filp = NULL;
  105.         } else
  106.                 info->filp = filp;
  107.         return err;
  108. }
  109. static int set_scsiid(struct iet_volume *volume, const char *id)
  110. {
  111.         size_t len;
  112.         if ((len = strlen(id)) > SCSI_ID_LEN - VENDOR_ID_LEN) {
  113.                 eprintk("SCSI ID too long, %zd provided, %u max\n", len,
  114.                         SCSI_ID_LEN - VENDOR_ID_LEN);
  115.                 return -EINVAL;
  116.         }
  117.         memcpy(volume->scsi_id + VENDOR_ID_LEN, id, len);
  118.         return 0;
  119. }
  120. static void gen_scsiid(struct iet_volume *volume, struct inode *inode)
  121. {
  122.         int i;
  123.         u32 *p;
  124.         strlcpy(volume->scsi_id, VENDOR_ID, VENDOR_ID_LEN);
  125.         for (i = VENDOR_ID_LEN; i < SCSI_ID_LEN; i++)
  126.                 if (volume->scsi_id[i])
  127.                         return;
  128.         p = (u32 *) (volume->scsi_id + VENDOR_ID_LEN);
  129.         *(p + 0) = volume->target->trgt_param.target_type;
  130.         *(p + 1) = volume->target->tid;
  131.         *(p + 2) = (unsigned int) inode->i_ino;
  132.         *(p + 3) = (unsigned int) inode->i_sb->s_dev;
  133. }
  134. static int set_scsisn(struct iet_volume *volume, const char *sn)
  135. {
  136.         size_t len;
  137.         if ((len = strlen(sn)) > SCSI_SN_LEN) {
  138.                 eprintk("SCSI SN too long, %zd provided, %u max\n", len,
  139.                         SCSI_SN_LEN);
  140.                 return -EINVAL;
  141.         }
  142.         memcpy(volume->scsi_sn, sn, len);
  143.         return 0;
  144. }
  145. enum {
  146.         Opt_scsiid, Opt_scsisn, Opt_path, Opt_ignore, Opt_err,
  147. };
  148. static match_table_t tokens = {
  149.         {Opt_scsiid, "ScsiId=%s"},
  150.         {Opt_scsisn, "ScsiSN=%s"},
  151.         {Opt_path, "Path=%s"},
  152.         {Opt_ignore, "Type=%s"},
  153.         {Opt_ignore, "IOMode=%s"},
  154.         {Opt_err, NULL},
  155. };
  156. static int parse_fileio_params(struct iet_volume *volume, char *params)
  157. {
  158.         int err = 0;
  159.         char *p, *q;
  160.         while ((p = strsep(¶ms, ",")) != NULL) {
  161.                 substring_t args[MAX_OPT_ARGS];
  162.                 int token;
  163.                 if (!*p)
  164.                         continue;
  165.                 token = match_token(p, tokens, args);
  166.                 switch (token) {
  167.                 case Opt_scsiid:
  168.                         if (!(q = match_strdup(&args[0]))) {
  169.                                 err = -ENOMEM;
  170.                                 goto out;
  171.                         }
  172.                         err = set_scsiid(volume, q);
  173.                         kfree(q);
  174.                         if (err < 0)
  175.                                 goto out;
  176.                         break;
  177.                 case Opt_scsisn:
  178.                         if (!(q = match_strdup(&args[0]))) {
  179.                                 err = -ENOMEM;
  180.                                 goto out;
  181.                         }
  182.                         err = set_scsisn(volume, q);
  183.                         kfree(q);
  184.                         if (err < 0)
  185.                                 goto out;
  186.                         break;
  187.                 case Opt_path:
  188.                         if (!(q = match_strdup(&args[0]))) {
  189.                                 err = -ENOMEM;
  190.                                 goto out;
  191.                         }
  192.                         err = open_path(volume, q);
  193.                         kfree(q);
  194.                         if (err < 0)
  195.                                 goto out;
  196.                         break;
  197.                 case Opt_ignore:
  198.                         break;
  199.                 default:
  200.                         eprintk("Unknown %s\n", p);
  201.                         return -EINVAL;
  202.                 }
  203.         }
  204. out:
  205.         return err;
  206. }
  207. static void fileio_detach(struct iet_volume *lu)
  208. {
  209.         struct fileio_data *p = lu->private;
  210.         kfree(p->path);
  211.         if (p->filp)
  212.                 filp_close(p->filp, NULL);
  213.         kfree(p);
  214.         lu->private = NULL;
  215. }
  216. static int fileio_attach(struct iet_volume *lu, char *args)
  217. {
  218.         int err = 0;
  219.         struct fileio_data *p;
  220.         struct inode *inode;
  221.         if (lu->private) {
  222.                 printk("already attached ? %d\n", lu->lun);
  223.                 return -EBUSY;
  224.         }
  225.         p = kzalloc(sizeof(*p), GFP_KERNEL);
  226.         if (!p)
  227.                 return -ENOMEM;
  228.         lu->private = p;
  229.         if ((err = parse_fileio_params(lu, args)) < 0) {
  230.                 eprintk("%d\n", err);
  231.                 goto out;
  232.         }
  233.         inode = p->filp->f_dentry->d_inode;
  234.         gen_scsiid(lu, inode);
  235.         if (S_ISREG(inode->i_mode))
  236.                 ;
  237.         else if (S_ISBLK(inode->i_mode))
  238.                 inode = inode->i_bdev->bd_inode;
  239.         else {
  240.                 err = -EINVAL;
  241.                 goto out;
  242.         }
  243.         lu->blk_shift = SECTOR_SIZE_BITS;
  244.         lu->blk_cnt = inode->i_size >> (lu->blk_shift + 2);
  245. out:
  246.         if (err < 0)
  247.                 fileio_detach(lu);
  248.         return err;
  249. }
  250. void fileio_show(struct iet_volume *lu, struct seq_file *seq)
  251. {
  252.         struct fileio_data *p = lu->private;
  253.         seq_printf(seq, " path:%s\n", p->path);
  254. }
  255. struct iotype fileio =
  256. {
  257.         .name = "fileio",
  258.         .attach = fileio_attach,
  259.         .make_request = fileio_make_request,
  260.         .sync = fileio_sync,
  261.         .detach = fileio_detach,
  262.         .show = fileio_show,
  263. };

复制代码
[ 本帖最后由 lianxi1999 于 2008-12-5 11:29 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

昨迟人 2022-09-30 12:39:22

这一系列的:
iscsi_trgt: Unknown symbol get_ppos
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol init_ppos_table
iscsi_trgt: Unknown symbol set_ppos
iscsi_trgt: Unknown symbol get_ppos
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol set_ppos
iscsi_trgt: Unknown symbol get_ppos
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol set_ppos
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol mytable
iscsi_trgt: Unknown symbol ppos_table
iscsi_trgt: Unknown symbol ppos_table
iscsi_trgt: Unknown symbol ppos_table

有两个可行的解决方案:
1. 你可以把定义这些symbol的源文件包进来,一起编译;
2. 这些symbol,他们的头文件可能你确实包进来了;但是,对于Linux内核模块,如果相应模块并没有调用EXPORT_SYMBOL() or EXPORT_SYMBOL_GPL()——模块导出符号表可供其它模块引用。那么其他模块去引用它,当然就不行了。

冷情妓 2022-09-30 12:39:22

我这里只有一个模块啊~
并且这些函数都是定义在table.c中的,编译也是一起编译的,并没有多个模块~~

旧时浪漫 2022-09-30 12:39:22

你得makefile怎么写的,贴出来看看
肯定是没有把table.c这个文件编译进去

执手闯天涯 2022-09-30 12:39:22

你的iscsi的target 连接模块问题

Spring初心 2022-09-30 12:39:22

这是整个工程的makefile

  1. #
  2. # Makefile for the Linux kernel device drivers.
  3. #
  4. # Note! Dependencies are done automagically by 'make dep', which also
  5. # removes any old dependencies. DON'T put your own dependencies here
  6. # unless it's something special (not a .c file).
  7. #
  8. # Note 2! The CFLAGS definitions are now in the main makefile.
  9. #export KSRC := /usr/src/linux
  10. SUBDIRS := $(shell pwd)
  11. ifeq ($(KSRC),)
  12.         KSRC ?= /lib/modules/$(shell uname -r)/build
  13. endif
  14. ifneq ($(wildcard $(KSRC)/include/linux/utsrelease.h),)
  15.         VERSION_FILE := $(KSRC)/include/linux/utsrelease.h
  16. else
  17.         VERSION_FILE := $(KSRC)/include/linux/version.h
  18. endif
  19. KVER := $(shell $(CC) $(CFLAGS) -E -dM $(VERSION_FILE) | \
  20.         grep UTS_RELEASE | awk '{ print $$3 }' | sed 's/\"//g')
  21. KMOD := /lib/modules/$(KVER)/kernel
  22. KMAJ := $(shell echo $(KVER) | \
  23.         sed -e 's/^\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*.*/\1/')
  24. KMIN := $(shell echo $(KVER) | \
  25.         sed -e 's/^[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*.*/\1/')
  26. KREV := $(shell echo $(KVER) | \
  27.         sed -e 's/^[0-9][0-9]*\.[0-9][0-9]*\.\([0-9][0-9]*\).*/\1/')
  28. kver_eq = $(shell [ $(KMAJ)$(KMIN)$(KREV) -eq $(1)$(2)$(3) ] && \
  29.         echo 1 || echo 0)
  30. kver_lt = $(shell [ $(KMAJ)$(KMIN)$(KREV) -lt $(1)$(2)$(3) ] && \
  31.         echo 1 || echo 0)
  32. kver_le = $(shell [ $(KMAJ)$(KMIN)$(KREV) -le $(1)$(2)$(3) ] && \
  33.         echo 1 || echo 0)
  34. kver_gt = $(shell [ $(KMAJ)$(KMIN)$(KREV) -gt $(1)$(2)$(3) ] && \
  35.         echo 1 || echo 0)
  36. kver_ge = $(shell [ $(KMAJ)$(KMIN)$(KREV) -ge $(1)$(2)$(3) ] && \
  37.         echo 1 || echo 0)
  38. kver_lk = $(shell [ `echo $(KVER) | egrep $(1)` ] && echo 1 || echo 0)
  39. #
  40. # Please when adding patch sets start with the latest to the earliest
  41. # the idea behind this is that by properly patching the latest code
  42. # base first the earlier patch sets will not need to be modified.
  43. #
  44. # Compatibility patch for kernels >= 2.6.14 and <= 2.6.18
  45. ifeq ($(call kver_le,2,6,18),1)
  46.         PATCHES := $(PATCHES) compat-2.6.14-2.6.18.patch
  47. endif
  48. # We don't support kernels < 2.6.14 except for explicit distros
  49. ifeq ($(call kver_lt,2,6,14),1)
  50.         UNSUPPORTED := true
  51. endif
  52. # Compatibility patch for RHEL4/CentOS4
  53. ifeq ($(call kver_lk,"2\.6\.9-.*\.(EL|plus\.c4)"),1)
  54.         PATCHES += compat-rhel4.patch
  55.         UNSUPPORTED :=
  56. endif
  57. MANPAGES:= ietadm.8 ietd.8 ietd.conf.5
  58. ifeq ($(MANDIR),)
  59.         MANPATH := $(shell (manpath 2>/dev/null || \
  60.                 echo $MANPATH) | sed 's/:/ /g')
  61.         ifneq ($(MANPATH),)
  62.                 test_dir = $(findstring $(dir), $(MANPATH))
  63.         else
  64.                 test_dir = $(shell [ -e $(dir) ] && echo $(dir))
  65.         endif
  66.         MANDIR := /usr/share/man /usr/man
  67.         MANDIR := $(foreach dir, $(MANDIR), $(test_dir))
  68.         MANDIR := $(firstword $(MANDIR))
  69. endif
  70. ifeq ($(MANDIR),)
  71.         MANDIR := /usr/share/man
  72. endif
  73. DOCS:= ChangeLog COPYING README README.vmware
  74. ifeq ($(DOCDIR),)
  75.         DOCDIR := /usr/share/doc/iscsitarget
  76. endif
  77. all: usr kernel
  78. usr: patch
  79.         $(MAKE) -C usr
  80. kernel: patch
  81.         $(MAKE) -C $(KSRC) SUBDIRS=$(shell pwd)/kernel modules
  82. patch: $(UNSUPPORTED) integ_check $(PATCHES)
  83. $(UNSUPPORTED):
  84.         @echo "Sorry, your kernel version and/or distribution is currently"
  85.         @echo "not supported."
  86.         @echo ""
  87.         @echo "Please read the README file for information on how you can"
  88.         @echo "contribute compatibility/bug fixes to the IET project."
  89.         @exit 1
  90. integ_check:
  91.         @if [ -e .patched.* -a ! -e .patched.$(KVER) ]; then \
  92.                 $(MAKE) unpatch; \
  93.         fi
  94. $(PATCHES): .patched.$(KVER)
  95. .patched.$(KVER):
  96.         @set -e; \
  97.         if [ ! -e .patched.* ]; then \
  98.                 for p in $(PATCHES); do \
  99.                         echo "Applying Patch $$p"; \
  100.                         patch -p0 < patches/$$p; \
  101.                         echo $$p >>.patched.$(KVER); \
  102.                 done; \
  103.         fi
  104. unpatch:
  105.         @set -e; \
  106.         if [ -e .patched.* ]; then \
  107.                 for p in `cat .patched.*`; do \
  108.                         reverse="$$p $$reverse"; \
  109.                 done; \
  110.                 for r in $$reverse; do \
  111.                         echo "Reversing patch $$r"; \
  112.                         patch -p0 -R < patches/$$r; \
  113.                 done; \
  114.                 rm -f .patched.*; \
  115.         fi
  116. install: install-kernel install-usr install-etc install-doc
  117. install-kernel: kernel/iscsi_trgt.ko
  118.         @install -vD kernel/iscsi_trgt.ko \
  119.                 $(DISTDIR)$(INSTALL_MOD_PATH)$(KMOD)/iscsi/iscsi_trgt.ko
  120.         -depmod -aq
  121. install-usr: usr/ietd usr/ietadm
  122.         @install -vD usr/ietd $(DISTDIR)/usr/sbin/ietd
  123.         @install -vD usr/ietadm $(DISTDIR)/usr/sbin/ietadm
  124. install-etc: install-initd
  125.         @if [ ! -e /etc/ietd.conf ]; then \
  126.                 install -vD -m 644 etc/ietd.conf \
  127.                         $(DISTDIR)/etc/ietd.conf; \
  128.         fi
  129.         @if [ ! -e /etc/initiators.allow ]; then \
  130.                 install -vD -m 644 etc/initiators.allow \
  131.                         $(DISTDIR)/etc/initiators.allow; \
  132.         fi
  133.         @if [ ! -e /etc/initiators.deny ]; then \
  134.                 install -vD -m 644 etc/initiators.deny \
  135.                         $(DISTDIR)/etc/initiators.deny; \
  136.         fi
  137. install-initd:
  138.         @if [ -f /etc/debian_version ]; then \
  139.                 install -vD -m 755 etc/initd/initd.debian \
  140.                         $(DISTDIR)/etc/init.d/iscsi-target; \
  141.         elif [ -f /etc/redhat-release ]; then \
  142.                 install -vD -m 755 etc/initd/initd.redhat \
  143.                         $(DISTDIR)/etc/init.d/iscsi-target; \
  144.         elif [ -f /etc/gentoo-release ]; then \
  145.                 install -vD -m 755 etc/initd/initd.gentoo \
  146.                         $(DISTDIR)/etc/init.d/iscsi-target; \
  147.         elif [ -f /etc/slackware-version ]; then \
  148.                 install -vD -m 755 etc/initd/initd \
  149.                         $(DISTDIR)/etc/rc.d/iscsi-target; \
  150.         else \
  151.                 install -vD -m 755 etc/initd/initd \
  152.                         $(DISTDIR)/etc/init.d/iscsi-target; \
  153.         fi
  154. install-doc: install-man
  155.         @ok=true; for f in $(DOCS) ; \
  156.                 do [ -e $$f ] || \
  157.                         { echo $$f missing ; ok=false; } ; \
  158.         done ; $$ok
  159.         @set -e; for f in $(DOCS) ; do \
  160.                 install -v -D -m 644 $$f \
  161.                         $(DISTDIR)$(DOCDIR)/$$f ; \
  162.         done
  163. install-man:
  164.         @ok=true; for f in $(MANPAGES) ; \
  165.                 do [ -e doc/manpages/$$f ] || \
  166.                         { echo doc/manpages/$$f missing ; ok=false; } ; \
  167.         done ; $$ok
  168.         @set -e; for f in $(MANPAGES) ; do \
  169.                 s=$${f##*.}; \
  170.                 install -v -D -m 644 doc/manpages/$$f \
  171.                         $(DISTDIR)$(MANDIR)/man$$s/$$f ; \
  172.         done
  173. uninstall: uninstall-kernel uninstall-usr uninstall-etc uninstall-doc
  174. uninstall-kernel:
  175.         rm -f $(DISTDIR)$(INSTALL_MOD_PATH)$(KMOD)/iscsi/iscsi_trgt.ko
  176.         -depmod -aq
  177. uninstall-usr:
  178.         @rm -f $(DISTDIR)/usr/sbin/ietd
  179.         @rm -f $(DISTDIR)/usr/sbin/ietadm
  180. uninstall-etc: uninstall-initd
  181. uninstall-initd:
  182.         if [ -f /etc/debian_version ]; then \
  183.                 rm -f $(DISTDIR)/etc/init.d/iscsi-target; \
  184.         elif [ -f /etc/redhat-release ]; then \
  185.                 rm -f $(DISTDIR)/etc/init.d/iscsi-target; \
  186.         elif [ -f /etc/gentoo-release ]; then \
  187.                 rm -f $(DISTDIR)/etc/init.d/iscsi-target; \
  188.         elif [ -f /etc/slackware-version ]; then \
  189.                 rm -f $(DISTDIR)/etc/rc.d/iscsi-target; \
  190.         else \
  191.                 rm -f $(DISTDIR)/etc/init.d/iscsi-target; \
  192.         fi
  193. uninstall-doc: uninstall-man
  194.         rm -rf $(DISTDIR)$(DOCDIR)
  195. uninstall-man:
  196.         set -e; for f in $(MANPAGES) ; do \
  197.                 s=$${f##*.}; \
  198.                 rm -f $(DISTDIR)$(MANDIR)/man$$s/$$f ; \
  199.         done
  200. clean:
  201.         $(MAKE) -C usr clean
  202.         $(MAKE) -C $(KSRC) SUBDIRS=$(shell pwd)/kernel clean
  203. distclean: unpatch clean
  204.         find . -name \*.orig -exec rm -f \{\} \;
  205.         find . -name \*.rej -exec rm -f \{\} \;
  206.         find . -name \*~ -exec rm -f \{\} \;
  207.         find . -name Module.symvers -exec rm -f \{\} \;

复制代码

这是kernel的makefile

  1. #
  2. # Makefile for the Linux kernel device drivers.
  3. #
  4. # Note! Dependencies are done automagically by 'make dep', which also
  5. # removes any old dependencies. DON'T put your own dependencies here
  6. # unless it's something special (not a .c file).
  7. #
  8. # Note 2! The CFLAGS definitions are now in the main makefile.
  9. EXTRA_CFLAGS += -I$(src)/../include
  10. obj-m                += iscsi_trgt.o
  11. iscsi_trgt-objs        := tio.o iscsi.o nthread.o wthread.o config.o digest.o \
  12.                         conn.o session.o target.o volume.o iotype.o  table.o\
  13.                         file-io.o null-io.o target_disk.o event.o param.o \
  14.                         block-io.o

复制代码

在kernel的makefile中,我已经将table.o添加了。~~

[ 本帖最后由 lianxi1999 于 2008-12-5 12:36 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文