From 91f458fe66c1c80a30eada704bc53989d80b193d Mon Sep 17 00:00:00 2001 From: Thomas Schoebel-Theuer Date: Tue, 14 Jul 2015 13:53:11 +0200 Subject: [PATCH] sio: convert to new mapfree infrastructure --- kernel/mars_sio.c | 53 +++++++++++++++++------------------------------ kernel/mars_sio.h | 4 +++- 2 files changed, 22 insertions(+), 35 deletions(-) diff --git a/kernel/mars_sio.c b/kernel/mars_sio.c index fd1a674f..aa434400 100644 --- a/kernel/mars_sio.c +++ b/kernel/mars_sio.c @@ -58,7 +58,7 @@ static int sio_ref_get(struct sio_output *output, struct mref_object *mref) return mref->ref_len; } - file = output->filp; + file = output->mf->mf_filp; if (file) { loff_t total_size = i_size_read(file->f_mapping->host); mref->ref_total_size = total_size; @@ -117,10 +117,8 @@ static void sio_ref_put(struct sio_output *output, struct mref_object *mref) if (!_mref_put(mref)) return; - file = output->filp; - if (file) { - mref->ref_total_size = i_size_read(file->f_mapping->host); - } + file = output->mf->mf_filp; + mref->ref_total_size = i_size_read(file->f_mapping->host); mref_a = sio_mref_get_aspect(output->brick, mref); if (mref_a && mref_a->do_dealloc) { @@ -159,7 +157,7 @@ static int transfer_none(int cmd, static int write_aops(struct sio_output *output, struct mref_object *mref) { - struct file *file = output->filp; + struct file *file = output->mf->mf_filp; loff_t pos = mref->ref_pos; void *data = mref->ref_data; int len = mref->ref_len; @@ -296,7 +294,7 @@ int read_aops(struct sio_output *output, struct mref_object *mref) oldfs = get_fs(); set_fs(get_ds()); - ret = vfs_read(output->filp, mref->ref_data, len, &pos); + ret = vfs_read(output->mf->mf_filp, mref->ref_data, len, &pos); set_fs(oldfs); #else struct cookie_data cookie = { @@ -311,7 +309,7 @@ int read_aops(struct sio_output *output, struct mref_object *mref) .u.data = &cookie, }; - ret = splice_direct_to_actor(output->filp, &sd, sio_direct_splice_actor); + ret = splice_direct_to_actor(output->mf->mf_filp, &sd, sio_direct_splice_actor); #endif if (unlikely(ret < 0)) { @@ -322,7 +320,7 @@ int read_aops(struct sio_output *output, struct mref_object *mref) static void sync_file(struct sio_output *output) { - struct file *file = output->filp; + struct file *file = output->mf->mf_filp; int ret; #if defined(S_BIAS) || (defined(RHEL_MAJOR) && (RHEL_MAJOR < 7)) ret = vfs_fsync(file, file->f_path.dentry, 1); @@ -382,7 +380,7 @@ void _sio_ref_io(struct sio_threadinfo *tinfo, struct mref_object *mref) atomic_inc(&tinfo->fly_count); - if (unlikely(!output->filp)) { + if (unlikely(!output->mf || !output->mf->mf_filp)) { status = -EINVAL; goto done; } @@ -400,6 +398,7 @@ void _sio_ref_io(struct sio_threadinfo *tinfo, struct mref_object *mref) sync_file(output); } + mapfree_set(output->mf, mref->ref_pos, mref->ref_pos + mref->ref_len); done: _complete(output, mref, status); @@ -429,6 +428,8 @@ void sio_ref_io(struct sio_output *output, struct mref_object *mref) atomic_inc(&mars_global_io_flying); _mref_get(mref); + mapfree_set(output->mf, mref->ref_pos, -1); + index = 0; if (mref->ref_rw == READ) { traced_lock(&output->g_lock, flags); @@ -495,7 +496,7 @@ static int sio_thread(void *data) static int sio_get_info(struct sio_output *output, struct mars_info *info) { - struct file *file = output->filp; + struct file *file = output->mf->mf_filp; if (unlikely(!file || !file->f_mapping || !file->f_mapping->host)) return -EINVAL; @@ -583,13 +584,10 @@ static int sio_switch(struct sio_brick *brick) static int sio_nr = 0; struct sio_output *output = brick->outputs[0]; const char *path = output->brick->brick_path; - int prot = 0600; - mm_segment_t oldfs; int status = 0; if (brick->power.button) { int flags = O_CREAT | O_RDWR | O_LARGEFILE; - struct address_space *mapping; int index; if (brick->power.led_on) @@ -602,26 +600,13 @@ static int sio_switch(struct sio_brick *brick) mars_power_led_off((void*)brick, false); - // TODO: convert to mapfree infrastructure - - oldfs = get_fs(); - set_fs(get_ds()); - output->filp = filp_open(path, flags, prot); - set_fs(oldfs); - - if (unlikely(IS_ERR(output->filp))) { - status = PTR_ERR(output->filp); - MARS_ERR("can't open file '%s' status=%d\n", path, status); - output->filp = NULL; + output->mf = mapfree_get(path, flags); + if (unlikely(IS_ERR(output->mf))) { + MARS_ERR("could not open file = '%s' flags = %d\n", path, flags); + status = -ENOENT; goto done; } - if ((mapping = output->filp->f_mapping)) { - mapping_set_gfp_mask(mapping, mapping_gfp_mask(mapping) & ~(__GFP_IO | __GFP_FS)); - } - - MARS_INF("opened file '%s' as %p\n", path, output->filp); - output->index = 0; for (index = 0; index <= WITH_THREAD; index++) { struct sio_threadinfo *tinfo = &output->tinfo[index]; @@ -648,10 +633,10 @@ done: brick_thread_stop(tinfo->thread); tinfo->thread = NULL; } - if (output->filp) { + if (output->mf) { MARS_DBG("closing file\n"); - filp_close(output->filp, NULL); - output->filp = NULL; + mapfree_put(output->mf); + output->mf = NULL; } mars_power_led_off((void*)brick, true); } diff --git a/kernel/mars_sio.h b/kernel/mars_sio.h index ae859e09..05162276 100644 --- a/kernel/mars_sio.h +++ b/kernel/mars_sio.h @@ -24,6 +24,8 @@ #ifndef MARS_SIO_H #define MARS_SIO_H +#include "lib_mapfree.h" + #define WITH_THREAD 16 struct sio_mref_aspect { @@ -59,7 +61,7 @@ struct sio_threadinfo { struct sio_output { MARS_OUTPUT(sio); // private - struct file *filp; + struct mapfree_info *mf; struct sio_threadinfo tinfo[WITH_THREAD+1]; spinlock_t g_lock; int index;