24 Mar, 2019

1 commit

  • commit 5e3cc1ee1405a7eb3487ed24f786dec01b4cbe1f upstream.

    Use inode->i_lock to protect i_size_write(), else i_size_read() in
    generic_fillattr() may loop infinitely in read_seqcount_begin() when
    multiple processes invoke v9fs_vfs_getattr() or v9fs_vfs_getattr_dotl()
    simultaneously under 32-bit SMP environment, and a soft lockup will be
    triggered as show below:

    watchdog: BUG: soft lockup - CPU#5 stuck for 22s! [stat:2217]
    Modules linked in:
    CPU: 5 PID: 2217 Comm: stat Not tainted 5.0.0-rc1-00005-g7f702faf5a9e #4
    Hardware name: Generic DT based system
    PC is at generic_fillattr+0x104/0x108
    LR is at 0xec497f00
    pc : [] lr : [] psr: 200c0013
    sp : ec497e20 ip : ed608030 fp : ec497e3c
    r10: 00000000 r9 : ec497f00 r8 : ed608030
    r7 : ec497ebc r6 : ec497f00 r5 : ee5c1550 r4 : ee005780
    r3 : 0000052d r2 : 00000000 r1 : ec497f00 r0 : ed608030
    Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none
    Control: 10c5387d Table: ac48006a DAC: 00000051
    CPU: 5 PID: 2217 Comm: stat Not tainted 5.0.0-rc1-00005-g7f702faf5a9e #4
    Hardware name: Generic DT based system
    Backtrace:
    [] (dump_backtrace) from [] (show_stack+0x20/0x24)
    [] (show_stack) from [] (dump_stack+0xb0/0xdc)
    [] (dump_stack) from [] (show_regs+0x1c/0x20)
    [] (show_regs) from [] (watchdog_timer_fn+0x280/0x2f8)
    [] (watchdog_timer_fn) from [] (__hrtimer_run_queues+0x18c/0x380)
    [] (__hrtimer_run_queues) from [] (hrtimer_run_queues+0xb8/0xf0)
    [] (hrtimer_run_queues) from [] (run_local_timers+0x28/0x64)
    [] (run_local_timers) from [] (update_process_times+0x3c/0x6c)
    [] (update_process_times) from [] (tick_nohz_handler+0xe0/0x1bc)
    [] (tick_nohz_handler) from [] (arch_timer_handler_virt+0x38/0x48)
    [] (arch_timer_handler_virt) from [] (handle_percpu_devid_irq+0x8c/0x240)
    [] (handle_percpu_devid_irq) from [] (generic_handle_irq+0x34/0x44)
    [] (generic_handle_irq) from [] (__handle_domain_irq+0x6c/0xc4)
    [] (__handle_domain_irq) from [] (gic_handle_irq+0x4c/0x88)
    [] (gic_handle_irq) from [] (__irq_svc+0x70/0x98)
    [] (generic_fillattr) from [] (v9fs_vfs_getattr_dotl+0x74/0xa4)
    [] (v9fs_vfs_getattr_dotl) from [] (vfs_getattr_nosec+0x68/0x7c)
    [] (vfs_getattr_nosec) from [] (vfs_getattr+0x44/0x48)
    [] (vfs_getattr) from [] (vfs_statx+0x9c/0xec)
    [] (vfs_statx) from [] (sys_lstat64+0x48/0x78)
    [] (sys_lstat64) from [] (ret_fast_syscall+0x0/0x28)

    [dominique.martinet@cea.fr: updated comment to not refer to a function
    in another subsystem]
    Link: http://lkml.kernel.org/r/20190124063514.8571-2-houtao1@huawei.com
    Cc: stable@vger.kernel.org
    Fixes: 7549ae3e81cc ("9p: Use the i_size_[read, write]() macros instead of using inode->i_size directly.")
    Reported-by: Xing Gaopeng
    Signed-off-by: Hou Tao
    Signed-off-by: Dominique Martinet
    Signed-off-by: Greg Kroah-Hartman

    Hou Tao
     

12 Apr, 2015

2 commits


10 Jan, 2014

1 commit


04 Jan, 2012

1 commit


06 Sep, 2011

2 commits


21 Jul, 2011

1 commit

  • Btrfs needs to be able to control how filemap_write_and_wait_range() is called
    in fsync to make it less of a painful operation, so push down taking i_mutex and
    the calling of filemap_write_and_wait() down into the ->fsync() handlers. Some
    file systems can drop taking the i_mutex altogether it seems, like ext3 and
    ocfs2. For correctness sake I just pushed everything down in all cases to make
    sure that we keep the current behavior the same for everybody, and then each
    individual fs maintainer can make up their mind about what to do from there.
    Thanks,

    Acked-by: Jan Kara
    Signed-off-by: Josef Bacik
    Signed-off-by: Al Viro

    Josef Bacik
     

15 Mar, 2011

6 commits


13 Jan, 2011

1 commit

  • here we actually *want* ->d_op for root; setting it allows to get rid
    of kludge in v9fs_kill_super() since now we have proper ->d_release()
    for root and don't need to call it manually.

    Signed-off-by: Al Viro

    Al Viro
     

28 Oct, 2010

3 commits

  • SYNOPSIS
    size[4] Tfsync tag[2] fid[4] datasync[4]

    size[4] Rfsync tag[2]

    DESCRIPTION

    The Tfsync transaction transfers ("flushes") all modified in-core data of
    file identified by fid to the disk device (or other permanent storage
    device) where that file resides.

    If datasync flag is specified data will be fleshed but does not flush
    modified metadata unless that metadata is needed in order to allow a
    subsequent data retrieval to be correctly handled.

    Signed-off-by: Venkateswararao Jujjuri
    Signed-off-by: Eric Van Hensbergen

    Venkateswararao Jujjuri (JV)
     
  • Synopsis

    size[4] TLock tag[2] fid[4] flock[n]
    size[4] RLock tag[2] status[1]

    Description

    Tlock is used to acquire/release byte range posix locks on a file
    identified by given fid. The reply contains status of the lock request

    flock structure:
    type[1] - Type of lock: F_RDLCK, F_WRLCK, F_UNLCK
    flags[4] - Flags could be either of
    P9_LOCK_FLAGS_BLOCK - Blocked lock request, if there is a
    conflicting lock exists, wait for that lock to be released.
    P9_LOCK_FLAGS_RECLAIM - Reclaim lock request, used when client is
    trying to reclaim a lock after a server restrart (due to crash)
    start[8] - Starting offset for lock
    length[8] - Number of bytes to lock
    If length is 0, lock all bytes starting at the location 'start'
    through to the end of file
    pid[4] - PID of the process that wants to take lock
    client_id[4] - Unique client id

    status[1] - Status of the lock request, can be
    P9_LOCK_SUCCESS(0), P9_LOCK_BLOCKED(1), P9_LOCK_ERROR(2) or
    P9_LOCK_GRACE(3)
    P9_LOCK_SUCCESS - Request was successful
    P9_LOCK_BLOCKED - A conflicting lock is held by another process
    P9_LOCK_ERROR - Error while processing the lock request
    P9_LOCK_GRACE - Server is in grace period, it can't accept new lock
    requests in this period (except locks with
    P9_LOCK_FLAGS_RECLAIM flag set)

    Signed-off-by: M. Mohan Kumar
    Signed-off-by: Aneesh Kumar K.V
    Signed-off-by: Venkateswararao Jujjuri
    Signed-off-by: Eric Van Hensbergen

    M. Mohan Kumar
     
  • This patch also update mode bits, as a normal file system.
    I am not sure wether we should do that, considering that
    a setxattr on the server will again update the ACL/mode value

    Signed-off-by: Aneesh Kumar K.V
    Signed-off-by: Venkateswararao Jujjuri
    Signed-off-by: Eric Van Hensbergen

    Aneesh Kumar K.V
     

11 Aug, 2010

1 commit

  • * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (96 commits)
    no need for list_for_each_entry_safe()/resetting with superblock list
    Fix sget() race with failing mount
    vfs: don't hold s_umount over close_bdev_exclusive() call
    sysv: do not mark superblock dirty on remount
    sysv: do not mark superblock dirty on mount
    btrfs: remove junk sb_dirt change
    BFS: clean up the superblock usage
    AFFS: wait for sb synchronization when needed
    AFFS: clean up dirty flag usage
    cifs: truncate fallout
    mbcache: fix shrinker function return value
    mbcache: Remove unused features
    add f_flags to struct statfs(64)
    pass a struct path to vfs_statfs
    update VFS documentation for method changes.
    All filesystems that need invalidate_inode_buffers() are doing that explicitly
    convert remaining ->clear_inode() to ->evict_inode()
    Make ->drop_inode() just return whether inode needs to be dropped
    fs/inode.c:clear_inode() is gone
    fs/inode.c:evict() doesn't care about delete vs. non-delete paths now
    ...

    Fix up trivial conflicts in fs/nilfs2/super.c

    Linus Torvalds
     

10 Aug, 2010

1 commit


03 Aug, 2010

1 commit

  • SYNOPSIS

    size[4] Tgetattr tag[2] fid[4] request_mask[8]

    size[4] Rgetattr tag[2] lstat[n]

    DESCRIPTION

    The getattr transaction inquires about the file identified by fid.
    request_mask is a bit mask that specifies which fields of the
    stat structure is the client interested in.

    The reply will contain a machine-independent directory entry,
    laid out as follows:

    st_result_mask[8]
    Bit mask that indicates which fields in the stat structure
    have been populated by the server

    qid.type[1]
    the type of the file (directory, etc.), represented as a bit
    vector corresponding to the high 8 bits of the file's mode
    word.

    qid.vers[4]
    version number for given path

    qid.path[8]
    the file server's unique identification for the file

    st_mode[4]
    Permission and flags

    st_uid[4]
    User id of owner

    st_gid[4]
    Group ID of owner

    st_nlink[8]
    Number of hard links

    st_rdev[8]
    Device ID (if special file)

    st_size[8]
    Size, in bytes

    st_blksize[8]
    Block size for file system IO

    st_blocks[8]
    Number of file system blocks allocated

    st_atime_sec[8]
    Time of last access, seconds

    st_atime_nsec[8]
    Time of last access, nanoseconds

    st_mtime_sec[8]
    Time of last modification, seconds

    st_mtime_nsec[8]
    Time of last modification, nanoseconds

    st_ctime_sec[8]
    Time of last status change, seconds

    st_ctime_nsec[8]
    Time of last status change, nanoseconds

    st_btime_sec[8]
    Time of creation (birth) of file, seconds

    st_btime_nsec[8]
    Time of creation (birth) of file, nanoseconds

    st_gen[8]
    Inode generation

    st_data_version[8]
    Data version number

    request_mask and result_mask bit masks contain the following bits
    #define P9_STATS_MODE 0x00000001ULL
    #define P9_STATS_NLINK 0x00000002ULL
    #define P9_STATS_UID 0x00000004ULL
    #define P9_STATS_GID 0x00000008ULL
    #define P9_STATS_RDEV 0x00000010ULL
    #define P9_STATS_ATIME 0x00000020ULL
    #define P9_STATS_MTIME 0x00000040ULL
    #define P9_STATS_CTIME 0x00000080ULL
    #define P9_STATS_INO 0x00000100ULL
    #define P9_STATS_SIZE 0x00000200ULL
    #define P9_STATS_BLOCKS 0x00000400ULL

    #define P9_STATS_BTIME 0x00000800ULL
    #define P9_STATS_GEN 0x00001000ULL
    #define P9_STATS_DATA_VERSION 0x00002000ULL

    #define P9_STATS_BASIC 0x000007ffULL
    #define P9_STATS_ALL 0x00003fffULL

    This patch implements the client side of getattr implementation for
    9P2000.L. It introduces a new structure p9_stat_dotl for getting
    Linux stat information along with QID. The data layout is similar to
    stat structure in Linux user space with the following major
    differences:

    inode (st_ino) is not part of data. Instead qid is.

    device (st_dev) is not part of data because this doesn't make sense
    on the client.

    All time variables are 64 bit wide on the wire. The kernel seems to use
    32 bit variables for these variables. However, some of the architectures
    have used 64 bit variables and glibc exposes 64 bit variables to user
    space on some architectures. Hence to be on the safer side we have made
    these 64 bit in the protocol. Refer to the comments in
    include/asm-generic/stat.h

    There are some additional fields: st_btime_sec, st_btime_nsec, st_gen,
    st_data_version apart from the bitmask, st_result_mask. The bit mask
    is filled by the server to indicate which stat fields have been
    populated by the server. Currently there is no clean way for the
    server to obtain these additional fields, so it sends back just the
    basic fields.

    Signed-off-by: Sripathi Kodi
    Signed-off-by: Eric Van Hensbegren

    Sripathi Kodi
     

22 May, 2010

1 commit


09 Feb, 2010

1 commit

  • Implement the fsync in the client side by marking stat field values to 'don't touch' so that server may
    interpret it as a request to guarantee that the contents of the associated file are committed to stable
    storage before the Rwstat message is returned.

    Without this patch, calling fsync on a 9p file results in "Invalid argument" error. Please check the attached
    C program.

    Signed-off-by: Aneesh Kumar K.V
    Signed-off-by: M. Mohan Kumar
    Acked-by: Venkateswararao Jujjuri (JV)
    Signed-off-by: Eric Van Hensbergen

    M. Mohan Kumar
     

24 Sep, 2009

1 commit

  • This patch adds a persistent, read-only caching facility for
    9p clients using the FS-Cache caching backend.

    When the fscache facility is enabled, each inode is associated
    with a corresponding vcookie which is an index into the FS-Cache
    indexing tree. The FS-Cache indexing tree is indexed at 3 levels:
    - session object associated with each mount.
    - inode/vcookie
    - actual data (pages)

    A cache tag is chosen randomly for each session. These tags can
    be read off /sys/fs/9p/caches and can be passed as a mount-time
    parameter to re-attach to the specified caching session.

    Signed-off-by: Abhishek Kulkarni
    Signed-off-by: Eric Van Hensbergen

    Abhishek Kulkarni
     

28 Mar, 2009

1 commit


18 Oct, 2008

2 commits


03 Jul, 2008

1 commit

  • The legacy protocol's open operation doesn't handle an append operation
    (it is expected that the client take care of it). We were incorrectly
    passing the extended protocol's flag through even in legacy mode. This
    was reported in bugzilla report #10689. This patch fixes the problem
    by disallowing extended protocol open modes from being passed in legacy
    mode and implemented append functionality on the client side by adding
    a seek after the open.

    Signed-off-by: Eric Van Hensbergen

    Eric Van Hensbergen
     

15 Jul, 2007

1 commit

  • This patchset moves non-filesystem interfaces of v9fs from fs/9p to net/9p.
    It moves the transport, packet marshalling and connection layers to net/9p
    leaving only the VFS related files in fs/9p. This work is being done in
    preparation for in-kernel 9p servers as well as alternate 9p clients (other
    than VFS).

    Signed-off-by: Latchesar Ionkov
    Signed-off-by: Eric Van Hensbergen

    Latchesar Ionkov
     

27 Mar, 2007

1 commit


19 Feb, 2007

1 commit

  • While cacheing is generally frowned upon in the 9p world, it has its
    place -- particularly in situations where the remote file system is
    exclusive and/or read-only. The vacfs views of venti content addressable
    store are a real-world instance of such a situation. To facilitate higher
    performance for these workloads (and eventually use the fscache patches),
    we have enabled a "loose" cache mode which does not attempt to maintain
    any form of consistency on the page-cache or dcache. This results in over
    two orders of magnitude performance improvement for cacheable block reads
    in the Bonnie benchmark. The more aggressive use of the dcache also seems
    to improve metadata operational performance.

    Signed-off-by: Eric Van Hensbergen

    Eric Van Hensbergen
     

29 Jun, 2006

1 commit


29 Mar, 2006

1 commit

  • This is a conversion to make the various file_operations structs in fs/
    const. Basically a regexp job, with a few manual fixups

    The goal is both to increase correctness (harder to accidentally write to
    shared datastructures) and reducing the false sharing of cachelines with
    things that get dirty in .data (while .rodata is nicely read only and thus
    cache clean)

    Signed-off-by: Arjan van de Ven
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Arjan van de Ven
     

26 Mar, 2006

1 commit

  • Update license boilerplate to specify GPLv2 and remove the (at your option
    clause). This change was agreed to by all the copyright holders (approvals
    can be found on v9fs-developer mailing list).

    Signed-off-by: Eric Van Hensbergen
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric Van Hensbergen
     

03 Mar, 2006

1 commit

  • In order to assure atomic create+open v9fs stores the open fid produced by
    v9fs_vfs_create in the dentry, from where v9fs_file_open retrieves it and
    associates it with the open file.

    This patch modifies v9fs to use nameidata.intent.open values to do the atomic
    create+open.

    Signed-off-by: Latchesar Ionkov
    Signed-off-by: Eric Van Hensbergen
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Latchesar Ionkov
     

19 Jan, 2006

1 commit

  • v9fs mmap support was originally removed from v9fs at Al Viro's request,
    but recently there have been requests from folks who want readpage
    functionality (primarily to enable execution of files mounted via 9P).
    This patch adds readpage support (but not writepage which contained most of
    the objectionable code). It passes fsx-linux (and other regressions) so it
    should be relatively safe.

    Signed-off-by: Eric Van Hensbergen
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric Van Hensbergen
     

09 Jan, 2006

1 commit


10 Sep, 2005

1 commit