Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
January 2013
- 69 participants
- 481 messages
Re: Clang warnings on OS X ML
by Charles Davis
On Jan 30, 2013, at 6:44 PM, C.W. Betts wrote:
> When compiling Wine using Clang, there are a bunch of warnings that pop up, such as:
> ld: warning: could not create compact unwind for .L__wine_spec_call16_p_pw: dwarf uses DW_CFA_same_value
> ld: warning: could not create compact unwind for ___wine_stub_VARBSTRFROMR8: stack subq instruction is too different from dwarf stack size
>
> On win16 DLLs.
>
> And these warnings are with general DLL:
> ld: warning: could not create compact unwind for ___wine_stub__aullshr: stack subq instruction is too different from dwarf stack size
> ld: warning: could not create compact unwind for .L__wine_spec_relay_entry_point_52: stack subq instruction is too different from dwarf stack size
These are all related to compact unwind support--slated for inclusion in DWARF 5. Don't worry: they're harmless. The linker will just create normal unwind info instead... I think. They also all happen in winebuild-generated code--normal C code is (largely) unaffected. I'm not sure if we want to fix this or not: we don't use DWARF unwind info at all in 32-bit code, and even if we did, we certainly don't know how to parse the compact unwind data. 64-bit code is another matter, but we're a long way from supporting Wine64 on Mac--mostly due to the fact that Wine wants to use the GS segment for itself, but Mac OS is already using it. (tl;dr: Don't worry about it for now, even if all that went over your head. :)
>
>
> Another worrying warning is that __force_align_arg_pointer__ being an unknown attribute.
Now that's not right. I specifically implemented this attribute in Clang myself just so I could build Wine with it. There were some *errors* about this attribute being used in a function pointer type, but as of Monday on Clang trunk, they're just warnings--really annoying warnings that I'm sure AJ won't want to have to turn off. (I know. I tried.) I also recall once that Clang didn't always accept the __-bracketed versions of some GNU attributes, which should also be fixed (and has been for several LLVM releases now!). I'd be surprised if Apple clang doesn't have this latter fix yet, though Xcode 4.5 still had some pre-LLVM 3.1 version of Clang. Seriously, if you're not running the latest Xcode--which as of yesterday is 4.6--you should be. Apple often branches their own releases from LLVM/Clang trunk. (I always use Clang trunk directly myself, but that's partly because I'm also a part-time Clang developer.)
>
> There's also a lot of enum conversion warnings.
They're harmless. Most of them are in Direct3D code, because the client DLLs and the WineD3D backend DLL use different (but compatible) enumeration types. A few are in tests that try to pass nonsense values like 0xdeadbeef that are outside the range of known enumerators. It's just Clang being pedantic about the enum rules in C. Don't know if AJ or Henri are willing to take patches to silence these warnings.
>
> There was also a linker warning about register usage, but I can't seem to find it again.
I'll bet it's another compact unwind-related warning. I recall seeing something to that effect myself--something along the lines of:
ld: warning: could not create compact unwind for <some winebuild-generated symbol>: %ebp not used for stack frame
or something.
Chip
Jan. 31, 2013
Re: [PATCH 1/2] shell32: Add a basic implementation for SHGetStockIconInfo
by Dmitry Timoshkov
Detlef Riekenberg <wine.dev(a)web.de> wrote:
> +/****************************************************************************
> + * helper for SHGetStockIconInfo
> + */
> +typedef struct stockiconentry_t {
> + SHSTOCKICONID id;
> + DWORD iconid;
> +} stockiconentry;
Why bother with a typedef?
> +static stockiconentry stockicontable[] = {
> + {SIID_DOCNOASSOC, IDI_SHELL_DOCUMENT},
> + {SIID_DOCASSOC, IDI_SHELL_DOCUMENT},
> + {SIID_FOLDER, IDI_SHELL_FOLDER},
> + {SIID_DRIVERNET, IDI_SHELL_NETDRIVE},
> + {SIID_DRIVERCD, IDI_SHELL_CDROM},
> + {SIID_DRIVERRAM, IDI_SHELL_RAMDISK},
> + {SIID_DESKTOPPC, IDI_SHELL_MY_COMPUTER},
> + {SIID_PRINTER, IDI_SHELL_PRINTER},
> + {SIID_SETTINGS, IDI_SHELL_CONTROL_PANEL},
> + {SIID_RECYCLERFULL, IDI_SHELL_FULL_RECYCLE_BIN},
> + {SIID_DELETE, IDI_SHELL_CONFIRM_DELETE},
> +};
Please don't forget to add 'const'.
> +static int cmp_stockiconentry(const void *entry1, const void *entry2)
> +{
> + stockiconentry *p1 = (stockiconentry *) entry1;
> + stockiconentry *p2 = (stockiconentry *) entry2;
> +
> + return p1->id - p2->id;
> +}
Don't cast away 'const'.
> +HRESULT WINAPI SHGetStockIconInfo(SHSTOCKICONID id, UINT flags, SHSTOCKICONINFO *sii)
> +{
> + stockiconentry *entry;
> +
> + TRACE("(%d, 0x%x, %p)\n", id, flags, sii);
> + if ((id < 0) | (id >= (SIID_MAX_ICONS - 1)) || !sii || (sii->cbSize != sizeof(SHSTOCKICONINFO)))
> + return E_INVALIDARG;
> +
> + /* find the requested icon */
> + entry = bsearch(&id, stockicontable, sizeof(stockicontable)/sizeof(stockicontable[0]),
> + sizeof(stockiconentry), cmp_stockiconentry);
> +
> + if (!entry) {
> + FIXME("using fallback for id %d\n", id);
> + entry = stockicontable;
> + }
> +
> + if (flags)
> + FIXME("flags 0x%x not implemented\n", flags);
> +
> + sii->hIcon = NULL;
> + sii->iSysImageIndex = -1;
> + sii->iIcon = - entry->iconid;
> +
> + GetModuleFileNameW(shell32_hInstance, sii->szPath, MAX_PATH);
> +
> + return S_OK;
> +}
GetModuleFileNameW can fail, so filling 'sii' may be a bit premature.
--
Dmitry.
Jan. 31, 2013
Re: [website] Added Simplified Chinese translation
by Qian Hong
On Thu, Jan 31, 2013 at 11:34 AM, Jactry Zeng <jactry92(a)gmail.com> wrote:
> Hi folks,
> this is Simplified Chinese translation for Wine's website
The translation looks good to me, thanks for the great work!
--
Regards,
Qian Hong
-
Sent from Ubuntu
http://www.ubuntu.com/
Jan. 31, 2013
Re: [website] Added simplified chinese
by Qian Hong
On Thu, Jan 31, 2013 at 1:24 AM, Jeremy Newman <jnewman(a)codeweavers.com> wrote:
>
> We prefer UTF-8 as that is what the underlying template engine of the
> website understands. Modern browsers should be able to use it just fine
> (hopefully, even in China).
Don't worry about UTF-8, let's commit the patch and see what happens. <grin>
According to http://tongji.baidu.com/data/browser , 74% of Chinese
users are using MSIE{6,8,9}, if MSIE has any trouble to display UTF-8
Chinese text, we could consider providing a binary patch to MS, or
maybe even source code patch, we already has a gecko-based IE which
supports UTF-8 pretty good...
Just a joke, but seriously, UTF-8 is supported even in China :)
The translation part of the patch looks good to me, but as I know
Jactry is working on an improved version, let's wait for his new work.
Thanks.
--
Regards,
Qian Hong
-
Sent from Ubuntu
http://www.ubuntu.com/
Jan. 31, 2013
Clang warnings on OS X ML
by C.W. Betts
When compiling Wine using Clang, there are a bunch of warnings that pop up, such as:
ld: warning: could not create compact unwind for .L__wine_spec_call16_p_pw: dwarf uses DW_CFA_same_value
ld: warning: could not create compact unwind for ___wine_stub_VARBSTRFROMR8: stack subq instruction is too different from dwarf stack size
On win16 DLLs.
And these warnings are with general DLL:
ld: warning: could not create compact unwind for ___wine_stub__aullshr: stack subq instruction is too different from dwarf stack size
ld: warning: could not create compact unwind for .L__wine_spec_relay_entry_point_52: stack subq instruction is too different from dwarf stack size
Another worrying warning is that __force_align_arg_pointer__ being an unknown attribute.
There's also a lot of enum conversion warnings.
There was also a linker warning about register usage, but I can't seem to find it again.
I could upload the whole log, but it is fairly large: 6.4 MB.
Jan. 31, 2013
Re: [PATCH v2 4/8] CIFS: Add O_DENY* open flags support
by J. Bruce Fields
On Thu, Jan 17, 2013 at 08:53:00PM +0400, Pavel Shilovsky wrote:
> Make CIFSSMBOpen take share_flags as a parm that allows us
> to pass new O_DENY* flags to the server.
>
> Signed-off-by: Pavel Shilovsky <piastry(a)etersoft.ru>
> ---
> fs/cifs/cifsacl.c | 10 ++++++----
> fs/cifs/cifsglob.h | 12 +++++++++++-
> fs/cifs/cifsproto.h | 9 +++++----
> fs/cifs/cifssmb.c | 47 +++++++++++++++++++++++++----------------------
> fs/cifs/dir.c | 13 ++++++++-----
> fs/cifs/file.c | 12 ++++++++----
> fs/cifs/inode.c | 11 ++++++-----
> fs/cifs/link.c | 10 +++++-----
> fs/cifs/readdir.c | 2 +-
> fs/cifs/smb1ops.c | 15 ++++++++-------
> fs/cifs/smb2file.c | 10 +++++-----
> fs/cifs/smb2inode.c | 4 ++--
> fs/cifs/smb2ops.c | 10 ++++++----
> fs/cifs/smb2pdu.c | 6 +++---
> fs/cifs/smb2proto.h | 14 ++++++++------
> 15 files changed, 107 insertions(+), 78 deletions(-)
>
> diff --git a/fs/cifs/cifsacl.c b/fs/cifs/cifsacl.c
> index 0fb15bb..a42c77f 100644
> --- a/fs/cifs/cifsacl.c
> +++ b/fs/cifs/cifsacl.c
> @@ -1184,8 +1184,9 @@ static struct cifs_ntsd *get_cifs_acl_by_path(struct cifs_sb_info *cifs_sb,
> create_options |= CREATE_OPEN_BACKUP_INTENT;
>
> rc = CIFSSMBOpen(xid, tcon, path, FILE_OPEN, READ_CONTROL,
> - create_options, &fid, &oplock, NULL, cifs_sb->local_nls,
> - cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
> + FILE_SHARE_ALL, create_options, &fid, &oplock,
> + NULL, cifs_sb->local_nls,
> + cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
> if (!rc) {
> rc = CIFSSMBGetCIFSACL(xid, tcon, fid, &pntsd, pacllen);
> CIFSSMBClose(xid, tcon, fid);
> @@ -1245,8 +1246,9 @@ int set_cifs_acl(struct cifs_ntsd *pnntsd, __u32 acllen,
> access_flags = WRITE_DAC;
>
> rc = CIFSSMBOpen(xid, tcon, path, FILE_OPEN, access_flags,
> - create_options, &fid, &oplock, NULL, cifs_sb->local_nls,
> - cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
> + FILE_SHARE_ALL, create_options, &fid, &oplock,
> + NULL, cifs_sb->local_nls,
> + cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
It would be easier to tell what you changed in the above two chunks if
you didn't change the whitespace at the same time.
--b.
> if (rc) {
> cERROR(1, "Unable to open file to set ACL");
> goto out;
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 3763624..8c1a27f 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -313,7 +313,7 @@ struct smb_version_operations {
> struct cifs_sb_info *);
> /* open a file for non-posix mounts */
> int (*open)(const unsigned int, struct cifs_tcon *, const char *, int,
> - int, int, struct cifs_fid *, __u32 *, FILE_ALL_INFO *,
> + int, int, int, struct cifs_fid *, __u32 *, FILE_ALL_INFO *,
> struct cifs_sb_info *);
> /* set fid protocol-specific info */
> void (*set_fid)(struct cifsFileInfo *, struct cifs_fid *, __u32);
> @@ -948,6 +948,16 @@ struct cifsFileInfo {
> struct work_struct oplock_break; /* work for oplock breaks */
> };
>
> +#define CIFS_DENY_RW_FLAGS_SHIFT 22
> +#define CIFS_DENY_DEL_FLAG_SHIFT 23
> +
> +static inline int cifs_get_share_flags(unsigned int flags)
> +{
> + return (flags & O_DENYMAND) ?
> + (((~(flags >> CIFS_DENY_RW_FLAGS_SHIFT)) & 3) |
> + ((~(flags >> CIFS_DENY_DEL_FLAG_SHIFT)) & 4)) : FILE_SHARE_ALL;
> +}
> +
> struct cifs_io_parms {
> __u16 netfid;
> #ifdef CONFIG_CIFS_SMB2
> diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
> index 5144e9f..3f5a46a 100644
> --- a/fs/cifs/cifsproto.h
> +++ b/fs/cifs/cifsproto.h
> @@ -361,10 +361,11 @@ extern int CIFSSMBQueryReparseLinkInfo(const unsigned int xid,
> const struct nls_table *nls_codepage);
> #endif /* temporarily unused until cifs_symlink fixed */
> extern int CIFSSMBOpen(const unsigned int xid, struct cifs_tcon *tcon,
> - const char *fileName, const int disposition,
> - const int access_flags, const int omode,
> - __u16 *netfid, int *pOplock, FILE_ALL_INFO *,
> - const struct nls_table *nls_codepage, int remap);
> + const char *file_name, const int disposition,
> + const int access_flags, const int share_flags,
> + const int omode, __u16 *netfid, int *oplock,
> + FILE_ALL_INFO *, const struct nls_table *nls_codepage,
> + int remap);
> extern int SMBLegacyOpen(const unsigned int xid, struct cifs_tcon *tcon,
> const char *fileName, const int disposition,
> const int access_flags, const int omode,
> diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
> index 76d0d29..9c4632f 100644
> --- a/fs/cifs/cifssmb.c
> +++ b/fs/cifs/cifssmb.c
> @@ -1289,10 +1289,11 @@ OldOpenRetry:
>
> int
> CIFSSMBOpen(const unsigned int xid, struct cifs_tcon *tcon,
> - const char *fileName, const int openDisposition,
> - const int access_flags, const int create_options, __u16 *netfid,
> - int *pOplock, FILE_ALL_INFO *pfile_info,
> - const struct nls_table *nls_codepage, int remap)
> + const char *file_name, const int disposition,
> + const int access_flags, const int share_flags,
> + const int create_options, __u16 *netfid, int *oplock,
> + FILE_ALL_INFO *file_info, const struct nls_table *nls_codepage,
> + int remap)
> {
> int rc = -EACCES;
> OPEN_REQ *pSMB = NULL;
> @@ -1313,26 +1314,28 @@ openRetry:
> count = 1; /* account for one byte pad to word boundary */
> name_len =
> cifsConvertToUTF16((__le16 *) (pSMB->fileName + 1),
> - fileName, PATH_MAX, nls_codepage, remap);
> + file_name, PATH_MAX, nls_codepage,
> + remap);
> name_len++; /* trailing null */
> name_len *= 2;
> pSMB->NameLength = cpu_to_le16(name_len);
> } else { /* BB improve check for buffer overruns BB */
> count = 0; /* no pad */
> - name_len = strnlen(fileName, PATH_MAX);
> + name_len = strnlen(file_name, PATH_MAX);
> name_len++; /* trailing null */
> pSMB->NameLength = cpu_to_le16(name_len);
> - strncpy(pSMB->fileName, fileName, name_len);
> + strncpy(pSMB->fileName, file_name, name_len);
> }
> - if (*pOplock & REQ_OPLOCK)
> + if (*oplock & REQ_OPLOCK)
> pSMB->OpenFlags = cpu_to_le32(REQ_OPLOCK);
> - else if (*pOplock & REQ_BATCHOPLOCK)
> + else if (*oplock & REQ_BATCHOPLOCK)
> pSMB->OpenFlags = cpu_to_le32(REQ_BATCHOPLOCK);
> pSMB->DesiredAccess = cpu_to_le32(access_flags);
> pSMB->AllocationSize = 0;
> - /* set file as system file if special file such
> - as fifo and server expecting SFU style and
> - no Unix extensions */
> + /*
> + * set file as system file if special file such as fifo and server
> + * expecting SFU style and no Unix extensions
> + */
> if (create_options & CREATE_OPTION_SPECIAL)
> pSMB->FileAttributes = cpu_to_le32(ATTR_SYSTEM);
> else
> @@ -1347,8 +1350,8 @@ openRetry:
> if (create_options & CREATE_OPTION_READONLY)
> pSMB->FileAttributes |= cpu_to_le32(ATTR_READONLY);
>
> - pSMB->ShareAccess = cpu_to_le32(FILE_SHARE_ALL);
> - pSMB->CreateDisposition = cpu_to_le32(openDisposition);
> + pSMB->ShareAccess = cpu_to_le32(share_flags);
> + pSMB->CreateDisposition = cpu_to_le32(disposition);
> pSMB->CreateOptions = cpu_to_le32(create_options & CREATE_OPTIONS_MASK);
> /* BB Expirement with various impersonation levels and verify */
> pSMB->ImpersonationLevel = cpu_to_le32(SECURITY_IMPERSONATION);
> @@ -1366,20 +1369,20 @@ openRetry:
> if (rc) {
> cFYI(1, "Error in Open = %d", rc);
> } else {
> - *pOplock = pSMBr->OplockLevel; /* 1 byte no need to le_to_cpu */
> + *oplock = pSMBr->OplockLevel; /* 1 byte no need to le_to_cpu */
> *netfid = pSMBr->Fid; /* cifs fid stays in le */
> /* Let caller know file was created so we can set the mode. */
> /* Do we care about the CreateAction in any other cases? */
> if (cpu_to_le32(FILE_CREATE) == pSMBr->CreateAction)
> - *pOplock |= CIFS_CREATE_ACTION;
> - if (pfile_info) {
> - memcpy((char *)pfile_info, (char *)&pSMBr->CreationTime,
> + *oplock |= CIFS_CREATE_ACTION;
> + if (file_info) {
> + memcpy((char *)file_info, (char *)&pSMBr->CreationTime,
> 36 /* CreationTime to Attributes */);
> /* the file_info buf is endian converted by caller */
> - pfile_info->AllocationSize = pSMBr->AllocationSize;
> - pfile_info->EndOfFile = pSMBr->EndOfFile;
> - pfile_info->NumberOfLinks = cpu_to_le32(1);
> - pfile_info->DeletePending = 0;
> + file_info->AllocationSize = pSMBr->AllocationSize;
> + file_info->EndOfFile = pSMBr->EndOfFile;
> + file_info->NumberOfLinks = cpu_to_le32(1);
> + file_info->DeletePending = 0;
> }
> }
>
> diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
> index d3671f2..12ee773 100644
> --- a/fs/cifs/dir.c
> +++ b/fs/cifs/dir.c
> @@ -171,6 +171,7 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
> FILE_ALL_INFO *buf = NULL;
> struct inode *newinode = NULL;
> int disposition;
> + int share_access;
> struct TCP_Server_Info *server = tcon->ses->server;
>
> *oplock = 0;
> @@ -261,6 +262,8 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
> else
> cFYI(1, "Create flag not set in create function");
>
> + share_access = cifs_get_share_flags(oflags);
> +
> /*
> * BB add processing to set equivalent of mode - e.g. via CreateX with
> * ACLs
> @@ -288,8 +291,8 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid,
> create_options |= CREATE_OPEN_BACKUP_INTENT;
>
> rc = server->ops->open(xid, tcon, full_path, disposition,
> - desired_access, create_options, fid, oplock,
> - buf, cifs_sb);
> + desired_access, share_access, create_options,
> + fid, oplock, buf, cifs_sb);
> if (rc) {
> cFYI(1, "cifs_create returned 0x%x", rc);
> goto out;
> @@ -594,9 +597,9 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, umode_t mode,
> if (backup_cred(cifs_sb))
> create_options |= CREATE_OPEN_BACKUP_INTENT;
>
> - rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_CREATE,
> - GENERIC_WRITE, create_options,
> - &fileHandle, &oplock, buf, cifs_sb->local_nls,
> + rc = CIFSSMBOpen(xid, pTcon, full_path, FILE_CREATE, GENERIC_WRITE,
> + FILE_SHARE_ALL, create_options, &fileHandle, &oplock,
> + buf, cifs_sb->local_nls,
> cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
> if (rc)
> goto mknod_out;
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index 70b6f4c..4ddf450 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -174,6 +174,7 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
> {
> int rc;
> int desired_access;
> + int share_access;
> int disposition;
> int create_options = CREATE_NOT_DIR;
> FILE_ALL_INFO *buf;
> @@ -209,6 +210,7 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
> *********************************************************************/
>
> disposition = cifs_get_disposition(f_flags);
> + share_access = cifs_get_share_flags(f_flags);
>
> /* BB pass O_SYNC flag through on file attributes .. BB */
>
> @@ -220,8 +222,8 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,
> create_options |= CREATE_OPEN_BACKUP_INTENT;
>
> rc = server->ops->open(xid, tcon, full_path, disposition,
> - desired_access, create_options, fid, oplock, buf,
> - cifs_sb);
> + desired_access, share_access, create_options,
> + fid, oplock, buf, cifs_sb);
>
> if (rc)
> goto out;
> @@ -531,6 +533,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
> struct inode *inode;
> char *full_path = NULL;
> int desired_access;
> + int share_access;
> int disposition = FILE_OPEN;
> int create_options = CREATE_NOT_DIR;
> struct cifs_fid fid;
> @@ -595,6 +598,7 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
> }
>
> desired_access = cifs_convert_flags(cfile->f_flags);
> + share_access = cifs_get_share_flags(cfile->f_flags);
>
> if (backup_cred(cifs_sb))
> create_options |= CREATE_OPEN_BACKUP_INTENT;
> @@ -610,8 +614,8 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush)
> * not dirty locally we could do this.
> */
> rc = server->ops->open(xid, tcon, full_path, disposition,
> - desired_access, create_options, &fid, &oplock,
> - NULL, cifs_sb);
> + desired_access, share_access, create_options,
> + &fid, &oplock, NULL, cifs_sb);
> if (rc) {
> mutex_unlock(&cfile->fh_mutex);
> cFYI(1, "cifs_reopen returned 0x%x", rc);
> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
> index afdff79..30c0a53 100644
> --- a/fs/cifs/inode.c
> +++ b/fs/cifs/inode.c
> @@ -396,8 +396,8 @@ cifs_sfu_type(struct cifs_fattr *fattr, const unsigned char *path,
> tcon = tlink_tcon(tlink);
>
> rc = CIFSSMBOpen(xid, tcon, path, FILE_OPEN, GENERIC_READ,
> - CREATE_NOT_DIR, &netfid, &oplock, NULL,
> - cifs_sb->local_nls,
> + FILE_SHARE_ALL, CREATE_NOT_DIR, &netfid, &oplock,
> + NULL, cifs_sb->local_nls,
> cifs_sb->mnt_cifs_flags &
> CIFS_MOUNT_MAP_SPECIAL_CHR);
> if (rc == 0) {
> @@ -987,8 +987,9 @@ cifs_rename_pending_delete(const char *full_path, struct dentry *dentry,
> tcon = tlink_tcon(tlink);
>
> rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
> - DELETE|FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR,
> - &netfid, &oplock, NULL, cifs_sb->local_nls,
> + DELETE|FILE_WRITE_ATTRIBUTES, FILE_SHARE_ALL,
> + CREATE_NOT_DIR, &netfid, &oplock, NULL,
> + cifs_sb->local_nls,
> cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
> if (rc != 0)
> goto out;
> @@ -1509,7 +1510,7 @@ cifs_do_rename(const unsigned int xid, struct dentry *from_dentry,
>
> /* open the file to be renamed -- we need DELETE perms */
> rc = CIFSSMBOpen(xid, tcon, from_path, FILE_OPEN, DELETE,
> - CREATE_NOT_DIR, &srcfid, &oplock, NULL,
> + FILE_SHARE_ALL, CREATE_NOT_DIR, &srcfid, &oplock, NULL,
> cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
> CIFS_MOUNT_MAP_SPECIAL_CHR);
> if (rc == 0) {
> diff --git a/fs/cifs/link.c b/fs/cifs/link.c
> index 51dc2fb..9b4f0db 100644
> --- a/fs/cifs/link.c
> +++ b/fs/cifs/link.c
> @@ -212,7 +212,7 @@ CIFSCreateMFSymLink(const unsigned int xid, struct cifs_tcon *tcon,
> create_options |= CREATE_OPEN_BACKUP_INTENT;
>
> rc = CIFSSMBOpen(xid, tcon, fromName, FILE_CREATE, GENERIC_WRITE,
> - create_options, &netfid, &oplock, NULL,
> + FILE_SHARE_ALL, create_options, &netfid, &oplock, NULL,
> nls_codepage, remap);
> if (rc != 0) {
> kfree(buf);
> @@ -254,8 +254,8 @@ CIFSQueryMFSymLink(const unsigned int xid, struct cifs_tcon *tcon,
> FILE_ALL_INFO file_info;
>
> rc = CIFSSMBOpen(xid, tcon, searchName, FILE_OPEN, GENERIC_READ,
> - CREATE_NOT_DIR, &netfid, &oplock, &file_info,
> - nls_codepage, remap);
> + FILE_SHARE_ALL, CREATE_NOT_DIR, &netfid, &oplock,
> + &file_info, nls_codepage, remap);
> if (rc != 0)
> return rc;
>
> @@ -332,8 +332,8 @@ CIFSCheckMFSymlink(struct cifs_fattr *fattr,
> pTcon = tlink_tcon(tlink);
>
> rc = CIFSSMBOpen(xid, pTcon, path, FILE_OPEN, GENERIC_READ,
> - CREATE_NOT_DIR, &netfid, &oplock, &file_info,
> - cifs_sb->local_nls,
> + FILE_SHARE_ALL, CREATE_NOT_DIR, &netfid, &oplock,
> + &file_info, cifs_sb->local_nls,
> cifs_sb->mnt_cifs_flags &
> CIFS_MOUNT_MAP_SPECIAL_CHR);
> if (rc != 0)
> diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
> index 1c576e8..ad3f136 100644
> --- a/fs/cifs/readdir.c
> +++ b/fs/cifs/readdir.c
> @@ -206,7 +206,7 @@ int get_symlink_reparse_path(char *full_path, struct cifs_sb_info *cifs_sb,
> char *tmpbuffer;
>
> rc = CIFSSMBOpen(xid, ptcon, full_path, FILE_OPEN, GENERIC_READ,
> - OPEN_REPARSE_POINT, &fid, &oplock, NULL,
> + FILE_SHARE_ALL, OPEN_REPARSE_POINT, &fid, &oplock, NULL,
> cifs_sb->local_nls,
> cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
> if (!rc) {
> diff --git a/fs/cifs/smb1ops.c b/fs/cifs/smb1ops.c
> index 34cea27..beaad4d 100644
> --- a/fs/cifs/smb1ops.c
> +++ b/fs/cifs/smb1ops.c
> @@ -695,9 +695,9 @@ cifs_mkdir_setinfo(struct inode *inode, const char *full_path,
>
> static int
> cifs_open_file(const unsigned int xid, struct cifs_tcon *tcon, const char *path,
> - int disposition, int desired_access, int create_options,
> - struct cifs_fid *fid, __u32 *oplock, FILE_ALL_INFO *buf,
> - struct cifs_sb_info *cifs_sb)
> + int disposition, int desired_access, int share_access,
> + int create_options, struct cifs_fid *fid, __u32 *oplock,
> + FILE_ALL_INFO *buf, struct cifs_sb_info *cifs_sb)
> {
> if (!(tcon->ses->capabilities & CAP_NT_SMBS))
> return SMBLegacyOpen(xid, tcon, path, disposition,
> @@ -706,8 +706,8 @@ cifs_open_file(const unsigned int xid, struct cifs_tcon *tcon, const char *path,
> cifs_sb->local_nls, cifs_sb->mnt_cifs_flags
> & CIFS_MOUNT_MAP_SPECIAL_CHR);
> return CIFSSMBOpen(xid, tcon, path, disposition, desired_access,
> - create_options, &fid->netfid, oplock, buf,
> - cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
> + share_access, create_options, &fid->netfid, oplock,
> + buf, cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
> CIFS_MOUNT_MAP_SPECIAL_CHR);
> }
>
> @@ -803,8 +803,9 @@ smb_set_file_info(struct inode *inode, const char *full_path,
> cFYI(1, "calling SetFileInfo since SetPathInfo for times not supported "
> "by this server");
> rc = CIFSSMBOpen(xid, tcon, full_path, FILE_OPEN,
> - SYNCHRONIZE | FILE_WRITE_ATTRIBUTES, CREATE_NOT_DIR,
> - &netfid, &oplock, NULL, cifs_sb->local_nls,
> + SYNCHRONIZE | FILE_WRITE_ATTRIBUTES, FILE_SHARE_ALL,
> + CREATE_NOT_DIR, &netfid, &oplock, NULL,
> + cifs_sb->local_nls,
> cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
>
> if (rc != 0) {
> diff --git a/fs/cifs/smb2file.c b/fs/cifs/smb2file.c
> index a93eec3..bfe22e8 100644
> --- a/fs/cifs/smb2file.c
> +++ b/fs/cifs/smb2file.c
> @@ -58,9 +58,9 @@ smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock)
>
> int
> smb2_open_file(const unsigned int xid, struct cifs_tcon *tcon, const char *path,
> - int disposition, int desired_access, int create_options,
> - struct cifs_fid *fid, __u32 *oplock, FILE_ALL_INFO *buf,
> - struct cifs_sb_info *cifs_sb)
> + int disposition, int desired_access, int share_access,
> + int create_options, struct cifs_fid *fid, __u32 *oplock,
> + FILE_ALL_INFO *buf, struct cifs_sb_info *cifs_sb)
> {
> int rc;
> __le16 *smb2_path;
> @@ -87,8 +87,8 @@ smb2_open_file(const unsigned int xid, struct cifs_tcon *tcon, const char *path,
> memcpy(smb2_oplock + 1, fid->lease_key, SMB2_LEASE_KEY_SIZE);
>
> rc = SMB2_open(xid, tcon, smb2_path, &fid->persistent_fid,
> - &fid->volatile_fid, desired_access, disposition,
> - 0, 0, smb2_oplock, smb2_data);
> + &fid->volatile_fid, desired_access, share_access,
> + disposition, 0, 0, smb2_oplock, smb2_data);
> if (rc)
> goto out;
>
> diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c
> index 7064824..6af174a 100644
> --- a/fs/cifs/smb2inode.c
> +++ b/fs/cifs/smb2inode.c
> @@ -54,8 +54,8 @@ smb2_open_op_close(const unsigned int xid, struct cifs_tcon *tcon,
> return -ENOMEM;
>
> rc = SMB2_open(xid, tcon, utf16_path, &persistent_fid, &volatile_fid,
> - desired_access, create_disposition, file_attributes,
> - create_options, &oplock, NULL);
> + desired_access, FILE_SHARE_ALL, create_disposition,
> + file_attributes, create_options, &oplock, NULL);
> if (rc) {
> kfree(utf16_path);
> return rc;
> diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
> index 381f9a5..169b9a8 100644
> --- a/fs/cifs/smb2ops.c
> +++ b/fs/cifs/smb2ops.c
> @@ -222,7 +222,8 @@ smb2_is_path_accessible(const unsigned int xid, struct cifs_tcon *tcon,
> return -ENOMEM;
>
> rc = SMB2_open(xid, tcon, utf16_path, &persistent_fid, &volatile_fid,
> - FILE_READ_ATTRIBUTES, FILE_OPEN, 0, 0, &oplock, NULL);
> + FILE_READ_ATTRIBUTES, FILE_SHARE_ALL, FILE_OPEN, 0, 0,
> + &oplock, NULL);
> if (rc) {
> kfree(utf16_path);
> return rc;
> @@ -449,8 +450,8 @@ smb2_query_dir_first(const unsigned int xid, struct cifs_tcon *tcon,
> return -ENOMEM;
>
> rc = SMB2_open(xid, tcon, utf16_path, &persistent_fid, &volatile_fid,
> - FILE_READ_ATTRIBUTES | FILE_READ_DATA, FILE_OPEN, 0, 0,
> - &oplock, NULL);
> + FILE_READ_ATTRIBUTES | FILE_READ_DATA, FILE_SHARE_ALL,
> + FILE_OPEN, 0, 0, &oplock, NULL);
> kfree(utf16_path);
> if (rc) {
> cERROR(1, "open dir failed");
> @@ -532,7 +533,8 @@ smb2_queryfs(const unsigned int xid, struct cifs_tcon *tcon,
> u8 oplock = SMB2_OPLOCK_LEVEL_NONE;
>
> rc = SMB2_open(xid, tcon, &srch_path, &persistent_fid, &volatile_fid,
> - FILE_READ_ATTRIBUTES, FILE_OPEN, 0, 0, &oplock, NULL);
> + FILE_READ_ATTRIBUTES, FILE_SHARE_ALL, FILE_OPEN, 0, 0,
> + &oplock, NULL);
> if (rc)
> return rc;
> buf->f_type = SMB2_MAGIC_NUMBER;
> diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
> index a7e758a..9d8be7d 100644
> --- a/fs/cifs/smb2pdu.c
> +++ b/fs/cifs/smb2pdu.c
> @@ -910,8 +910,8 @@ parse_lease_state(struct smb2_create_rsp *rsp)
> int
> SMB2_open(const unsigned int xid, struct cifs_tcon *tcon, __le16 *path,
> u64 *persistent_fid, u64 *volatile_fid, __u32 desired_access,
> - __u32 create_disposition, __u32 file_attributes, __u32 create_options,
> - __u8 *oplock, struct smb2_file_all_info *buf)
> + __u32 share_access, __u32 create_disposition, __u32 file_attributes,
> + __u32 create_options, __u8 *oplock, struct smb2_file_all_info *buf)
> {
> struct smb2_create_req *req;
> struct smb2_create_rsp *rsp;
> @@ -940,7 +940,7 @@ SMB2_open(const unsigned int xid, struct cifs_tcon *tcon, __le16 *path,
> req->DesiredAccess = cpu_to_le32(desired_access);
> /* File attributes ignored on open (used in create though) */
> req->FileAttributes = cpu_to_le32(file_attributes);
> - req->ShareAccess = FILE_SHARE_ALL_LE;
> + req->ShareAccess = cpu_to_le32(share_access);
> req->CreateDisposition = cpu_to_le32(create_disposition);
> req->CreateOptions = cpu_to_le32(create_options);
> uni_path_len = (2 * UniStrnlen((wchar_t *)path, PATH_MAX)) + 2;
> diff --git a/fs/cifs/smb2proto.h b/fs/cifs/smb2proto.h
> index 7d25f8b..f836a0b 100644
> --- a/fs/cifs/smb2proto.h
> +++ b/fs/cifs/smb2proto.h
> @@ -82,9 +82,10 @@ extern int smb2_create_hardlink(const unsigned int xid, struct cifs_tcon *tcon,
>
> extern int smb2_open_file(const unsigned int xid, struct cifs_tcon *tcon,
> const char *full_path, int disposition,
> - int desired_access, int create_options,
> - struct cifs_fid *fid, __u32 *oplock,
> - FILE_ALL_INFO *buf, struct cifs_sb_info *cifs_sb);
> + int desired_access, int share_access,
> + int create_options, struct cifs_fid *fid,
> + __u32 *oplock, FILE_ALL_INFO *buf,
> + struct cifs_sb_info *cifs_sb);
> extern void smb2_set_oplock_level(struct cifsInodeInfo *cinode, __u32 oplock);
> extern int smb2_unlock_range(struct cifsFileInfo *cfile,
> struct file_lock *flock, const unsigned int xid);
> @@ -104,9 +105,10 @@ extern int SMB2_tcon(const unsigned int xid, struct cifs_ses *ses,
> extern int SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon);
> extern int SMB2_open(const unsigned int xid, struct cifs_tcon *tcon,
> __le16 *path, u64 *persistent_fid, u64 *volatile_fid,
> - __u32 desired_access, __u32 create_disposition,
> - __u32 file_attributes, __u32 create_options,
> - __u8 *oplock, struct smb2_file_all_info *buf);
> + __u32 desired_access, __u32 share_access,
> + __u32 create_disposition, __u32 file_attributes,
> + __u32 create_options, __u8 *oplock,
> + struct smb2_file_all_info *buf);
> extern int SMB2_close(const unsigned int xid, struct cifs_tcon *tcon,
> u64 persistent_file_id, u64 volatile_file_id);
> extern int SMB2_flush(const unsigned int xid, struct cifs_tcon *tcon,
> --
> 1.8.1.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo(a)vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Jan. 30, 2013
Re: [PATCH v2 3/8] vfs: Add O_DENYREAD/WRITE flags support for open syscall
by J. Bruce Fields
On Thu, Jan 17, 2013 at 08:52:59PM +0400, Pavel Shilovsky wrote:
> If O_DENYMAND flag is specified, O_DENYREAD/WRITE/MAND flags are
> translated to flock's flags:
>
> !O_DENYREAD -> LOCK_READ
> !O_DENYWRITE -> LOCK_WRITE
> O_DENYMAND -> LOCK_MAND
>
> and set through flock_lock_file on a file.
>
> This change only affects opens that use O_DENYMAND flag - all other
> native Linux opens don't care about these flags. It allow us to
> enable this feature for applications that need it (e.g. NFS and
> Samba servers that export the same directory for Windows clients,
> or Wine applications that access the same files simultaneously).
The use of an is_conflict callback seems unnecessarily convoluted.
If we need two different behaviors, let's just use another flag (or an
extra boolean argument if we need to, or something).
The only caller for this new deny_lock_file is in the nfs code--I'm a
little unclear why that is.
--b.
>
> Signed-off-by: Pavel Shilovsky <piastry(a)etersoft.ru>
> ---
> fs/locks.c | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++--
> fs/namei.c | 10 ++++-
> include/linux/fs.h | 6 +++
> 3 files changed, 118 insertions(+), 4 deletions(-)
>
> diff --git a/fs/locks.c b/fs/locks.c
> index 9edfec4..ebe9a30 100644
> --- a/fs/locks.c
> +++ b/fs/locks.c
> @@ -605,12 +605,86 @@ static int posix_locks_conflict(struct file_lock *caller_fl, struct file_lock *s
> return (locks_conflict(caller_fl, sys_fl));
> }
>
> -/* Determine if lock sys_fl blocks lock caller_fl. FLOCK specific
> +static unsigned int
> +deny_flags_to_cmd(unsigned int flags)
> +{
> + unsigned int cmd = LOCK_MAND;
> +
> + if (!(flags & O_DENYREAD))
> + cmd |= LOCK_READ;
> + if (!(flags & O_DENYWRITE))
> + cmd |= LOCK_WRITE;
> +
> + return cmd;
> +}
> +
> +/*
> + * locks_mand_conflict - Determine if there's a share reservation conflict
> + * @caller_fl: lock we're attempting to acquire
> + * @sys_fl: lock already present on system that we're checking against
> + *
> + * Check to see if there's a share_reservation conflict. LOCK_READ/LOCK_WRITE
> + * tell us whether the reservation allows other readers and writers.
> + *
> + * We only check against other LOCK_MAND locks, so applications that want to
> + * use share mode locking will only conflict against one another. "normal"
> + * applications that open files won't be affected by and won't themselves
> + * affect the share reservations.
> + */
> +static int
> +locks_mand_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
> +{
> + unsigned char caller_type = caller_fl->fl_type;
> + unsigned char sys_type = sys_fl->fl_type;
> + fmode_t caller_fmode = caller_fl->fl_file->f_mode;
> + fmode_t sys_fmode = sys_fl->fl_file->f_mode;
> +
> + /* they can only conflict if they're both LOCK_MAND */
> + if (!(caller_type & LOCK_MAND) || !(sys_type & LOCK_MAND))
> + return 0;
> +
> + if (!(caller_type & LOCK_READ) && (sys_fmode & FMODE_READ))
> + return 1;
> + if (!(caller_type & LOCK_WRITE) && (sys_fmode & FMODE_WRITE))
> + return 1;
> + if (!(sys_type & LOCK_READ) && (caller_fmode & FMODE_READ))
> + return 1;
> + if (!(sys_type & LOCK_WRITE) && (caller_fmode & FMODE_WRITE))
> + return 1;
> +
> + return 0;
> +}
> +
> +/*
> + * Determine if lock sys_fl blocks lock caller_fl. O_DENY* flags specific
> + * checking before calling the locks_conflict().
> + */
> +static int
> +deny_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
> +{
> + /*
> + * FLOCK locks referring to the same filp do not conflict with
> + * each other.
> + */
> + if (!IS_FLOCK(sys_fl))
> + return 0;
> + if ((caller_fl->fl_type & LOCK_MAND) || (sys_fl->fl_type & LOCK_MAND))
> + return locks_mand_conflict(caller_fl, sys_fl);
> + if (caller_fl->fl_file == sys_fl->fl_file)
> + return 0;
> +
> + return locks_conflict(caller_fl, sys_fl);
> +}
> +
> +/*
> + * Determine if lock sys_fl blocks lock caller_fl. FLOCK specific
> * checking before calling the locks_conflict().
> */
> -static int flock_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
> +static int
> +flock_locks_conflict(struct file_lock *caller_fl, struct file_lock *sys_fl)
> {
> - /* FLOCK locks referring to the same filp do not conflict with
> + /*
> + * FLOCK locks referring to the same filp do not conflict with
> * each other.
> */
> if (!IS_FLOCK(sys_fl) || (caller_fl->fl_file == sys_fl->fl_file))
> @@ -789,6 +863,32 @@ out:
> return error;
> }
>
> +/*
> + * Determine if a file is allowed to be opened with specified access and deny
> + * modes. Lock the file and return 0 if checks passed, otherwise return a error
> + * code.
> + */
> +int
> +deny_lock_file(struct file *filp)
> +{
> + struct file_lock *lock;
> + int error = 0;
> +
> + if (!(filp->f_flags & O_DENYMAND))
> + return error;
> +
> + error = flock_make_lock(filp, &lock, deny_flags_to_cmd(filp->f_flags));
> + if (error)
> + return error;
> +
> + error = flock_lock_file(filp, lock, deny_locks_conflict);
> + if (error == -EAGAIN)
> + error = -ETXTBSY;
> +
> + locks_free_lock(lock);
> + return error;
> +}
> +
> static int __posix_lock_file(struct inode *inode, struct file_lock *request, struct file_lock *conflock)
> {
> struct file_lock *fl;
> diff --git a/fs/namei.c b/fs/namei.c
> index 5f4cdf3..bf3bb34 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -2569,9 +2569,14 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
> * here.
> */
> error = may_open(&file->f_path, acc_mode, open_flag);
> - if (error)
> + if (error) {
> fput(file);
> + goto out;
> + }
>
> + error = deny_lock_file(file);
> + if (error)
> + fput(file);
> out:
> dput(dentry);
> return error;
> @@ -2908,6 +2913,9 @@ opened:
> if (error)
> goto exit_fput;
> }
> + error = deny_lock_file(file);
> + if (error)
> + goto exit_fput;
> out:
> if (got_write)
> mnt_drop_write(nd->path.mnt);
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 70a766ae..b8ed06e 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1004,6 +1004,7 @@ extern int lease_modify(struct file_lock **, int);
> extern int lock_may_read(struct inode *, loff_t start, unsigned long count);
> extern int lock_may_write(struct inode *, loff_t start, unsigned long count);
> extern void locks_delete_block(struct file_lock *waiter);
> +extern int deny_lock_file(struct file *);
> extern void lock_flocks(void);
> extern void unlock_flocks(void);
> #else /* !CONFIG_FILE_LOCKING */
> @@ -1152,6 +1153,11 @@ static inline void locks_delete_block(struct file_lock *waiter)
> {
> }
>
> +static inline int deny_lock_file(struct file *filp)
> +{
> + return 0;
> +}
> +
> static inline void lock_flocks(void)
> {
> }
> --
> 1.8.1.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo(a)vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Jan. 30, 2013
Re: [PATCH v2 0/8] Add O_DENY* support for VFS and CIFS/NFS
by J. Bruce Fields
On Thu, Jan 17, 2013 at 08:52:09PM +0400, Pavel Shilovsky wrote:
> This patchset adds support of O_DENY* flags for Linux fs layer. These flags can be used by any application that needs share reservations to organize a file access. VFS already has some sort of this capability - now it's done through flock/LOCK_MAND mechanis, but that approach is non-atomic. This patchset build new capabilities on top of the existing one but doesn't bring any changes into the flock call semantic.
>
> These flags can be used by NFS (built-in-kernel) and CIFS (Samba) servers and Wine applications through VFS (for local filesystems) or CIFS/NFS modules. This will help when e.g. Samba and NFS server share the same directory for Windows and Linux users or Wine applications use Samba/NFS share to access the same data from different clients.
>
> According to the previous discussions the most problematic question is how to prevent situations like DoS attacks where e.g /lib/liba.so file can be open with DENYREAD, or smth like this. That's why one extra flag O_DENYMAND is added. It indicates to underlying layer that an application want to use O_DENY* flags semantic. It allows us not affect native Linux applications (that don't use O_DENYMAND flag) - so, these flags (and the semantic of open syscall that they bring) are used only for those applications that really want it proccessed that way.
Maybe that's good enough. A mount flag might be simpler and give
consistent enforcement for all users.
>
> So, we have four new flags:
> O_DENYREAD - to prevent other opens with read access,
> O_DENYWRITE - to prevent other opens with write access,
> O_DENYDELETE - to prevent delete operations (this flag is not implemented in VFS and NFS part and only suitable for CIFS module),
> O_DENYMAND - to switch on/off three flags above.
It would be useful to have some really careful documentation of how
these are meant to work. Maybe try updating the open man page?
--b.
>
> The #1 patch bring infrastructure to let us add this capability easier. #2 patch adds flags to fcntl while #3 patch implement VFS part. Patches #4, #5, #6 are related to CIFS-specific changes. #7 and #8 describe NFS and NFSD parts.
>
> Also, I created the preliminary patch for Samba that replaces the existing use of flock/LOCK_MAND mechanism with O_DENY* flags:
> http://git.etersoft.ru/people/piastry/packages/?p=samba.git;a=commitdiff;h=…
>
> Pavel Shilovsky (8):
> locks: make flock_lock_file take is_conflict callback parm
> fcntl: Introduce new O_DENY* open flags
> vfs: Add O_DENYREAD/WRITE flags support for open syscall
> CIFS: Add O_DENY* open flags support
> CIFS: Use NT_CREATE_ANDX command for forcemand mounts
> CIFS: Translate SHARING_VIOLATION to -ETXTBSY error code for SMB2
> NFSv4: Add O_DENY* open flags support
> NFSD: Pass share reservations flags to VFS
>
> fs/cifs/cifsacl.c | 10 ++--
> fs/cifs/cifsglob.h | 12 +++-
> fs/cifs/cifsproto.h | 9 +--
> fs/cifs/cifssmb.c | 47 ++++++++-------
> fs/cifs/dir.c | 14 +++--
> fs/cifs/file.c | 18 ++++--
> fs/cifs/inode.c | 11 ++--
> fs/cifs/link.c | 10 ++--
> fs/cifs/readdir.c | 2 +-
> fs/cifs/smb1ops.c | 15 ++---
> fs/cifs/smb2file.c | 10 ++--
> fs/cifs/smb2inode.c | 4 +-
> fs/cifs/smb2maperror.c | 2 +-
> fs/cifs/smb2ops.c | 10 ++--
> fs/cifs/smb2pdu.c | 6 +-
> fs/cifs/smb2proto.h | 14 +++--
> fs/fcntl.c | 5 +-
> fs/locks.c | 121 ++++++++++++++++++++++++++++++++++++---
> fs/namei.c | 10 +++-
> fs/nfs/nfs4xdr.c | 24 ++++++--
> fs/nfsd/nfs4state.c | 46 ++++++++++++++-
> include/linux/fs.h | 6 ++
> include/uapi/asm-generic/fcntl.h | 14 +++++
> 23 files changed, 324 insertions(+), 96 deletions(-)
>
> --
> 1.8.1.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
> the body of a message to majordomo(a)vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
Jan. 30, 2013
Re: Makedll.rules.in: Explicitly specify DLL name when building importlib
by Alexandre Julliard
Jacek Caban <jacek(a)codeweavers.com> writes:
> ---
> dlls/Makedll.rules.in | 6 +++---
> 1 file changed, 3 insertions(+), 3 deletions(-)
Why do you need this?
--
Alexandre Julliard
julliard(a)winehq.org
Jan. 30, 2013
[PATCH for valgrind] coregrind: implement GS override for arch_prctl on linux
by Maarten Lankhorst
Allows wine64 to run in valgrind! Apply with -Np0. :D
Yes I know that %gs is still zero on linux amd64. Details details..
Signed-off-by: Maarten Lankhorst <maarten.lankhorst(a)ubuntu.com>
---
Index: coregrind/m_translate.c
===================================================================
--- coregrind/m_translate.c (revision 13279)
+++ coregrind/m_translate.c (working copy)
@@ -1486,7 +1486,7 @@
# if defined(VGP_amd64_linux)
vex_abiinfo.guest_amd64_assume_fs_is_zero = True;
# endif
-# if defined(VGP_amd64_darwin)
+# if defined(VGP_amd64_darwin) || defined(VGP_amd64_linux)
vex_abiinfo.guest_amd64_assume_gs_is_0x60 = True;
# endif
# if defined(VGP_ppc32_linux)
Index: coregrind/m_syswrap/syswrap-amd64-linux.c
===================================================================
--- coregrind/m_syswrap/syswrap-amd64-linux.c (revision 13279)
+++ coregrind/m_syswrap/syswrap-amd64-linux.c (working copy)
@@ -564,6 +564,16 @@
*(unsigned long *)ARG2 = tst->arch.vex.guest_FS_ZERO;
POST_MEM_WRITE(ARG2, sizeof(unsigned long));
}
+ else if (ARG1 == VKI_ARCH_SET_GS) {
+ tst = VG_(get_ThreadState)(tid);
+ tst->arch.vex.guest_GS_0x60 = ARG2;
+ }
+ else if (ARG1 == VKI_ARCH_GET_GS) {
+ PRE_MEM_WRITE("arch_prctl(addr)", ARG2, sizeof(unsigned long));
+ tst = VG_(get_ThreadState)(tid);
+ *(unsigned long *)ARG2 = tst->arch.vex.guest_GS_0x60;
+ POST_MEM_WRITE(ARG2, sizeof(unsigned long));
+ }
else {
VG_(core_panic)("Unsupported arch_prtctl option");
}
Jan. 30, 2013