Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf25db36 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'for-linus' of git://git.open-osd.org/linux-open-osd

* 'for-linus' of git://git.open-osd.org/linux-open-osd:
  exofs: Fix groups code when num_devices is not divisible by group_width
  exofs: Remove useless optimization
  exofs: exofs_file_fsync and exofs_file_flush correctness
  exofs: Remove superfluous dependency on buffer_head and writeback
parents 682c30ed 5002dd18
Loading
Loading
Loading
Loading
+17 −12
Original line number Diff line number Diff line
@@ -30,9 +30,6 @@
 * along with exofs; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include <linux/buffer_head.h>

#include "exofs.h"

static int exofs_release_file(struct inode *inode, struct file *filp)
@@ -40,19 +37,27 @@ static int exofs_release_file(struct inode *inode, struct file *filp)
	return 0;
}

/* exofs_file_fsync - flush the inode to disk
 *
 *   Note, in exofs all metadata is written as part of inode, regardless.
 *   The writeout is synchronous
 */
static int exofs_file_fsync(struct file *filp, int datasync)
{
	int ret;
	struct address_space *mapping = filp->f_mapping;
	struct inode *inode = mapping->host;
	struct inode *inode = filp->f_mapping->host;
	struct writeback_control wbc = {
		.sync_mode = WB_SYNC_ALL,
		.nr_to_write = 0, /* metadata-only; caller takes care of data */
	};
	struct super_block *sb;

	ret = filemap_write_and_wait(mapping);
	if (ret)
		return ret;
	if (!(inode->i_state & I_DIRTY))
		return 0;
	if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
		return 0;

	/* sync the inode attributes */
	ret = write_inode_now(inode, 1);
	ret = sync_inode(inode, &wbc);

	/* This is a good place to write the sb */
	/* TODO: Sechedule an sb-sync on create */
@@ -65,9 +70,9 @@ static int exofs_file_fsync(struct file *filp, int datasync)

static int exofs_flush(struct file *file, fl_owner_t id)
{
	exofs_file_fsync(file, 1);
	int ret = vfs_fsync(file, 0);
	/* TODO: Flush the OSD target */
	return 0;
	return ret;
}

const struct file_operations exofs_file_operations = {
+2 −7
Original line number Diff line number Diff line
@@ -32,9 +32,6 @@
 */

#include <linux/slab.h>
#include <linux/writeback.h>
#include <linux/buffer_head.h>
#include <scsi/scsi_device.h>

#include "exofs.h"

@@ -773,15 +770,13 @@ static int exofs_releasepage(struct page *page, gfp_t gfp)
{
	EXOFS_DBGMSG("page 0x%lx\n", page->index);
	WARN_ON(1);
	return try_to_free_buffers(page);
	return 0;
}

static void exofs_invalidatepage(struct page *page, unsigned long offset)
{
	EXOFS_DBGMSG("page_has_buffers=>%d\n", page_has_buffers(page));
	EXOFS_DBGMSG("page 0x%lx offset 0x%lx\n", page->index, offset);
	WARN_ON(1);

	block_invalidatepage(page, offset);
}

const struct address_space_operations exofs_aops = {
+12 −32
Original line number Diff line number Diff line
@@ -305,8 +305,6 @@ int exofs_check_io(struct exofs_io_state *ios, u64 *resid)
struct _striping_info {
	u64 obj_offset;
	u64 group_length;
	u64 total_group_length;
	u64 Major;
	unsigned dev;
	unsigned unit_off;
};
@@ -343,8 +341,6 @@ static void _calc_stripe_info(struct exofs_io_state *ios, u64 file_offset,
				  (M * group_depth * stripe_unit);

	si->group_length = T - H;
	si->total_group_length = T;
	si->Major = M;
}

static int _add_stripe_unit(struct exofs_io_state *ios,  unsigned *cur_pg,
@@ -392,20 +388,19 @@ static int _add_stripe_unit(struct exofs_io_state *ios, unsigned *cur_pg,
}

static int _prepare_one_group(struct exofs_io_state *ios, u64 length,
			      struct _striping_info *si, unsigned first_comp)
			      struct _striping_info *si)
{
	unsigned stripe_unit = ios->layout->stripe_unit;
	unsigned mirrors_p1 = ios->layout->mirrors_p1;
	unsigned devs_in_group = ios->layout->group_width * mirrors_p1;
	unsigned dev = si->dev;
	unsigned first_dev = dev - (dev % devs_in_group);
	unsigned comp = first_comp + (dev - first_dev);
	unsigned max_comp = ios->numdevs ? ios->numdevs - mirrors_p1 : 0;
	unsigned cur_pg = ios->pages_consumed;
	int ret = 0;

	while (length) {
		struct exofs_per_dev_state *per_dev = &ios->per_dev[comp];
		struct exofs_per_dev_state *per_dev = &ios->per_dev[dev];
		unsigned cur_len, page_off = 0;

		if (!per_dev->length) {
@@ -424,11 +419,8 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length,
				cur_len = stripe_unit;
			}

			if (max_comp < comp)
				max_comp = comp;

			dev += mirrors_p1;
			dev = (dev % devs_in_group) + first_dev;
			if (max_comp < dev)
				max_comp = dev;
		} else {
			cur_len = stripe_unit;
		}
@@ -440,8 +432,8 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length,
		if (unlikely(ret))
			goto out;

		comp += mirrors_p1;
		comp = (comp % devs_in_group) + first_comp;
		dev += mirrors_p1;
		dev = (dev % devs_in_group) + first_dev;

		length -= cur_len;
	}
@@ -454,18 +446,15 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length,
static int _prepare_for_striping(struct exofs_io_state *ios)
{
	u64 length = ios->length;
	u64 offset = ios->offset;
	struct _striping_info si;
	unsigned devs_in_group = ios->layout->group_width *
				 ios->layout->mirrors_p1;
	unsigned first_comp = 0;
	int ret = 0;

	_calc_stripe_info(ios, ios->offset, &si);

	if (!ios->pages) {
		if (ios->kern_buff) {
			struct exofs_per_dev_state *per_dev = &ios->per_dev[0];

			_calc_stripe_info(ios, ios->offset, &si);
			per_dev->offset = si.obj_offset;
			per_dev->dev = si.dev;

@@ -479,26 +468,17 @@ static int _prepare_for_striping(struct exofs_io_state *ios)
	}

	while (length) {
		_calc_stripe_info(ios, offset, &si);

		if (length < si.group_length)
			si.group_length = length;

		ret = _prepare_one_group(ios, si.group_length, &si, first_comp);
		ret = _prepare_one_group(ios, si.group_length, &si);
		if (unlikely(ret))
			goto out;

		offset += si.group_length;
		length -= si.group_length;

		si.group_length = si.total_group_length;
		si.unit_off = 0;
		++si.Major;
		si.obj_offset = si.Major * ios->layout->stripe_unit *
						ios->layout->group_depth;

		si.dev = (si.dev - (si.dev % devs_in_group)) + devs_in_group;
		si.dev %= ios->layout->s_numdevs;

		first_comp += devs_in_group;
		first_comp %= ios->layout->s_numdevs;
	}

out:
+0 −1
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */

#include <linux/smp_lock.h>
#include <linux/string.h>
#include <linux/parser.h>
#include <linux/vfs.h>