[PATCH v8 00/28] Parent Pointers v8

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

This is the 8th version of parent pointer attributes for xfs. The goal of
this patch set is to add a parent pointer attribute to each inode.  The
attribute name containing the parent inode, generation, and directory offset,
while the  attribute value contains the file name.  This feature will enable
future optimizations for online scrub, or any other feature that could make
use of quickly deriving an inodes path from  the mount point.  This set also
introduces deferred attribute operations, though it is currently only used by
 the new parent pointer code.


Some points of interest since v7:
I've integrated most of the feedback provided on v7 and done a lot of
stabilizing.  In the last version, I had plumbed in a "roll_trans" boolean 
into the attribute routines to prevent transactions from being rolled during the
defer finish.  Some concerns were raised in the reviews because this caused 
attribute operations to become one large transaction.  The new proposal 
was to have the attribute code periodically return EAGAIN to get the defer
finish routine to cycle out the transaction.

So in this solution setting an attribute is broken into 3 transactions.
I'm thinking that ideally it should send back the EAGAIN where ever the 
existing code used to roll the transaction, but that gets more complex 
since they're nested in sub functions.  So I wanted to see what people
thought of this implementation first before proceeding any further.


This design has the following complexities that I think should be considered:

The attribute routines tend to pass around structures like xfs_da_args, and
xfs_buf (for holding and releasing leaf buffers).  These structures need to 
remain instantiated across the EAGAIN returns until the entire attribute 
operation is complete.  Additionally, this solution adds a state machine to 
keep track of where to resume executing before we bailed out with the EAGAIN. 
At the moment, I've put these items in the xfs_attr_item structure (patch 10).
Since the defer finish routine passes it back through through the 
*_finish_item callback, xfs_attr_finish_item can plumb them back in from there
(patch 11).  This works for now though maybe not the most appropriate place to 
put it?  Maybe we can move it if people have opinions about it.

Also, since this solution alters the behavior of the attribute set and remove 
sub-routines, normal attribute operations have been made to use delayed
operations the same way parent pointers do.  However, since delayed operations 
cant return error codes, we need to take care of any condition that would 
normally return an error to the user.  For example ENOATTR if trying to remove 
a non existent attribute.  For this reason, all such error conditions need to 
be resolved before calling the delayed operation.  So I've added some extra 
routines to check for that in xfs_attr_remove (added in patch 9).  

I struggled a little with how to present this set in a way that broke the logic 
down into manageable sized patches.  In this solution, I chose to keep the 
roll_trans boolean temporarily (patch 6), and then remove it later (in patch 12) 
after all the code paths have been made to pass a false value.  I thought this 
helped to break up the changes into smaller patches without having to deal with 
all affected code paths at once.  Maybe if people are comfortable with the 
changes going on in 6 though 12, we could consider collapsing them together
later.

For the most part I would appreciate review focus on patches 6 though 12,
since that is where most of the activity has been this for the revision.
Folks are certainly welcome to pour through the rest of it, but I know
it's a lot.  I've tried to arrange the set such that 1-12 sets up delayed 
attributes, and 13-28 adds the parent pointers.  I don't have the xfsprogs 
side just yet because this set is sitting a little upstream from where 
xfsprogs is ATM and it had quite a few conflicts trying to sync it with 
xfsprogs.  So I'm just going to wait a bit for now until that catches up.  

As always, comments and feedback are appreciated.  Thank you!

Allison Henderson (19):
  xfs: Move fs/xfs/xfs_attr.h to fs/xfs/libxfs/xfs_attr.h
  xfs: Add helper function xfs_attr_try_sf_addname
  xfs: Add attibute set and helper functions
  xfs: Add attibute remove and helper functions
  xfs: Hold inode locks in xfs_ialloc
  xfs: Add trans toggle to attr routines
  xfs: Set up infastructure for deferred attribute operations
  xfs: Add xfs_attr_set_deferred and xfs_attr_remove_deferred
  xfs: Add xfs_has_attr and subroutines
  xfs: Add attr context to log item
  xfs: Roll delayed attr operations by returning EAGAIN
  xfs: Remove roll_trans boolean
  xfs: Remove all strlen calls in all xfs_attr_* functions for attr
    names.
  xfs: Add parent pointers to rename
  xfs: Add the parent pointer support to the superblock version 5.
  xfs: Add helper function xfs_attr_list_context_init
  xfs: Increase  XFS_DEFER_OPS_NR_INODES to 4
  xfs: Add parent pointer ioctl
  xfs: Add delayed attributes error tag

Dave Chinner (5):
  xfs: define parent pointer xattr format
  xfs: extent transaction reservations for parent attributes
  xfs: parent pointer attribute creation
  xfs: add parent attributes to link
  xfs: remove parent pointers in unlink

Mark Tinguely (4):
  xfs: get directory offset when adding directory name
  xfs: get directory offset when removing directory name
  xfs: get directory offset when replacing a directory name
  xfs: add parent pointer support to attribute code

 fs/xfs/Makefile                 |   4 +
 fs/xfs/libxfs/xfs_attr.c        | 496 ++++++++++++++++++++++-----------
 fs/xfs/libxfs/xfs_attr.h        | 203 ++++++++++++++
 fs/xfs/libxfs/xfs_attr_leaf.c   |  49 +++-
 fs/xfs/libxfs/xfs_attr_leaf.h   |   3 +-
 fs/xfs/libxfs/xfs_attr_remote.c |  20 --
 fs/xfs/libxfs/xfs_bmap.c        |  49 ++--
 fs/xfs/libxfs/xfs_bmap.h        |   1 +
 fs/xfs/libxfs/xfs_da_btree.h    |   1 +
 fs/xfs/libxfs/xfs_da_format.h   |  37 ++-
 fs/xfs/libxfs/xfs_defer.h       |   1 +
 fs/xfs/libxfs/xfs_dir2.c        |  21 +-
 fs/xfs/libxfs/xfs_dir2.h        |   7 +-
 fs/xfs/libxfs/xfs_dir2_block.c  |   9 +-
 fs/xfs/libxfs/xfs_dir2_leaf.c   |   8 +-
 fs/xfs/libxfs/xfs_dir2_node.c   |   8 +-
 fs/xfs/libxfs/xfs_dir2_sf.c     |   6 +
 fs/xfs/libxfs/xfs_errortag.h    |   4 +-
 fs/xfs/libxfs/xfs_format.h      |  10 +-
 fs/xfs/libxfs/xfs_fs.h          |  43 +++
 fs/xfs/libxfs/xfs_log_format.h  |  44 ++-
 fs/xfs/libxfs/xfs_parent.c      | 111 ++++++++
 fs/xfs/libxfs/xfs_parent.h      |  37 +++
 fs/xfs/libxfs/xfs_sb.c          |   2 +
 fs/xfs/libxfs/xfs_trans_resv.c  | 111 ++++++--
 fs/xfs/libxfs/xfs_trans_resv.h  |   1 +
 fs/xfs/libxfs/xfs_types.h       |   1 +
 fs/xfs/scrub/common.c           |   2 +
 fs/xfs/xfs_acl.c                |  14 +-
 fs/xfs/xfs_attr.h               | 148 ----------
 fs/xfs/xfs_attr_item.c          | 598 ++++++++++++++++++++++++++++++++++++++++
 fs/xfs/xfs_attr_item.h          | 114 ++++++++
 fs/xfs/xfs_attr_list.c          |  75 +++--
 fs/xfs/xfs_error.c              |   3 +
 fs/xfs/xfs_inode.c              | 159 ++++++++---
 fs/xfs/xfs_ioctl.c              | 101 ++++++-
 fs/xfs/xfs_ioctl32.c            |   2 +
 fs/xfs/xfs_iops.c               |   7 +-
 fs/xfs/xfs_log_recover.c        | 172 ++++++++++++
 fs/xfs/xfs_ondisk.h             |   6 +
 fs/xfs/xfs_parent_utils.c       | 152 ++++++++++
 fs/xfs/xfs_parent_utils.h       |  32 +++
 fs/xfs/xfs_qm.c                 |   1 +
 fs/xfs/xfs_super.c              |   5 +
 fs/xfs/xfs_symlink.c            |   6 +-
 fs/xfs/xfs_trans.h              |  16 +-
 fs/xfs/xfs_trans_attr.c         | 275 ++++++++++++++++++
 fs/xfs/xfs_xattr.c              |  11 +-
 48 files changed, 2700 insertions(+), 486 deletions(-)
 create mode 100644 fs/xfs/libxfs/xfs_attr.h
 create mode 100644 fs/xfs/libxfs/xfs_parent.c
 create mode 100644 fs/xfs/libxfs/xfs_parent.h
 delete mode 100644 fs/xfs/xfs_attr.h
 create mode 100644 fs/xfs/xfs_attr_item.c
 create mode 100644 fs/xfs/xfs_attr_item.h
 create mode 100644 fs/xfs/xfs_parent_utils.c
 create mode 100644 fs/xfs/xfs_parent_utils.h
 create mode 100644 fs/xfs/xfs_trans_attr.c

-- 
2.7.4




[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux