Commit bf25db36 authored by Linus Torvalds's avatar Linus Torvalds

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
...@@ -30,9 +30,6 @@ ...@@ -30,9 +30,6 @@
* along with exofs; if not, write to the Free Software * along with exofs; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <linux/buffer_head.h>
#include "exofs.h" #include "exofs.h"
static int exofs_release_file(struct inode *inode, struct file *filp) 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) ...@@ -40,19 +37,27 @@ static int exofs_release_file(struct inode *inode, struct file *filp)
return 0; 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) static int exofs_file_fsync(struct file *filp, int datasync)
{ {
int ret; int ret;
struct address_space *mapping = filp->f_mapping; struct inode *inode = filp->f_mapping->host;
struct inode *inode = 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; struct super_block *sb;
ret = filemap_write_and_wait(mapping); if (!(inode->i_state & I_DIRTY))
if (ret) return 0;
return ret; if (datasync && !(inode->i_state & I_DIRTY_DATASYNC))
return 0;
/* sync the inode attributes */ ret = sync_inode(inode, &wbc);
ret = write_inode_now(inode, 1);
/* This is a good place to write the sb */ /* This is a good place to write the sb */
/* TODO: Sechedule an sb-sync on create */ /* TODO: Sechedule an sb-sync on create */
...@@ -65,9 +70,9 @@ static int exofs_file_fsync(struct file *filp, int datasync) ...@@ -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) 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 */ /* TODO: Flush the OSD target */
return 0; return ret;
} }
const struct file_operations exofs_file_operations = { const struct file_operations exofs_file_operations = {
......
...@@ -32,9 +32,6 @@ ...@@ -32,9 +32,6 @@
*/ */
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/writeback.h>
#include <linux/buffer_head.h>
#include <scsi/scsi_device.h>
#include "exofs.h" #include "exofs.h"
...@@ -773,15 +770,13 @@ static int exofs_releasepage(struct page *page, gfp_t gfp) ...@@ -773,15 +770,13 @@ static int exofs_releasepage(struct page *page, gfp_t gfp)
{ {
EXOFS_DBGMSG("page 0x%lx\n", page->index); EXOFS_DBGMSG("page 0x%lx\n", page->index);
WARN_ON(1); WARN_ON(1);
return try_to_free_buffers(page); return 0;
} }
static void exofs_invalidatepage(struct page *page, unsigned long offset) 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); WARN_ON(1);
block_invalidatepage(page, offset);
} }
const struct address_space_operations exofs_aops = { const struct address_space_operations exofs_aops = {
......
...@@ -305,8 +305,6 @@ int exofs_check_io(struct exofs_io_state *ios, u64 *resid) ...@@ -305,8 +305,6 @@ int exofs_check_io(struct exofs_io_state *ios, u64 *resid)
struct _striping_info { struct _striping_info {
u64 obj_offset; u64 obj_offset;
u64 group_length; u64 group_length;
u64 total_group_length;
u64 Major;
unsigned dev; unsigned dev;
unsigned unit_off; unsigned unit_off;
}; };
...@@ -343,8 +341,6 @@ static void _calc_stripe_info(struct exofs_io_state *ios, u64 file_offset, ...@@ -343,8 +341,6 @@ static void _calc_stripe_info(struct exofs_io_state *ios, u64 file_offset,
(M * group_depth * stripe_unit); (M * group_depth * stripe_unit);
si->group_length = T - H; 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, 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, ...@@ -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, 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 stripe_unit = ios->layout->stripe_unit;
unsigned mirrors_p1 = ios->layout->mirrors_p1; unsigned mirrors_p1 = ios->layout->mirrors_p1;
unsigned devs_in_group = ios->layout->group_width * mirrors_p1; unsigned devs_in_group = ios->layout->group_width * mirrors_p1;
unsigned dev = si->dev; unsigned dev = si->dev;
unsigned first_dev = dev - (dev % devs_in_group); 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 max_comp = ios->numdevs ? ios->numdevs - mirrors_p1 : 0;
unsigned cur_pg = ios->pages_consumed; unsigned cur_pg = ios->pages_consumed;
int ret = 0; int ret = 0;
while (length) { 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; unsigned cur_len, page_off = 0;
if (!per_dev->length) { if (!per_dev->length) {
...@@ -424,11 +419,8 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length, ...@@ -424,11 +419,8 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length,
cur_len = stripe_unit; cur_len = stripe_unit;
} }
if (max_comp < comp) if (max_comp < dev)
max_comp = comp; max_comp = dev;
dev += mirrors_p1;
dev = (dev % devs_in_group) + first_dev;
} else { } else {
cur_len = stripe_unit; cur_len = stripe_unit;
} }
...@@ -440,8 +432,8 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length, ...@@ -440,8 +432,8 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length,
if (unlikely(ret)) if (unlikely(ret))
goto out; goto out;
comp += mirrors_p1; dev += mirrors_p1;
comp = (comp % devs_in_group) + first_comp; dev = (dev % devs_in_group) + first_dev;
length -= cur_len; length -= cur_len;
} }
...@@ -454,18 +446,15 @@ static int _prepare_one_group(struct exofs_io_state *ios, u64 length, ...@@ -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) static int _prepare_for_striping(struct exofs_io_state *ios)
{ {
u64 length = ios->length; u64 length = ios->length;
u64 offset = ios->offset;
struct _striping_info si; struct _striping_info si;
unsigned devs_in_group = ios->layout->group_width *
ios->layout->mirrors_p1;
unsigned first_comp = 0;
int ret = 0; int ret = 0;
_calc_stripe_info(ios, ios->offset, &si);
if (!ios->pages) { if (!ios->pages) {
if (ios->kern_buff) { if (ios->kern_buff) {
struct exofs_per_dev_state *per_dev = &ios->per_dev[0]; 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->offset = si.obj_offset;
per_dev->dev = si.dev; per_dev->dev = si.dev;
...@@ -479,26 +468,17 @@ static int _prepare_for_striping(struct exofs_io_state *ios) ...@@ -479,26 +468,17 @@ static int _prepare_for_striping(struct exofs_io_state *ios)
} }
while (length) { while (length) {
_calc_stripe_info(ios, offset, &si);
if (length < si.group_length) if (length < si.group_length)
si.group_length = 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)) if (unlikely(ret))
goto out; goto out;
offset += si.group_length;
length -= 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: out:
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include <linux/smp_lock.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/parser.h> #include <linux/parser.h>
#include <linux/vfs.h> #include <linux/vfs.h>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment