2
* (C) 2004 - 2005 FUJITA Tomonori <tomof@acm.org>
4
* This code is licenced under the GPL.
7
#include <linux/proc_fs.h>
10
#include "iscsi_dbg.h"
12
static DEFINE_SEMAPHORE(ioctl_sem);
16
struct file_operations *fops;
19
static struct proc_entries iet_proc_entries[] =
21
{"volume", &volume_seq_fops},
22
{"session", &session_seq_fops},
25
static struct proc_dir_entry *proc_iet_dir;
27
void iet_procfs_exit(void)
34
for (i = 0; i < ARRAY_SIZE(iet_proc_entries); i++)
35
remove_proc_entry(iet_proc_entries[i].name, proc_iet_dir);
37
remove_proc_entry(proc_iet_dir->name, proc_iet_dir->parent);
40
int iet_procfs_init(void)
43
struct proc_dir_entry *ent;
45
if (!(proc_iet_dir = proc_mkdir("iet", init_net.proc_net)))
48
for (i = 0; i < ARRAY_SIZE(iet_proc_entries); i++) {
49
ent = create_proc_entry(iet_proc_entries[i].name, 0, proc_iet_dir);
51
ent->proc_fops = iet_proc_entries[i].fops;
65
static int get_module_info(unsigned long ptr)
67
struct module_info info;
70
snprintf(info.version, sizeof(info.version), "%s", IET_VERSION_STRING);
72
err = copy_to_user((void *) ptr, &info, sizeof(info));
79
static int get_conn_info(struct iscsi_target *target, unsigned long ptr)
81
struct iscsi_session *session;
82
struct iscsi_conn *conn;
83
struct conn_info info;
86
err = copy_from_user(&info, (void *) ptr, sizeof(info));
90
session = session_lookup(target, info.sid);
94
conn = conn_lookup(session, info.cid);
99
info.stat_sn = conn->stat_sn;
100
info.exp_stat_sn = conn->exp_stat_sn;
102
err = copy_to_user((void *) ptr, &info, sizeof(info));
109
static int add_conn(struct iscsi_target *target, unsigned long ptr)
111
struct iscsi_session *session;
112
struct conn_info info;
115
err = copy_from_user(&info, (void *) ptr, sizeof(info));
119
session = session_lookup(target, info.sid);
123
return conn_add(session, &info);
126
static int del_conn(struct iscsi_target *target, unsigned long ptr)
128
struct iscsi_session *session;
129
struct conn_info info;
132
err = copy_from_user(&info, (void *) ptr, sizeof(info));
136
session = session_lookup(target, info.sid);
140
return conn_del(session, &info);
143
static int get_session_info(struct iscsi_target *target, unsigned long ptr)
145
struct iscsi_session *session;
146
struct session_info info;
149
err = copy_from_user(&info, (void *) ptr, sizeof(info));
153
session = session_lookup(target, info.sid);
157
info.exp_cmd_sn = session->exp_cmd_sn;
158
info.max_cmd_sn = session->max_cmd_sn;
160
err = copy_to_user((void *) ptr, &info, sizeof(info));
167
static int add_session(struct iscsi_target *target, unsigned long ptr)
169
struct session_info info;
172
err = copy_from_user(&info, (void *) ptr, sizeof(info));
176
return session_add(target, &info);
179
static int del_session(struct iscsi_target *target, unsigned long ptr)
181
struct session_info info;
184
err = copy_from_user(&info, (void *) ptr, sizeof(info));
188
return session_del(target, info.sid);
191
static int add_volume(struct iscsi_target *target, unsigned long ptr)
193
struct volume_info info;
196
err = copy_from_user(&info, (void *) ptr, sizeof(info));
200
return volume_add(target, &info);
203
static int del_volume(struct iscsi_target *target, unsigned long ptr)
205
struct volume_info info;
208
err = copy_from_user(&info, (void *) ptr, sizeof(info));
212
return iscsi_volume_del(target, &info);
215
static int iscsi_param_config(struct iscsi_target *target, unsigned long ptr, int set)
217
struct iscsi_param_info info;
220
err = copy_from_user(&info, (void *) ptr, sizeof(info));
224
err = iscsi_param_set(target, &info, set);
228
err = copy_to_user((void *) ptr, &info, sizeof(info));
235
static int add_target(unsigned long ptr)
237
struct target_info info;
240
err = copy_from_user(&info, (void *) ptr, sizeof(info));
244
err = target_add(&info);
248
err = copy_to_user((void *) ptr, &info, sizeof(info));
255
static long ioctl(struct file *file, unsigned int cmd, unsigned long arg)
257
struct iscsi_target *target = NULL;
261
err = down_interruptible(&ioctl_sem);
265
if (cmd == GET_MODULE_INFO) {
266
err = get_module_info(arg);
270
if (cmd == ADD_TARGET) {
271
err = add_target(arg);
275
err = get_user(id, (u32 *) arg);
279
/* locking handled in target_del */
280
if (cmd == DEL_TARGET) {
281
err = target_del(id);
285
target = target_lookup_by_id(id);
291
err = target_lock(target, 1);
297
err = add_volume(target, arg);
301
err = del_volume(target, arg);
305
err = add_session(target, arg);
309
err = del_session(target, arg);
312
case GET_SESSION_INFO:
313
err = get_session_info(target, arg);
316
case ISCSI_PARAM_SET:
317
err = iscsi_param_config(target, arg, 1);
320
case ISCSI_PARAM_GET:
321
err = iscsi_param_config(target, arg, 0);
325
err = add_conn(target, arg);
329
err = del_conn(target, arg);
333
err = get_conn_info(target, arg);
336
eprintk("invalid ioctl cmd %x\n", cmd);
340
target_unlock(target);
347
static int release(struct inode *i __attribute__((unused)),
348
struct file *f __attribute__((unused)))
357
struct file_operations ctr_fops = {
358
.owner = THIS_MODULE,
359
.unlocked_ioctl = ioctl,
360
.compat_ioctl = ioctl,