[Samba] dmapi doesn't work on aix; possible fix included
J Raynor
raynorj at mn.rr.com
Tue Oct 31 05:02:48 GMT 2006
Below is an updated patch. I did test it, and it worked fine.
*** dmapi.c.orig Sat Oct 28 11:19:04 2006
--- dmapi.c Mon Oct 30 22:26:00 2006
***************
*** 246,252 ****
DEBUG(DMAPI_TRACE, ("dm_path_to_handle(%s): %s\n",
path, strerror(errno)));
! if (errno != EPERM) {
return 0;
}
--- 246,252 ----
DEBUG(DMAPI_TRACE, ("dm_path_to_handle(%s): %s\n",
path, strerror(errno)));
! if (errno != EPERM && errno != EACCES) {
return 0;
}
***************
*** 259,266 ****
--- 259,275 ----
set_effective_capability(DMAPI_ACCESS_CAPABILITY);
+ #if !defined(HAVE_POSIX_CAPABILITIES)
+ become_root();
+ #endif
+
err = dm_path_to_handle(CONST_DISCARD(char *, path),
&dm_handle, &dm_handle_len);
+
+ #if !defined(HAVE_POSIX_CAPABILITIES)
+ unbecome_root();
+ #endif
+
if (err < 0) {
DEBUG(DMAPI_TRACE,
("retrying dm_path_to_handle(%s): %s\n",
***************
*** 269,276 ****
--- 278,294 ----
}
}
+ #if !defined(HAVE_POSIX_CAPABILITIES)
+ become_root();
+ #endif
+
err = dm_get_eventlist(dmapi_session, dm_handle, dm_handle_len,
DM_NO_TOKEN, DM_EVENT_MAX, &events, &nevents);
+
+ #if !defined(HAVE_POSIX_CAPABILITIES)
+ unbecome_root();
+ #endif
+
if (err < 0) {
DEBUG(DMAPI_TRACE, ("dm_get_eventlist(%s): %s\n",
path, strerror(errno)));
James Peach wrote:
> On 29/10/06, J Raynor <raynorj at mn.rr.com> wrote:
>
>> I'm running samba 3.0.23c on aix 5.3 TL4. I'm using Tivoli HSM 5.3.4.0
>> on a JFS2 filesystem. Samba compiled fine, and I set "dmapi support =
>> yes" in smb.conf, but samba wouldn't recognize offline files ("migrated
>> files" in tsm terminology). After setting a higher log level I think
>> I've tracked down the problem. The patch is at the bottom of this email.
>>
>> The first problem is this snippet in dmapi_file_flags() in smbd/dmapi.c:
>>
>> err = dm_path_to_handle(CONST_DISCARD(char *, path),
>> &dm_handle, &dm_handle_len);
>> if (err < 0) {
>> DEBUG(DMAPI_TRACE, ("dm_path_to_handle(%s): %s\n",
>> path, strerror(errno)));
>>
>> if (errno != EPERM) {
>> return 0;
>> }
>>
>>
>>
>> On AIX, dm_path_to_handle() is returning EACCES instead of EPERM, so it
>> hits the return 0. Is EPERM supposed to be the only allowed error, or
>> is this something that's likely implementation dependent?
>
>
> This code was originally written for Linux and IRIX. IIRC in Linux there
> was
> a problem where the process capabilities were reset across fork() because
> Samba changes its effective user ID. So when we get a permission error
> we go back and try to re-acquire our capabilities.
>
>> Changing the if-condition to (errno != EPERM && errno != EACCES) lets
>> things continue on. The rest of the problem in dmapi_file_flags() is
>> that things are running with the effective uid of the user, so dmapi
>> calls are failing. The posix capability DMAPI_ACCESS_CAPABILITY is
>
>
> Note that DMAPI_ACCESS_CAPABILITY is not a real capability, it's just
> a name for whatever capability set is needed to do DMAPI operations on
> the current platform.
>
>> supposed to allow the functions to work, but to my knowledge AIX doesn't
>> have posix capabilties.
>
>
> This is well beyond my knowledge of AIX. I used capabilities for this,
> rather than
> (un)become_root for performance reasons. If there's no other way to
> achieve the
> functionality, then I guess this is fine.
>
> I'd prefer a feature-based test for whether this is necessary, rather
> than a platform-
> based test. Something like
>
> #if !defined(HAVE_POSIX_CAPABILITIES)
> become_root();
> #endif
>
>> I used become_root/unbecome_root around the dmapi calls, and this
>> appeared to get things to work. Samba's log messages are indicating
>> that files are offline, and Windows Explorer is picking up on this and
>> changing the file icons to indicate that the files are offline. However,
>> I don't know if my solution is entirely correct. Here's the patch:
>>
>>
>>
>>
>> *** dmapi.c.orig Sat Oct 28 02:33:13 2006
>> --- dmapi.c Sat Oct 28 11:12:54 2006
>> ***************
>> *** 246,252 ****
>> DEBUG(DMAPI_TRACE, ("dm_path_to_handle(%s): %s\n",
>> path, strerror(errno)));
>>
>> ! if (errno != EPERM) {
>> return 0;
>> }
>>
>> --- 246,252 ----
>> DEBUG(DMAPI_TRACE, ("dm_path_to_handle(%s): %s\n",
>> path, strerror(errno)));
>>
>> ! if (errno != EPERM && errno != EACCES) {
>> return 0;
>> }
>>
>> ***************
>> *** 259,266 ****
>> --- 259,274 ----
>>
>> set_effective_capability(DMAPI_ACCESS_CAPABILITY);
>>
>> + #ifdef AIX
>> + become_root();
>> + #endif
>> +
>> err = dm_path_to_handle(CONST_DISCARD(char *, path),
>> &dm_handle, &dm_handle_len);
>> +
>> + #ifdef AIX
>> + unbecome_root();
>> + #endif
>> if (err < 0) {
>> DEBUG(DMAPI_TRACE,
>> ("retrying dm_path_to_handle(%s): %s\n",
>> ***************
>> *** 269,276 ****
>> --- 277,293 ----
>> }
>> }
>>
>> + #ifdef AIX
>> + become_root();
>> + #endif
>> +
>> err = dm_get_eventlist(dmapi_session, dm_handle, dm_handle_len,
>> DM_NO_TOKEN, DM_EVENT_MAX, &events, &nevents);
>> +
>> + #ifdef AIX
>> + unbecome_root();
>> + #endif
>> +
>> if (err < 0) {
>> DEBUG(DMAPI_TRACE, ("dm_get_eventlist(%s): %s\n",
>> path, strerror(errno)));
>>
>>
>>
>>
>> --
>> To unsubscribe from this list go to the following URL and read the
>> instructions: https://lists.samba.org/mailman/listinfo/samba
>>
>
>
More information about the samba
mailing list