[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 3/8] trans/mtab: properly lock mtab objects
From: |
Samuel Thibault |
Subject: |
Re: [PATCH 3/8] trans/mtab: properly lock mtab objects |
Date: |
Sun, 12 Jan 2014 20:49:54 +0100 |
User-agent: |
Mutt/1.5.21+34 (58baf7c9f32f) (2010-12-30) |
Ack
Justus Winter, le Sun 12 Jan 2014 20:08:40 +0100, a écrit :
> * trans/mtab.c (struct mtab): Add lock.
> (open_hook): Initialize lock.
> (close_hook): Destroy lock.
> (trivfs_S_io_read): Lock mtab object, adjust error handling accordingly.
> (trivfs_S_io_seek): Likewise.
> (trivfs_S_io_readable): Likewise.
> ---
> trans/mtab.c | 44 ++++++++++++++++++++++++++++++++------------
> 1 file changed, 32 insertions(+), 12 deletions(-)
>
> diff --git a/trans/mtab.c b/trans/mtab.c
> index 0bcd52b..5a5a07d 100644
> --- a/trans/mtab.c
> +++ b/trans/mtab.c
> @@ -27,6 +27,7 @@
> #include <hurd/trivfs.h>
> #include <inttypes.h>
> #include <mntent.h>
> +#include <pthread.h>
> #include <stdlib.h>
> #include <stdio.h>
> #include <string.h>
> @@ -47,6 +48,7 @@ struct trivfs_control *control;
> They keep track of the content and file position of the client. */
> struct mtab
> {
> + pthread_mutex_t lock;
> char *contents;
> size_t contents_len;
> off_t offs;
> @@ -569,6 +571,7 @@ open_hook (struct trivfs_peropen *peropen)
> peropen->hook = mtab;
>
> /* Initialize the fields. */
> + pthread_mutex_init (&mtab->lock, NULL);
> mtab->offs = 0;
> mtab->contents = NULL;
> mtab->contents_len = 0;
> @@ -602,8 +605,10 @@ open_hook (struct trivfs_peropen *peropen)
> static void
> close_hook (struct trivfs_peropen *peropen)
> {
> - free (((struct mtab *) peropen->hook)->contents);
> - free (peropen->hook);
> + struct mtab *op = peropen->hook;
> + pthread_mutex_destroy (&op->lock);
> + free (op->contents);
> + free (op);
> }
>
> /* Read data from an IO object. If offset is -1, read from the object
> @@ -615,6 +620,7 @@ trivfs_S_io_read (struct trivfs_protid *cred,
> char **data, mach_msg_type_number_t *data_len,
> loff_t offs, mach_msg_type_number_t amount)
> {
> + error_t err = 0;
> struct mtab *op;
>
> /* Deny access if they have bad credentials. */
> @@ -626,12 +632,13 @@ trivfs_S_io_read (struct trivfs_protid *cred,
>
> /* Get the offset. */
> op = cred->po->hook;
> + pthread_mutex_lock (&op->lock);
>
> if (op->contents == NULL)
> {
> - error_t err = mtab_populate (op, target_path, insecure);
> + err = mtab_populate (op, target_path, insecure);
> if (err)
> - return err;
> + goto out;
> }
>
> if (offs == -1)
> @@ -650,7 +657,10 @@ trivfs_S_io_read (struct trivfs_protid *cred,
> {
> *data = mmap (0, amount, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
> if (*data == MAP_FAILED)
> - return ENOMEM;
> + {
> + err = ENOMEM;
> + goto out;
> + }
> }
>
> /* Copy the constant data into the buffer. */
> @@ -661,7 +671,9 @@ trivfs_S_io_read (struct trivfs_protid *cred,
> }
>
> *data_len = amount;
> - return 0;
> + out:
> + pthread_mutex_unlock (&op->lock);
> + return err;
> }
>
>
> @@ -671,16 +683,18 @@ trivfs_S_io_seek (struct trivfs_protid *cred,
> mach_port_t reply, mach_msg_type_name_t reply_type,
> off_t offs, int whence, off_t *new_offs)
> {
> + error_t err = 0;
> if (! cred)
> return EOPNOTSUPP;
>
> struct mtab *op = cred->po->hook;
> + pthread_mutex_lock (&op->lock);
>
> if (op->contents == NULL)
> {
> - error_t err = mtab_populate (op, target_path, insecure);
> + err = mtab_populate (op, target_path, insecure);
> if (err)
> - return err;
> + goto out;
> }
>
> switch (whence)
> @@ -698,10 +712,12 @@ trivfs_S_io_seek (struct trivfs_protid *cred,
> break;
> }
> default:
> - return EINVAL;
> + err = EINVAL;
> }
>
> - return 0;
> + out:
> + pthread_mutex_unlock (&op->lock);
> + return err;
> }
>
> /* If this variable is set, it is called every time a new peropen
> @@ -720,6 +736,7 @@ trivfs_S_io_readable (struct trivfs_protid *cred,
> mach_port_t reply, mach_msg_type_name_t replytype,
> mach_msg_type_number_t *amount)
> {
> + error_t err = 0;
> if (!cred)
> return EOPNOTSUPP;
>
> @@ -727,16 +744,19 @@ trivfs_S_io_readable (struct trivfs_protid *cred,
> return EINVAL;
>
> struct mtab *op = cred->po->hook;
> + pthread_mutex_lock (&op->lock);
>
> if (op->contents == NULL)
> {
> error_t err = mtab_populate (op, target_path, insecure);
> if (err)
> - return err;
> + goto out;
> }
>
> *amount = op->contents_len - op->offs;
> - return 0;
> + out:
> + pthread_mutex_unlock (&op->lock);
> + return err;
> }
>
> /* SELECT_TYPE is the bitwise OR of SELECT_READ, SELECT_WRITE, and
> SELECT_URG.
> --
> 1.8.5.2
>
--
Samuel
<N> je déteste import
<N> parce que lorsque tu fais du python et que tu oublies le #!/bin/env python
et que tu mets le fichier exécutable
<N> import est exécuté
-+- #ens-mim - pourquoi mon script python change le curseur de la souris ?! -+-
- [PATCH 1/8] trans/mtab: populate mtab objects on demand, Justus Winter, 2014/01/12
- [PATCH 2/8] trans/mtab: remove the loop detection logic, Justus Winter, 2014/01/12
- [PATCH 4/8] trans/mtab: make the translator multithreaded, Justus Winter, 2014/01/12
- [PATCH 3/8] trans/mtab: properly lock mtab objects, Justus Winter, 2014/01/12
- Re: [PATCH 3/8] trans/mtab: properly lock mtab objects,
Samuel Thibault <=
- [PATCH 5/8] trans/mtab: do not include non-filesystem translators by default, Justus Winter, 2014/01/12
- [PATCH 6/8] libfshelp: fix the api of fshelp_set_active_translator, Justus Winter, 2014/01/12
- [PATCH 7/8] libdiskfs: register passive translator startups, Justus Winter, 2014/01/12
- [PATCH 8/8] libnetfs: register passive translator startups, Justus Winter, 2014/01/12
- Re: [PATCH 1/8] trans/mtab: populate mtab objects on demand, Samuel Thibault, 2014/01/12