1. 10 12月, 2010 2 次提交
    • T
      Ocfs2: Teach 'coherency=full' O_DIRECT writes to correctly up_read i_alloc_sem. · 39c99f12
      Tristan Ye 提交于
      Due to newly-introduced 'coherency=full' O_DIRECT writes also takes the EX
      rw_lock like buffered writes did(rw_level == 1), it turns out messing the
      usage of 'level' in ocfs2_dio_end_io() up, which caused i_alloc_sem being
      failed to get up_read'd correctly.
      
      This patch tries to teach ocfs2_dio_end_io to understand well on all locking
      stuffs by explicitly introducing a new bit for i_alloc_sem in iocb's private
      data, just like what we did for rw_lock.
      Signed-off-by: NTristan Ye <tristan.ye@oracle.com>
      Signed-off-by: NJoel Becker <joel.becker@oracle.com>
      39c99f12
    • S
      ocfs2/dlm: Migrate lockres with no locks if it has a reference · 388c4bcb
      Sunil Mushran 提交于
      o2dlm was not migrating resources with zero locks because it assumed that that
      resource would get purged by dlm_thread. However, some usage patterns involve
      creating and dropping locks at a high rate leading to the migrate thread seeing
      zero locks but the purge thread seeing an active reference. When this happens,
      the dlm_thread cannot purge the resource and the migrate thread sees no reason
      to migrate that resource. The spell is broken when the migrate thread catches
      the resource with a lock.
      
      The fix is to make the migrate thread also consider the reference map.
      
      This usage pattern can be triggered by userspace on userdlm locks and flocks.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      Signed-off-by: NJoel Becker <joel.becker@oracle.com>
      388c4bcb
  2. 18 11月, 2010 1 次提交
  3. 13 11月, 2010 1 次提交
  4. 29 10月, 2010 2 次提交
  5. 26 10月, 2010 3 次提交
  6. 23 10月, 2010 1 次提交
  7. 16 10月, 2010 2 次提交
  8. 15 10月, 2010 1 次提交
    • A
      llseek: automatically add .llseek fop · 6038f373
      Arnd Bergmann 提交于
      All file_operations should get a .llseek operation so we can make
      nonseekable_open the default for future file operations without a
      .llseek pointer.
      
      The three cases that we can automatically detect are no_llseek, seq_lseek
      and default_llseek. For cases where we can we can automatically prove that
      the file offset is always ignored, we use noop_llseek, which maintains
      the current behavior of not returning an error from a seek.
      
      New drivers should normally not use noop_llseek but instead use no_llseek
      and call nonseekable_open at open time.  Existing drivers can be converted
      to do the same when the maintainer knows for certain that no user code
      relies on calling seek on the device file.
      
      The generated code is often incorrectly indented and right now contains
      comments that clarify for each added line why a specific variant was
      chosen. In the version that gets submitted upstream, the comments will
      be gone and I will manually fix the indentation, because there does not
      seem to be a way to do that using coccinelle.
      
      Some amount of new code is currently sitting in linux-next that should get
      the same modifications, which I will do at the end of the merge window.
      
      Many thanks to Julia Lawall for helping me learn to write a semantic
      patch that does all this.
      
      ===== begin semantic patch =====
      // This adds an llseek= method to all file operations,
      // as a preparation for making no_llseek the default.
      //
      // The rules are
      // - use no_llseek explicitly if we do nonseekable_open
      // - use seq_lseek for sequential files
      // - use default_llseek if we know we access f_pos
      // - use noop_llseek if we know we don't access f_pos,
      //   but we still want to allow users to call lseek
      //
      @ open1 exists @
      identifier nested_open;
      @@
      nested_open(...)
      {
      <+...
      nonseekable_open(...)
      ...+>
      }
      
      @ open exists@
      identifier open_f;
      identifier i, f;
      identifier open1.nested_open;
      @@
      int open_f(struct inode *i, struct file *f)
      {
      <+...
      (
      nonseekable_open(...)
      |
      nested_open(...)
      )
      ...+>
      }
      
      @ read disable optional_qualifier exists @
      identifier read_f;
      identifier f, p, s, off;
      type ssize_t, size_t, loff_t;
      expression E;
      identifier func;
      @@
      ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
      {
      <+...
      (
         *off = E
      |
         *off += E
      |
         func(..., off, ...)
      |
         E = *off
      )
      ...+>
      }
      
      @ read_no_fpos disable optional_qualifier exists @
      identifier read_f;
      identifier f, p, s, off;
      type ssize_t, size_t, loff_t;
      @@
      ssize_t read_f(struct file *f, char *p, size_t s, loff_t *off)
      {
      ... when != off
      }
      
      @ write @
      identifier write_f;
      identifier f, p, s, off;
      type ssize_t, size_t, loff_t;
      expression E;
      identifier func;
      @@
      ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
      {
      <+...
      (
        *off = E
      |
        *off += E
      |
        func(..., off, ...)
      |
        E = *off
      )
      ...+>
      }
      
      @ write_no_fpos @
      identifier write_f;
      identifier f, p, s, off;
      type ssize_t, size_t, loff_t;
      @@
      ssize_t write_f(struct file *f, const char *p, size_t s, loff_t *off)
      {
      ... when != off
      }
      
      @ fops0 @
      identifier fops;
      @@
      struct file_operations fops = {
       ...
      };
      
      @ has_llseek depends on fops0 @
      identifier fops0.fops;
      identifier llseek_f;
      @@
      struct file_operations fops = {
      ...
       .llseek = llseek_f,
      ...
      };
      
      @ has_read depends on fops0 @
      identifier fops0.fops;
      identifier read_f;
      @@
      struct file_operations fops = {
      ...
       .read = read_f,
      ...
      };
      
      @ has_write depends on fops0 @
      identifier fops0.fops;
      identifier write_f;
      @@
      struct file_operations fops = {
      ...
       .write = write_f,
      ...
      };
      
      @ has_open depends on fops0 @
      identifier fops0.fops;
      identifier open_f;
      @@
      struct file_operations fops = {
      ...
       .open = open_f,
      ...
      };
      
      // use no_llseek if we call nonseekable_open
      ////////////////////////////////////////////
      @ nonseekable1 depends on !has_llseek && has_open @
      identifier fops0.fops;
      identifier nso ~= "nonseekable_open";
      @@
      struct file_operations fops = {
      ...  .open = nso, ...
      +.llseek = no_llseek, /* nonseekable */
      };
      
      @ nonseekable2 depends on !has_llseek @
      identifier fops0.fops;
      identifier open.open_f;
      @@
      struct file_operations fops = {
      ...  .open = open_f, ...
      +.llseek = no_llseek, /* open uses nonseekable */
      };
      
      // use seq_lseek for sequential files
      /////////////////////////////////////
      @ seq depends on !has_llseek @
      identifier fops0.fops;
      identifier sr ~= "seq_read";
      @@
      struct file_operations fops = {
      ...  .read = sr, ...
      +.llseek = seq_lseek, /* we have seq_read */
      };
      
      // use default_llseek if there is a readdir
      ///////////////////////////////////////////
      @ fops1 depends on !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier readdir_e;
      @@
      // any other fop is used that changes pos
      struct file_operations fops = {
      ... .readdir = readdir_e, ...
      +.llseek = default_llseek, /* readdir is present */
      };
      
      // use default_llseek if at least one of read/write touches f_pos
      /////////////////////////////////////////////////////////////////
      @ fops2 depends on !fops1 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier read.read_f;
      @@
      // read fops use offset
      struct file_operations fops = {
      ... .read = read_f, ...
      +.llseek = default_llseek, /* read accesses f_pos */
      };
      
      @ fops3 depends on !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier write.write_f;
      @@
      // write fops use offset
      struct file_operations fops = {
      ... .write = write_f, ...
      +	.llseek = default_llseek, /* write accesses f_pos */
      };
      
      // Use noop_llseek if neither read nor write accesses f_pos
      ///////////////////////////////////////////////////////////
      
      @ fops4 depends on !fops1 && !fops2 && !fops3 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier read_no_fpos.read_f;
      identifier write_no_fpos.write_f;
      @@
      // write fops use offset
      struct file_operations fops = {
      ...
       .write = write_f,
       .read = read_f,
      ...
      +.llseek = noop_llseek, /* read and write both use no f_pos */
      };
      
      @ depends on has_write && !has_read && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier write_no_fpos.write_f;
      @@
      struct file_operations fops = {
      ... .write = write_f, ...
      +.llseek = noop_llseek, /* write uses no f_pos */
      };
      
      @ depends on has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      identifier read_no_fpos.read_f;
      @@
      struct file_operations fops = {
      ... .read = read_f, ...
      +.llseek = noop_llseek, /* read uses no f_pos */
      };
      
      @ depends on !has_read && !has_write && !fops1 && !fops2 && !has_llseek && !nonseekable1 && !nonseekable2 && !seq @
      identifier fops0.fops;
      @@
      struct file_operations fops = {
      ...
      +.llseek = noop_llseek, /* no read or write fn */
      };
      ===== End semantic patch =====
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Cc: Julia Lawall <julia@diku.dk>
      Cc: Christoph Hellwig <hch@infradead.org>
      6038f373
  9. 12 10月, 2010 4 次提交
  10. 10 10月, 2010 1 次提交
  11. 07 10月, 2010 4 次提交
    • S
      · 43695d09
      Sunil Mushran 提交于
      ocfs2/cluster: Show per region heartbeat elapsed time
      
      This patch adds a per region debugfs file that shows the elapsed time
      since the time the o2hb timer was last armed.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      43695d09
    • S
      · d6aa1c7c
      Sunil Mushran 提交于
      ocfs2/cluster: Add mlogs for heartbeat up/down events
      
      This patch adds mlogs for o2hb up and down events.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      d6aa1c7c
    • S
      · 1f285305
      Sunil Mushran 提交于
      ocfs2/cluster: Create debugfs dir/files for each region
      
      This patch creates debugfs directory for each o2hb region and creates
      files to expose the region number and the per region live node bitmap.
      This information will be useful in debugging cluster issues.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      1f285305
    • S
      · a6de0136
      Sunil Mushran 提交于
      ocfs2/cluster: Create debugfs files for live, quorum and failed region bitmaps
      
      This patch prints the bitmaps of live, quorum and failed regions. This
      information will be useful in debugging cluster issues.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      a6de0136
  12. 08 10月, 2010 1 次提交
    • S
      · b1c5ebfb
      Sunil Mushran 提交于
      ocfs2/cluster: Maintain bitmap of failed regions
      
      In global heartbeat mode, we track the bitmap of regions that have seen
      heartbeat timeouts. We fence if the number of such regions is greater than
      or equal to half the number of quorum regions.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      b1c5ebfb
  13. 07 10月, 2010 2 次提交
    • S
      · 43182d2a
      Sunil Mushran 提交于
      ocfs2/cluster: Maintain bitmap of quorum regions
      
      o2hb allows online adding of regions. However, a newly added region is not
      used in quorum calculations unless it has been added on all nodes. This patch
      tracks a bitmap of such quorum regions.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      43182d2a
    • S
      · e7d656ba
      Sunil Mushran 提交于
      ocfs2/cluster: Track bitmap of live heartbeat regions
      
      A heartbeat region becomes live (or active) after a fixed number of (steady)
      iterations.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      e7d656ba
  14. 08 10月, 2010 1 次提交
    • S
      · 536f0741
      Sunil Mushran 提交于
      ocfs2/cluster: Track number of global heartbeat regions
      
      In global heartbeat mode, we have a upper limit for the number of active regions.
      This patch adds the facility to track the number of active global heartbeat
      regions and fails to start heartbeat if the number exceeds the maximum.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      536f0741
  15. 07 10月, 2010 1 次提交
    • S
      · 823a637a
      Sunil Mushran 提交于
      ocfs2/cluster: Maintain live node bitmap per heartbeat region
      
      Currently we track a global livenode bitmap that keeps track of all nodes
      that are heartbeating in all regions.
      
      This patch adds the ability to track the livenode bitmap on a per region basis.
      We will use this facility in a later patch to allow us to withstand the loss of
      a minority number of regions.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      823a637a
  16. 08 10月, 2010 3 次提交
  17. 07 10月, 2010 1 次提交
    • S
      · 18c50cb0
      Sunil Mushran 提交于
      ocfs2/cluster: Print messages when adding/removing heartbeat regions
      
      Prints messages when the user adds or removes heartbeat regions in global
      heartbeat mode. These messages are useful when debugging cluster related issues.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      18c50cb0
  18. 08 10月, 2010 1 次提交
    • S
      · 18cfdf1b
      Sunil Mushran 提交于
      ocfs2/dlm: Add message DLM_QUERY_NODEINFO
      
      Adds new dlm message DLM_QUERY_NODEINFO that sends the attributes of all
      registered nodes. This message is sent if the negotiated dlm protocol is
      1.1 or higher. If the information of the joining node does not match
      that of any existing nodes, the join domain request is rejected.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      18cfdf1b
  19. 07 10月, 2010 1 次提交
    • S
      · 5f3c6d9c
      Sunil Mushran 提交于
      ocfs2: Print message if user mounts without starting global heartbeat
      
      In global heartbeat mode, the heartbeat is started by the user. This patch
      prints an error if the user attempts to mount a volume without starting the
      heartbeat.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      5f3c6d9c
  20. 10 10月, 2010 1 次提交
    • S
      · ea203441
      Sunil Mushran 提交于
      ocfs2/dlm: Add message DLM_QUERY_REGION
      
      Adds new dlm message DLM_QUERY_REGION that sends the names of all active
      heartbeat regions. This message is only sent in the global heartbeat
      mode. If the regions in the joining node do not fully match the ones in
      the active nodes, the join domain request is rejected.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      ea203441
  21. 08 10月, 2010 1 次提交
    • S
      · b3c85c4c
      Sunil Mushran 提交于
      ocfs2/cluster: Get all heartbeat regions
      
      Export function in o2hb to get a list of heartbeat regions. It also adds an
      upper limit to the length of the heartbeat region name.
      
      o2hb_global_heartbeat_active() currently disables global heartbeat. It will
      be enabled in a later patch after all the code is added.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      b3c85c4c
  22. 07 10月, 2010 1 次提交
  23. 08 10月, 2010 1 次提交
    • S
      · 2c442719
      Sunil Mushran 提交于
      ocfs2: Add support for heartbeat=global mount option
      
      Adds support for heartbeat=global mount option. It ensures that the heartbeat
      mode passed matches the one enabled on disk.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      2c442719
  24. 10 10月, 2010 1 次提交
    • S
      · 98f486f2
      Sunil Mushran 提交于
      ocfs2: Add an incompat feature flag OCFS2_FEATURE_INCOMPAT_CLUSTERINFO
      
      OCFS2_FEATURE_INCOMPAT_CLUSTERINFO allows us to use sb->s_cluster_info for
      both userspace and o2cb cluster stacks. It also allows us to extend cluster
      info to include stack flags.
      
      This patch also adds stackflags to sb->s_clusterinfo. It also introduces a
      clusterinfo flag OCFS2_CLUSTER_O2CB_GLOBAL_HEARTBEAT to denote the enabled
      global heartbeat mode.
      
      This incompat flag can be set/cleared using tunefs.ocfs2 --fs-features. The
      clusterinfo flag is set/cleared using tunefs.ocfs2 --update-cluster-stack.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      98f486f2
  25. 08 10月, 2010 1 次提交
    • S
      · 54b5187b
      Sunil Mushran 提交于
      ocfs2/cluster: Add heartbeat mode configfs parameter
      
      Add heartbeat mode parameter to the configfs tree. This will be used
      to set/show the heartbeat mode. The user is free to toggle the mode
      between local and global as long as there is no active heartbeat region.
      Signed-off-by: NSunil Mushran <sunil.mushran@oracle.com>
      54b5187b
  26. 05 10月, 2010 1 次提交
    • A
      BKL: Remove BKL from OCFS2 · 60056794
      Arnd Bergmann 提交于
      The BKL in ocfs2/dlmfs is used in put_super, fill_super and remount_fs
      that are all three protected by the superblocks s_umount rw_semaphore.
      
      The use in ocfs2_control_open is evidently unrelated and the function
      is protected by ocfs2_control_lock.
      
      Therefore it is safe to remove the BKL entirely.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Cc: Mark Fasheh <mfasheh@suse.com>
      Cc: Joel Becker <joel.becker@oracle.com>
      60056794