]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
Merge branch 'for-linus' of git://git.open-osd.org/linux-open-osd
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 11 Aug 2010 16:19:43 +0000 (09:19 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 11 Aug 2010 16:19:43 +0000 (09:19 -0700)
* '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

fs/exofs/file.c
fs/exofs/inode.c
fs/exofs/ios.c
fs/exofs/super.c

index f9bfe2b501d5ecac5e9bc936173131d6b739c2d9..68cb23e3bb9828e88c2647a7f028db6d2f94bd78 100644 (file)
@@ -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 = {
index 088cb476b68a8c24c72bd2abf0503d9917667725..eb7368ebd8cdc294c7ec4b2d1ad0d4953f699981 100644 (file)
@@ -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 = {
index e2732203fa9373c2443dcff83fce7b0e4af516bc..6550bf70e41d8a69dc17b071b4f1073174d955f0 100644 (file)
@@ -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 @@ out:
 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:
index 32cfd61def5fa10ed542a5aca85541a37510f72f..047e92fa3af8aaf56350fbb2ca99fd56e45d7dd3 100644 (file)
@@ -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>