14 Dec, 2012

1 commit

  • Same bug as fixed by Idan for write_exec was in read_exec.
    Fix the io_state leak and pages state on read error.

    Also while at it:
    The if (!pcol->read_4_write) at the error path is redundant
    because all goto err; are after the if (pcol->read_4_write)
    bale out.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

12 Dec, 2012

1 commit

  • if ore_write() fails, we would unlock the pages of pcol, which is now
    empty, rather than pcol_copy which owns the pages when ore_write() is
    called. this means that no pages will actually be unlocked
    (pcol.nr_pages == 0) and the writing process (more accurately, the
    syncing process) will hang waiting for a writeback notification that
    never comes.

    moreover, if ore_write() fails, pcol_free() is called for pcol, whereas
    pcol_copy is the object owning the ore_io_state, thus leaking the
    ore_io_state.

    [Boaz]
    I have simplified Idan's original patch a bit, everything else still
    holds

    Signed-off-by: Idan Kedar
    Signed-off-by: Boaz Harrosh

    Idan Kedar
     

03 Oct, 2012

1 commit

  • Pull user namespace changes from Eric Biederman:
    "This is a mostly modest set of changes to enable basic user namespace
    support. This allows the code to code to compile with user namespaces
    enabled and removes the assumption there is only the initial user
    namespace. Everything is converted except for the most complex of the
    filesystems: autofs4, 9p, afs, ceph, cifs, coda, fuse, gfs2, ncpfs,
    nfs, ocfs2 and xfs as those patches need a bit more review.

    The strategy is to push kuid_t and kgid_t values are far down into
    subsystems and filesystems as reasonable. Leaving the make_kuid and
    from_kuid operations to happen at the edge of userspace, as the values
    come off the disk, and as the values come in from the network.
    Letting compile type incompatible compile errors (present when user
    namespaces are enabled) guide me to find the issues.

    The most tricky areas have been the places where we had an implicit
    union of uid and gid values and were storing them in an unsigned int.
    Those places were converted into explicit unions. I made certain to
    handle those places with simple trivial patches.

    Out of that work I discovered we have generic interfaces for storing
    quota by projid. I had never heard of the project identifiers before.
    Adding full user namespace support for project identifiers accounts
    for most of the code size growth in my git tree.

    Ultimately there will be work to relax privlige checks from
    "capable(FOO)" to "ns_capable(user_ns, FOO)" where it is safe allowing
    root in a user names to do those things that today we only forbid to
    non-root users because it will confuse suid root applications.

    While I was pushing kuid_t and kgid_t changes deep into the audit code
    I made a few other cleanups. I capitalized on the fact we process
    netlink messages in the context of the message sender. I removed
    usage of NETLINK_CRED, and started directly using current->tty.

    Some of these patches have also made it into maintainer trees, with no
    problems from identical code from different trees showing up in
    linux-next.

    After reading through all of this code I feel like I might be able to
    win a game of kernel trivial pursuit."

    Fix up some fairly trivial conflicts in netfilter uid/git logging code.

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace: (107 commits)
    userns: Convert the ufs filesystem to use kuid/kgid where appropriate
    userns: Convert the udf filesystem to use kuid/kgid where appropriate
    userns: Convert ubifs to use kuid/kgid
    userns: Convert squashfs to use kuid/kgid where appropriate
    userns: Convert reiserfs to use kuid and kgid where appropriate
    userns: Convert jfs to use kuid/kgid where appropriate
    userns: Convert jffs2 to use kuid and kgid where appropriate
    userns: Convert hpfs to use kuid and kgid where appropriate
    userns: Convert btrfs to use kuid/kgid where appropriate
    userns: Convert bfs to use kuid/kgid where appropriate
    userns: Convert affs to use kuid/kgid wherwe appropriate
    userns: On alpha modify linux_to_osf_stat to use convert from kuids and kgids
    userns: On ia64 deal with current_uid and current_gid being kuid and kgid
    userns: On ppc convert current_uid from a kuid before printing.
    userns: Convert s390 getting uid and gid system calls to use kuid and kgid
    userns: Convert s390 hypfs to use kuid and kgid where appropriate
    userns: Convert binder ipc to use kuids
    userns: Teach security_path_chown to take kuids and kgids
    userns: Add user namespace support to IMA
    userns: Convert EVM to deal with kuids and kgids in it's hmac computation
    ...

    Linus Torvalds
     

21 Sep, 2012

1 commit


02 Aug, 2012

3 commits

  • exofs_max_io_pages should just use the ORE's
    calculated layout->max_io_length,

    And avoid unnecessary BUGs, calculations made here were
    also a layering violation.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • It is very common for the end of the file to be unaligned on
    stripe size. But since we know it's beyond file's end then
    the XOR should be preformed with all zeros.

    Old code used to just read zeros out of the OSD devices, which is a great
    waist. But what scares me more about this situation is that, we now have
    pages attached to the file's mapping that are beyond i_size. I don't
    like the kind of bugs this calls for.

    Fix both birds, by returning a global ZERO_PAGE, if offset is beyond
    i_size.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • readpage_strip can be called from several code paths all of which
    require that the page be locked before any operations are carried
    out.

    Since we export the exofs_readpage callback to the VFS, add a
    BUG_ON to check for PageLocked(page) to make sure that this
    understanding is never compromised.

    Signed-off-by: Kautuk Consul
    Signed-off-by: Boaz Harrosh

    Kautuk Consul
     

06 May, 2012

1 commit

  • After we moved inode_sync_wait() from end_writeback() it doesn't make sense
    to call the function end_writeback() anymore. Rename it to clear_inode()
    which well says what the function really does - set I_CLEAR flag.

    Signed-off-by: Jan Kara
    Signed-off-by: Fengguang Wu

    Jan Kara
     

04 Jan, 2012

1 commit


02 Nov, 2011

1 commit


25 Oct, 2011

1 commit

  • The ore need suplied a r4w_get_page/r4w_put_page API
    from Filesystem so it can get cache pages to read-into when
    writing parial stripes.

    Also I commented out and NULLed the .writepage (singular)
    vector. Because it gives terrible write pattern to raid
    and is apparently not needed. Even in OOM conditions the
    system copes (even better) with out it.

    TODO: How to specify to write_cache_pages() to start
    or include a certain page?

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

15 Oct, 2011

4 commits

  • Current ore_check_io API receives a residual
    pointer, to report partial IO. But it is actually
    not used, because in a multiple devices IO there
    is never a linearity in the IO failure.

    On the other hand if every failing device is reported
    through a received callback measures can be taken to
    handle only failed devices. One at a time.

    This will also be needed by the objects-layout-driver
    for it's error reporting facility.

    Exofs is not currently using the new information and
    keeps the old behaviour of failing the complete IO in
    case of an error. (No partial completion)

    TODO: Use an ore_check_io callback to set_page_error only
    the failing pages. And re-dirty write pages.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • All users of the ore will need to check if current code
    supports the given layout. For example RAID5/6 is not
    currently supported.

    So move all the checks from exofs/super.c to a new
    ore_verify_layout() to be used by ore users.

    Note that any new layout should be passed through the
    ore_verify_layout() because the ore engine will prepare
    and verify some internal members of ore_layout, and
    assumes it's called.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • If at read/write_done the actual IO was shorter then requested,
    reported in returned ios->length. It is not an error. The reminder
    of the pages should just be unlocked but not marked uptodate or
    end_page_writeback. They will be re issued later by the VFS.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Usually a single IO is confined to one group of devices
    (group_width) and at the boundary of a raid group it can
    spill into a second group. Current code would allocate a
    full device_table size array at each io_state so it can
    comply to requests that span two groups. Needless to say
    that is very wasteful, specially when device_table count
    can get very large (hundreds even thousands), while a
    group_width is usually 8 or 10.

    * Change ore API to trim on IO that spans two raid groups.
    The user passes offset+length to ore_get_rw_state, the
    ore might trim on that length if spanning a group boundary.
    The user must check ios->length or ios->nrpages to see
    how much IO will be preformed. It is the responsibility
    of the user to re-issue the reminder of the IO.

    * Modify exofs To copy spilled pages on to the next IO.
    This means one last kick is needed after all coalescing
    of pages is done.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

03 Oct, 2011

1 commit


07 Aug, 2011

4 commits

  • ORE stands for "Objects Raid Engine"

    This patch is a mechanical rename of everything that was in ios.c
    and its API declaration to an ore.c and an osd_ore.h header. The ore
    engine will later be used by the pnfs objects layout driver.

    * File ios.c => ore.c

    * Declaration of types and API are moved from exofs.h to a new
    osd_ore.h

    * All used types are prefixed by ore_ from their exofs_ name.

    * Shift includes from exofs.h to osd_ore.h so osd_ore.h is
    independent, include it from exofs.h.

    Other than a pure rename there are no other changes. Next patch
    will move the ore into it's own module and will export the API
    to be used by exofs and later the layout driver

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Exofs raid engine was saving on memory space by having a single layout-info,
    single pid, and a single device-table, global to the filesystem. Then passing
    a credential and object_id info at the io_state level, private for each
    inode. It would also devise this contraption of rotating the device table
    view for each inode->ino to spread out the device usage.

    This is not compatible with the pnfs-objects standard, demanding that
    each inode can have it's own layout-info, device-table, and each object
    component it's own pid, oid and creds.

    So: Bring exofs raid engine to be usable for generic pnfs-objects use by:

    * Define an exofs_comp structure that holds obj_id and credential info.

    * Break up exofs_layout struct to an exofs_components structure that holds a
    possible array of exofs_comp and the array of devices + the size of the
    arrays.

    * Add a "comps" parameter to get_io_state() that specifies the ids creds
    and device array to use for each IO.

    This enables to keep the layout global, but the device-table view, creds
    and IDs at the inode level. It only adds two 64bit to each inode, since
    some of these members already existed in another form.

    * ios raid engine now access layout-info and comps-info through the passed
    pointers. Everything is pre-prepared by caller for generic access of
    these structures and arrays.

    At the exofs Level:

    * Super block holds an exofs_components struct that holds the device
    array, previously in layout. The devices there are in device-table
    order. The device-array is twice bigger and repeats the device-table
    twice so now each inode's device array can point to a random device
    and have a round-robin view of the table, making it compatible to
    previous exofs versions.

    * Each inode has an exofs_components struct that is initialized at
    load time, with it's own view of the device table IDs and creds.
    When doing IO this gets passed to the io_state together with the
    layout.

    While preforming this change. Bugs where found where credentials with the
    wrong IDs where used to access the different SB objects (super.c). As well
    as some dead code. It was never noticed because the target we use does not
    check the credentials.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • ios.c will be moving to an external library, for use by the
    objects-layout-driver. Remove from it some exofs specific functions.

    Also g_attr_logical_length is used both by inode.c and ios.c
    move definition to the later, to keep it independent

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • In future raid code we will need to know the IO offset/length
    and if it's a read or write to determine some of the array
    sizes we'll need.

    So add a new exofs_get_rw_state() API for use when
    writeing/reading. All other simple cases are left using the
    old way.

    The major change to this is that now we need to call
    exofs_get_io_state later at inode.c::read_exec and
    inode.c::write_exec when we actually know these things. So this
    patch is kept separate so I can test things apart from other
    changes.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

25 Mar, 2011

1 commit

  • * 'for-2.6.39/core' of git://git.kernel.dk/linux-2.6-block: (65 commits)
    Documentation/iostats.txt: bit-size reference etc.
    cfq-iosched: removing unnecessary think time checking
    cfq-iosched: Don't clear queue stats when preempt.
    blk-throttle: Reset group slice when limits are changed
    blk-cgroup: Only give unaccounted_time under debug
    cfq-iosched: Don't set active queue in preempt
    block: fix non-atomic access to genhd inflight structures
    block: attempt to merge with existing requests on plug flush
    block: NULL dereference on error path in __blkdev_get()
    cfq-iosched: Don't update group weights when on service tree
    fs: assign sb->s_bdi to default_backing_dev_info if the bdi is going away
    block: Require subsystems to explicitly allocate bio_set integrity mempool
    jbd2: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging
    jbd: finish conversion from WRITE_SYNC_PLUG to WRITE_SYNC and explicit plugging
    fs: make fsync_buffers_list() plug
    mm: make generic_writepages() use plugging
    blk-cgroup: Add unaccounted time to timeslice_used.
    block: fixup plugging stubs for !CONFIG_BLOCK
    block: remove obsolete comments for blkdev_issue_zeroout.
    blktrace: Use rq->cmd_flags directly in blk_add_trace_rq.
    ...

    Fix up conflicts in fs/{aio.c,super.c}

    Linus Torvalds
     

15 Mar, 2011

4 commits

  • Before when creating a new inode, we'd set the sb->s_dirt flag,
    and sometime later the system would write out s_nextid as part
    of the sb_info. Also on inode sync we would force the sb sync
    as well.

    Define the s_nextid as a new partition attribute and set it
    every time we create a new object.
    At mount we read it from it's new place.

    We now never set sb->s_dirt anywhere in exofs. write_super
    is actually never called. The call to exofs_write_super from
    exofs_put_super is also removed because the VFS always calls
    ->sync_fs before calling ->put_super twice.

    To stay backward-and-forward compatible we also write the old
    s_nextid in the super_block object at unmount, and support zero
    length attribute on mount.

    This also fixes a BUG where in layouts when group_width was not
    a divisor of EXOFS_SUPER_ID (0x10000) the s_nextid was not read
    from the device it was written to. Because of the sliding window
    layout trick, and because the read was always done from the 0
    device but the write was done via the raid engine that might slide
    the device view. Now we read and write through the raid engine.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • * Set all inode->i_mapping->backing_dev_info to point to
    the per super-block sb->s_bdi.

    * Calculating a read_ahead that is:
    - preferable 2 stripes long
    (Future patch will add a mount option to override this)
    - Minimum 128K aligned up to stripe-size
    - Caped to maximum-IO-sizes round down to stripe_size.
    (Max sizes are governed by max bio-size that fits in a page
    times number-of-devices)

    CC: Marc Dionne
    Signed-off-by: Boaz Harrosh

    bharrosh@panasas.com
     
  • It is incorrect to test inode dirty bits without participating in the inode
    writeback protocol. Inode writeback sets I_SYNC and clears I_DIRTY_?, then
    writes out the particular bits, then clears I_SYNC when it is done. BTW. it
    may not completely write all pages out, so I_DIRTY_PAGES would get set
    again.

    This is a standard pattern used throughout the kernel's writeback caches
    (I_SYNC ~= I_WRITEBACK, if that makes it clearer).

    And so it is not possible to determine an inode's dirty status just by
    checking I_DIRTY bits. Especially not for the purpose of data integrity
    syncs.

    Missing the check for these bits means that fsync can complete while
    writeback to the inode is underway. Inode writeback functions get this
    right, so call into them rather than try to shortcut things by testing
    dirty state improperly.

    Signed-off-by: Nick Piggin
    Signed-off-by: Boaz Harrosh

    Nick Piggin
     
  • Don't attempt a read passed i_size, just zero the page and be
    done with it.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

10 Mar, 2011

1 commit

  • Code has been converted over to the new explicit on-stack plugging,
    and delay users have been converted to use the new API for that.
    So lets kill off the old plugging along with aops->sync_page().

    Signed-off-by: Jens Axboe

    Jens Axboe
     

03 Feb, 2011

1 commit

  • This reverts commit 115e19c53501edc11f730191f7f047736815ae3d.

    Apparently setting inode->bdi to one's own sb->s_bdi stops VFS from
    sending *read-aheads*. This problem was bisected to this commit. A
    revert fixes it. I'll investigate farther why is this happening for the
    next Kernel, but for now a revert.

    I'm sending to stable@kernel.org as well, since it exists also in
    2.6.37. 2.6.36 is good and does not have this patch.

    CC: Stable Tree
    Signed-off-by: Boaz Harrosh
    Signed-off-by: Linus Torvalds

    Boaz Harrosh
     

26 Oct, 2010

2 commits

  • exofs_new_inode() was incrementing the inode->i_count and
    decrementing it in create_done(), in a bad attempt to make sure
    the inode will still be there when the asynchronous create_done()
    finally arrives. This was very stupid because iput() was not called,
    and if it was actually needed, it would leak the inode.

    However all this is not needed, because at exofs_evict_inode()
    we already wait for create_done() by waiting for the
    object_created event. Therefore remove the superfluous ref counting
    and just Thicken the comment at exofs_evict_inode() a bit.

    While at it change places that open coded wait_obj_created()
    to call the already available wrapper.

    CC: Dave Chinner
    CC: Christoph Hellwig
    CC: Nick Piggin
    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Signed-off-by: Joe Perches
    Signed-off-by: Boaz Harrosh

    Joe Perches
     

19 Oct, 2010

2 commits

  • Though it has been promised that inode->i_mapping->backing_dev_info
    is not used and the supporting code is fine. Until the pointer
    will default to NULL, I'd rather it points to the correct thing
    regardless.

    At least for future infrastructure coder it is a clear indication
    of where are the key points that inodes are initialized.
    I know because it took me time to find this out.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     
  • Last BUG fix added a flag to the the page_collect structure
    to communicate with readpage_strip. This calls for a clean up
    removing that flag's reincarnations in the read functions
    parameters.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh
     

08 Oct, 2010

1 commit


12 Aug, 2010

1 commit


10 Aug, 2010

3 commits

  • Signed-off-by: Al Viro

    Al Viro
     
  • These changes are crafted based on the similar
    conversion done to ext2 by Nick Piggin.

    * Remove the deprecated ->truncate vector. Let exofs_setattr
    take care of on-disk size updates.
    * Call truncate_pagecache on the unused pages if
    write_begin/end fails.
    * Cleanup exofs_delete_inode that did stupid inode
    writes and updates on an inode that will be
    removed.
    * And finally get rid of exofs_get_block. We never
    had any blocks it was all for calling nobh_truncate_page.
    nobh_truncate_page is not actually needed in exofs since
    the last page is complete and gone, just like all the other
    pages. There is no partial blocks in exofs.

    I've tested with this patch, and there are no apparent
    failures, so far.

    CC: Nick Piggin
    CC: Christoph Hellwig
    Signed-off-by: Boaz Harrosh
    Signed-off-by: Al Viro

    Boaz Harrosh
     
  • Replace inode_setattr with opencoded variants of it in all callers. This
    moves the remaining call to vmtruncate into the filesystem methods where it
    can be replaced with the proper truncate sequence.

    In a few cases it was obvious that we would never end up calling vmtruncate
    so it was left out in the opencoded variant:

    spufs: explicitly checks for ATTR_SIZE earlier
    btrfs,hugetlbfs,logfs,dlmfs: explicitly clears ATTR_SIZE earlier
    ufs: contains an opencoded simple_seattr + truncate that sets the filesize just above

    In addition to that ncpfs called inode_setattr with handcrafted iattrs,
    which allowed to trim down the opencoded variant.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Al Viro

    Christoph Hellwig
     

04 Aug, 2010

1 commit


24 May, 2010

1 commit


22 May, 2010

1 commit


17 May, 2010

1 commit

  • All vectors of address_space_operations should be initialized
    by the filesystem. Add the missing parts.

    This is actually an optimization, by using
    __set_page_dirty_nobuffers. The default, in case of NULL,
    would be __set_page_dirty_buffers which has these extar if(s).

    .releasepage && .invalidatepage should both not be called
    because page_private() is NULL in exofs. Put a WARN_ON if
    they are called, to indicate the Kernel has changed in this
    regard, if when it does.

    Signed-off-by: Boaz Harrosh

    Boaz Harrosh