lkml.org 
[lkml]   [2014]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v7 1/7] VFS: Introduce new O_DENY* open flags
    > +#define ESHAREDENIED	258	/* File is locked with a sharelock */

    Have you prepared C library patches to match this ?

    (and why not just use EPERM, it has the meaning you want already)


    > + * Check to see if there's a share_reservation conflict. LOCK_READ/LOCK_WRITE
    > + * tell us whether the reservation allows other readers and writers.
    > + */
    > +static int
    > +locks_mand_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
    > +{

    Shouldn't this also check for CAP_SYS_DAC or some similar permission so
    that root can override such a mess (eg to fix full disks in an
    emergency) ?


    > +
    > + /*
    > + * For sharelock mounts if a file was created but not opened, we need
    > + * to keep parent i_mutex until we finish the open to prevent races when
    > + * somebody opens newly created by us file and locks it with a sharelock
    > + * before we open it.
    > + */
    > + if (IS_SHARELOCK(dir->d_inode) && error > 0 && *opened & FILE_CREATED) {
    > + /* Don't check for write permission, don't truncate */
    > + open_flag &= ~O_TRUNC;
    > + will_truncate = false;
    > + acc_mode = MAY_OPEN;
    > + path_to_nameidata(path, nd);
    > +
    > + error = may_open(&nd->path, acc_mode, open_flag);
    > + if (error) {
    > + mutex_unlock(&dir->d_inode->i_mutex);
    > + goto out;
    > + }
    > + file->f_path.mnt = nd->path.mnt;
    > + error = finish_open(file, nd->path.dentry, NULL, opened);
    > + if (error) {
    > + mutex_unlock(&dir->d_inode->i_mutex);
    > + if (error == -EOPENSTALE)
    > + goto stale_open;
    > + goto out;
    > + }
    > + error = sharelock_lock_file(file);
    > + mutex_unlock(&dir->d_inode->i_mutex);
    > + if (error)
    > + goto exit_fput;
    > + goto opened;
    > + }
    > +
    > mutex_unlock(&dir->d_inode->i_mutex);

    What stops the file system changing mount flags via a remount between
    these two ?

    >
    > if (error <= 0) {
    > @@ -3034,6 +3073,18 @@ finish_open_created:
    > goto stale_open;
    > goto out;
    > }
    > +
    > + if (IS_SHARELOCK(dir->d_inode)) {
    > + /*
    > + * Lock parent i_mutex to prevent races with sharelocks on
    > + * newly created files.
    > + */
    > + mutex_lock(&dir->d_inode->i_mutex);
    > + error = sharelock_lock_file(file);
    > + mutex_unlock(&dir->d_inode->i_mutex);
    > + if (error)
    > + goto exit_fput;
    > + }
    > opened:


    \
     
     \ /
      Last update: 2014-01-17 19:41    [W:2.957 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site