All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kern Sibbald <kern@sibbald.com>
To: Kai Makisara <Kai.Makisara@kolumbus.fi>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	linux-scsi@vger.kernel.org, Willem Riede <wrlk@riede.org>
Subject: Re: Linux tape drivers
Date: Thu, 5 Apr 2007 10:32:44 +0200	[thread overview]
Message-ID: <200704051032.45249.kern@sibbald.com> (raw)
In-Reply-To: <Pine.LNX.4.64.0704050016010.8139@kai.makisara.local>

On Wednesday 04 April 2007 23:54, Kai Makisara wrote:
> On Wed, 4 Apr 2007, Kern Sibbald wrote:
> 
> > On Wednesday 04 April 2007 20:46, Kai Makisara wrote:
> ...
> > > > >   c. There is a real lack of information about any error condition
> > > > >       (read/write). One can probably get it via direct SCSI 
commands, 
> > but
> > > > >       why not through an ioctl.
> > > 
> > > This is true. The problem is what and how to tell the user so that the 
> > > solution is satisfactory for a reasonable number of years. The solutions 
I 
> > > have thought about have not passed this test. One alternative is to pass 
> > > the latest sense data to the user but thinking about the different error 
> > > conditions, this is a problematic choice. Here also suggestions from and 
> > > discussion with real users is needed.
> > 
> > Well, you have in front of you a "real" user.
> 
> Yes, you are one of the people I meant with "real users".

OK, I'll address this issue in my "second" description that I mention below.

> 
> >                                               I was thinking about a new 
> > ioctl() that would hopefully be simple, generic, and extensible enough 
that 
> > it might be picked up by all Unixes. This is one case were even if it is a 
> > Linux only solution, I will be really happy. Basically, when I get a -1 
> > return from a read/write and ERRNO=EIO, I would like to be able to call an 
> > ioctl() and get back some basic info about soft errors, hard errors, ...  
If 
> > you don't tell me that a new ioctl() is out of the question, I'll make a 
> > proposal -- it will take me some time to put it together.
> > 
> The general attitude seems to be against new ioctls but I don't want to 
> rule out that. The mt interface already uses ioctls and they solve the 
> serialisation problem nicely in this case.
> 
> Whatever the method of delivery will be, the most difficult question is 
> the contents and format. I don't know any good examples from other 
> systems, so it has to be Linux-specific (and hopefully adopted by others 
> as you say). I will wait with interest for your suggestion.

OK, I don't think that I have the knowledge of the kernel to be able to make a 
specific proposal, but I will do the following (unless someone suggests 
otherwise).  

First explain to everyone the pains that were caused with the O_NONBLOCK 
change to opening tape drives.  I don't imagine we will go back to the old 
behavior, but I hope something similar won't happen again, and will propose 
how a slight change in philosophy could have created less chaos.  This I can 
do in the next few days.

Second, I can describe what would be a reasonably complete tape interface from 
the applications programmers point of view (i.e. Bacula), and how I think we 
might get there given your input above -- my basic premise is that there does 
not exist any real Unix tape API, but rather a whole slew of different ioctls 
on different systems, making applications programming difficult.  I think we 
need a real Unix tape API, but not necessarily a lot more ioctls.  This will 
take at least a week (I think).

> 
> ...
> > > > >    e. Apparently only root can do the following (IMO, this is a bug 
or 
> > > > >        programming oversight): 
> > > > > 
> > > > >          struct mtop mt;
> > > > >          mt.mt_op = MTSETDRVBUFFER;
> > > > >          mt.mt_count = MT_ST_CLEARBOOLEANS;
> > > > >          mt.mt_count |= MT_ST_FAST_MTEOM;
> > > > >          ...
> > > > >          ioctl(fd, MIOCTOP, &mt);
> > > > > 
> > > > >       Typically Bacula runs tape daemon as non-root.  Is there a 
good 
> > reason 
> > > > >        why program that has write permission on the device cannot do 
> > this
> > > > >        ioctl() and is it possible to change this?
> > > > > 
> > > This is not a bug or an oversight, it is a design decision. The idea is 
> > > that the system provides the same view of the tape to all users. This 
view 
> > > is defined by the system manager (probably with startup scripts). If 
each 
> > > user can change the behaviour, the next user never knows what to expect. 
> > 
> > Well, I agree that all users should have the same view.  However, when 
Bacula 
> > has the drive open, it has it open exclusively, so no other users can view 
> > the drive. When Bacula opens the drive, it should be able to ensure that 
the 
> > drive, agrees with Bacula's concept of the drive.  When Bacula closes the 
> > drive, I have no problem if the OS resets values to the common view.  
Today, 
> > if Bacula is running as bacula:disk rather than root:root, it cannot make 
the 
> > above changes, even if the disk group has write access to the drive.
> 
> OK. I have not thought about this properly but one possible solution might
> be something like this:
> - separate the current and permanent behaviour flags; the current flags 
>   define the behaviour
> - the permanent flags are copied into the current flags when the device is
>   opened (or at some other well-defined point)
> - the booleans set with MTSETDRVBUFFER change always the current flags; if
>   the user has CAP_SYS_ADMIN, also the permanent flags are changed
> 
> This would enable anyone to change the behaviour for his/her own purposes 
> but there would still be a stable system-defined behaviour. There already 
> are attributes that have a current and default value like block size.
> 
> I can see several problems in the details of this suggestion but I will 
> think about those. One is that if someone having CAP_SYS_ADMIN wants just 
> a temporary change, it is not possible. A solution would to have a new 
> op code for temporary changes but this would require explicit changes to 
> programs. Comments are welcome.

The above would solve the problem for me.  

Today, when root (or someone having CAP_SYS_ADMIN) does a MTSETDRVBUFFER, 
doesn't it alter the permanent flags? I think we should look at how the other 
flags are set under various permissions and try to get the MTSETDRVBUFFER to 
follow the same rules.  

The basic problem I see with MTSETDRVBUFFER is that it requires CAP_SYS_ADMIN, 
while the other ones (e.g. MTSETBLK) do not (i.e. an inconsistency).  If they 
all work the same and permit changes without CAP_SYS_ADMIN, then the rules 
will be much easier for everyone to understand.

> 
> ...
> > > Strictly speaking MTSETDRVBUFFER does not need root privileges. It needs 
> > > CAP_SYS_ADMIN. (Now I see that the error message is misleading and must 
be 
> > > fixed.) Does using some other capability make your use easier but, at 
same 
> > > time, limit the access to this command to a selected group of users?
> > 
> > Being relatively ignorant of the kernel, I wasn't aware of CAP_SYS_ADMIN.  
I 
> > now have a rough idea of what it is, I am unsure if another capability 
would 
> > resolve the problem, because I'm not familar with how they are set.  
> > 
> Yes, setting the capabilities may be a problem. I don't know how well the 
> different distributions are able to handle these finer-grained rights. 
> A software package has to support ideally all distributions and the common 
> denominator may be to be root for CAP_SYS_ADMIN ;-)

To the best of my knowledge Linux is the only system that requires root; this 
is true at least for the values that Bacula sets.  I've only been adding such 
OS dependent functions for a year or so to attempt to reduce support problems 
(i.e. making Bacula "self-configure" tape drives to a limited extent). 
Requiring root permission to configure the tape drive is for Bacula a 
security problem and thus probably not the best solution.

> 
> > It seems to me that anyone who is the "owner" or in the "group" and has 
write 
> > permission on the device should be able to do MTSETDRVBUFFER.  There is no 
> > need for any "other" who has write permission to have such access. I think 
> > this would allow the sys admin to restrict it appropriately.
> > 
> This would be one solution but it sounds complicated. The primary test for 
> a file is just if there is write access or not. It does not matter if the 
> access right comes as user, group, or other.

Yes, I can see that would be complicated, and probably not possible, but from 
an applications (my) stand point, it seems reasonable.

> 
> > 
> > Thanks for your responses.  I see I have some work to do organizing my 
> > thoughts :-)
> 
> Thanks for your input.
> 
> -- 
> Kai
> 

      reply	other threads:[~2007-04-05  8:33 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <200704031508.37222.kern@sibbald.com>
2007-04-03 20:39 ` Linux tape drivers Andrew Morton
2007-04-03 21:30   ` Kern Sibbald
2007-04-03 21:57     ` Andrew Morton
2007-04-03 22:15       ` James Bottomley
2007-04-04  3:00       ` Willem Riede
2007-04-04 14:26         ` Kern Sibbald
2007-04-04 18:55           ` Andrew Morton
2007-04-04 19:21             ` Kern Sibbald
2007-04-04 20:37               ` Andrew Morton
2007-04-04 19:22             ` Willem Riede
2007-04-04 20:39               ` Andrew Morton
2007-04-04 21:31                 ` Bartlomiej Zolnierkiewicz
2007-04-04 21:43                   ` Andrew Morton
2007-04-04 18:46   ` Kai Makisara
2007-04-04 19:50     ` Douglas Gilbert
2007-04-04 20:58     ` Kern Sibbald
2007-04-04 21:54       ` Kai Makisara
2007-04-05  8:32         ` Kern Sibbald [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200704051032.45249.kern@sibbald.com \
    --to=kern@sibbald.com \
    --cc=Kai.Makisara@kolumbus.fi \
    --cc=akpm@linux-foundation.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=wrlk@riede.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.