~ubuntu-branches/ubuntu/vivid/aufs/vivid

« back to all changes in this revision

Viewing changes to fs/aufs/finfo.c

  • Committer: Bazaar Package Importer
  • Author(s): Julian Andres Klode
  • Date: 2007-12-15 23:32:51 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20071215233251-2vgs2lmg8mai5d9e
Tags: 0+20071211-1ubuntu1
* Merge from debian unstable (LP: #175705), remaining changes:
  - Fix for Ubuntu Kernels (updated)
* patches/01_vserver.dpatch: Removed
* patches/06_ubuntu.dpatch: Added (update of ubuntu patch)

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
17
 */
18
18
 
19
 
/* $Id: finfo.c,v 1.25 2007/06/04 02:17:35 sfjro Exp $ */
 
19
/* $Id: finfo.c,v 1.31 2007/10/30 12:52:28 sfjro Exp $ */
20
20
 
21
21
#include "aufs.h"
22
22
 
113
113
 
114
114
void au_hfput(struct aufs_hfile *hf)
115
115
{
 
116
        if (hf->hf_file->f_mode & FMODE_EXEC)
 
117
                au_allow_write_access(hf->hf_file);
116
118
        fput(hf->hf_file);
117
119
        hf->hf_file = NULL;
118
120
        AuDebugOn(!hf->hf_br);
144
146
void au_update_figen(struct file *file)
145
147
{
146
148
        atomic_set(&ftofi(file)->fi_generation, au_digen(file->f_dentry));
 
149
        //smp_mb(); /* atomic_set */
147
150
}
148
151
 
149
 
void au_fin_finfo(struct file *file)
 
152
void au_finfo_fin(struct file *file)
150
153
{
151
154
        struct aufs_finfo *finfo;
152
155
        struct dentry *dentry;
153
156
        aufs_bindex_t bindex, bend;
154
157
 
155
158
        dentry = file->f_dentry;
156
 
        LKTRTrace("%.*s\n", DLNPair(dentry));
 
159
        LKTRTrace("%.*s\n", AuDLNPair(dentry));
157
160
        SiMustAnyLock(dentry->d_sb);
158
161
 
159
162
        fi_write_lock(file);
177
180
 
178
181
        kfree(finfo->fi_hfile);
179
182
        fi_write_unlock(file);
180
 
        cache_free_finfo(finfo);
 
183
        au_cache_free_finfo(finfo);
181
184
        //file->private_data = NULL;
182
185
}
183
186
 
184
 
int au_init_finfo(struct file *file)
 
187
int au_finfo_init(struct file *file)
185
188
{
186
189
        struct aufs_finfo *finfo;
187
190
        struct dentry *dentry;
 
191
        union {
 
192
                void *p;
 
193
                unsigned long ul;
 
194
        } u;
188
195
 
189
196
        dentry = file->f_dentry;
190
 
        LKTRTrace("%.*s\n", DLNPair(dentry));
 
197
        LKTRTrace("%.*s\n", AuDLNPair(dentry));
191
198
        AuDebugOn(!dentry->d_inode);
192
199
 
193
 
        finfo = cache_alloc_finfo();
 
200
        finfo = au_cache_alloc_finfo();
194
201
        if (finfo) {
195
202
                finfo->fi_hfile = kcalloc(sbend(dentry->d_sb) + 1,
196
203
                                          sizeof(*finfo->fi_hfile), GFP_KERNEL);
199
206
                        finfo->fi_bstart = -1;
200
207
                        finfo->fi_bend = -1;
201
208
                        atomic_set(&finfo->fi_generation, au_digen(dentry));
 
209
                        //smp_mb(); /* atomic_set */
 
210
 
 
211
                        /*
 
212
                         * a dirty trick for handling FMODE_EXEC and
 
213
                         * deny_write_access().
 
214
                         * because FMODE_EXEC flag is not passed to
 
215
                         * f_op->open(),
 
216
                         * aufs set it to file->private_data temporary in lookup
 
217
                         * or dentry revalidation operations.
 
218
                         * restore the flag to f_mode here.
 
219
                         */
 
220
                        u.p = file->private_data;
 
221
                        if (u.ul & FMODE_EXEC) {
 
222
                                file->f_mode |= FMODE_EXEC;
 
223
                                smp_mb(); /* flush f_mode */
 
224
                        }
202
225
 
203
226
                        file->private_data = finfo;
204
227
                        return 0; /* success */
205
228
                }
206
 
                cache_free_finfo(finfo);
 
229
                au_cache_free_finfo(finfo);
207
230
        }
208
231
 
209
 
        TraceErr(-ENOMEM);
 
232
        AuTraceErr(-ENOMEM);
210
233
        return -ENOMEM;
211
234
}