lkml.org 
[lkml]   [2003]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH] 2 of 2 - Allow O_EXCL on a block device to claim exclusive use.
    ### Comments for ChangeSet

    the blockdev layer has a concept of 'claiming' a device,
    so for example it can be claimed when a filesystem is
    mounted or when it is included into a raid array.
    Only one subsystem can claim it at a time.

    This patch matches this functionality available to user-space
    via the O_EXCL flag to open.

    This allows user-space programs to easily test if a device
    is currently mounted etc, and to prevent a device from being
    mounted or otherwise claimed.

    ----------- Diffstat output ------------
    ./fs/block_dev.c | 16 +++++++++++++++-
    1 files changed, 15 insertions(+), 1 deletion(-)

    diff ./fs/block_dev.c~current~ ./fs/block_dev.c
    --- ./fs/block_dev.c~current~ 2003-08-11 09:01:38.000000000 +1000
    +++ ./fs/block_dev.c 2003-08-11 09:01:41.000000000 +1000
    @@ -643,6 +643,7 @@ int blkdev_get(struct block_device *bdev
    int blkdev_open(struct inode * inode, struct file * filp)
    {
    struct block_device *bdev;
    + int res;

    /*
    * Preserve backwards compatibility and allow large file access
    @@ -655,7 +656,18 @@ int blkdev_open(struct inode * inode, st
    bd_acquire(inode);
    bdev = inode->i_bdev;

    - return do_open(bdev, inode, filp);
    + res = do_open(bdev, inode, filp);
    + if (res)
    + return res;
    +
    + if (!(filp->f_flags & O_EXCL) )
    + return 0;
    +
    + if (!(res = bd_claim(bdev, filp)))
    + return 0;
    +
    + blkdev_put(bdev, BDEV_FILE);
    + return res;
    }

    int blkdev_put(struct block_device *bdev, int kind)
    @@ -704,6 +716,8 @@ int blkdev_put(struct block_device *bdev

    int blkdev_close(struct inode * inode, struct file * filp)
    {
    + if (inode->i_bdev->bd_holder == filp)
    + bd_release(inode->i_bdev);
    return blkdev_put(inode->i_bdev, BDEV_FILE);
    }

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2005-03-22 13:47    [W:0.022 / U:0.144 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site